From: Egbert Eich <eich@suse.com>
Date: Mon May 27 19:17:51 2024 +0200
Subject: Fixes for file format security issues
Patch-mainline: Upstream
Git-repo: https://github.com/HDFGroup/hdf5
Git-commit: 3ded20acdead217cff59f4ad0b639d71d534132e
References: bsc#1224158


Signed-off-by: Egbert Eich <eich@suse.de>
---
 src/H5Dcompact.c  |  60 +++-
 src/H5Dcontig.c   |  88 ++++--
 src/H5Defl.c      |  63 +++-
 src/H5Dint.c      |  63 ++--
 src/H5Dpkg.h      |   2 +
 src/H5Edefin.h    | 221 +++++++-------
 src/H5Einit.h     | 849 +++++++++++++++++++++++++++---------------------------
 src/H5Epubgen.h   | 398 ++++++++++++-------------
 src/H5Eterm.h     | 227 +++++++--------
 src/H5Gent.c      | 210 +++++---------
 src/H5Glink.c     | 200 ++++++++-----
 src/H5Gloc.c      |  64 +++-
 src/H5Gnode.c     | 124 ++++----
 src/H5Gobj.c      |  15 +-
 src/H5Gpkg.h      |  29 +-
 src/H5Gprivate.h  |   4 +-
 src/H5Gstab.c     |  68 +++--
 src/H5Gtest.c     |   8 +-
 src/H5HG.c        |  20 ++
 src/H5HL.c        |  50 +++-
 src/H5HLcache.c   |   2 +-
 src/H5HLprivate.h |   1 +
 src/H5L.c         |   4 +-
 src/H5Ocache.c    |   4 +
 src/H5Ocopy.c     |   6 +
 src/H5Odtype.c    |  22 ++
 src/H5Oefl.c      |  39 +--
 src/H5Olayout.c   |  33 ++-
 src/H5Opkg.h      |   4 +-
 src/H5Oprivate.h  |   2 +-
 src/H5Osdspace.c  |  13 +-
 src/H5Oshared.c   |  26 +-
 src/H5Oshared.h   |   2 +-
 src/H5Ostab.c     |  19 +-
 src/H5S.c         |  26 ++
 src/H5Spoint.c    |  16 +-
 src/H5Sprivate.h  |  18 +-
 src/H5T.c         | 127 +++++++-
 src/H5Tprivate.h  |   1 +
 src/H5Znbit.c     |  15 +-
 src/H5err.txt     |   1 +
 41 files changed, 1850 insertions(+), 1294 deletions(-)

diff --git a/src/H5Dcompact.c b/src/H5Dcompact.c
index 3b1c309124..d145cc95cf 100644
--- a/src/H5Dcompact.c
+++ b/src/H5Dcompact.c
@@ -52,6 +52,7 @@
 
 /* Layout operation callbacks */
 static herr_t  H5D__compact_construct(H5F_t *f, H5D_t *dset);
+static herr_t  H5D__compact_init(H5F_t *f, const H5D_t *dset, hid_t dapl_id);
 static hbool_t H5D__compact_is_space_alloc(const H5O_storage_t *storage);
 static herr_t  H5D__compact_io_init(const H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
                                     hsize_t nelmts, H5S_t *file_space, H5S_t *mem_space, H5D_chunk_map_t *cm);
@@ -71,7 +72,7 @@ static herr_t  H5D__compact_dest(H5D_t *dset);
 /* Compact storage layout I/O ops */
 const H5D_layout_ops_t H5D_LOPS_COMPACT[1] = {{
     H5D__compact_construct,      /* construct */
-    NULL,                        /* init */
+    H5D__compact_init,           /* init */
     H5D__compact_is_space_alloc, /* is_space_alloc */
     NULL,                        /* is_data_cached */
     H5D__compact_io_init,        /* io_init */
@@ -199,6 +200,63 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__compact_construct() */
 
+/*-------------------------------------------------------------------------
+ * Function:	H5D__compact_init
+ *
+ * Purpose:	Initialize the info for a compact dataset.  This is
+ *		called when the dataset is initialized.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__compact_init(H5F_t H5_ATTR_UNUSED *f, const H5D_t *dset, hid_t H5_ATTR_UNUSED dapl_id)
+{
+    hssize_t snelmts;             /* Temporary holder for number of elements in dataspace */
+    hsize_t  nelmts;              /* Number of elements in dataspace */
+    size_t   dt_size;             /* Size of datatype */
+    hsize_t  data_size;           /* Dataset size, in bytes */
+    herr_t   ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    assert(dset);
+    assert(H5D_COMPACT == dset->shared->layout.storage.type);
+
+    /*
+     * Now that we've read the dataset's datatype, dataspace and
+     * layout information, perform a quick check for compact datasets
+     * to ensure that the size of the internal buffer that was
+     * allocated for the dataset's raw data matches the size of
+     * the data. A corrupted file can cause a mismatch between the
+     * two, which might result in buffer overflows during future
+     * I/O to the dataset.
+     */
+    if (0 == (dt_size = H5T_GET_SIZE(dset->shared->type)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get datatype size");
+    if ((snelmts = H5S_GET_EXTENT_NPOINTS(dset->shared->space)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get number of elements in dataset's dataspace");
+    nelmts = (hsize_t)snelmts;
+
+    /* Compute the size of the dataset's contiguous storage */
+    data_size = nelmts * dt_size;
+
+    /* Check for overflow during multiplication */
+    if (nelmts != (data_size / dt_size))
+        HGOTO_ERROR(H5E_DATASET, H5E_OVERFLOW, FAIL, "size of dataset's storage overflowed");
+
+    /* Check for mismatch */
+    if (dset->shared->layout.storage.u.compact.size != data_size)
+        HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL,
+                    "bad value from dataset header - size of compact dataset's data buffer doesn't match "
+                    "size of dataset data");
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__compact_init() */
+
 /*-------------------------------------------------------------------------
  * Function:	H5D__compact_is_space_alloc
  *
diff --git a/src/H5Dcontig.c b/src/H5Dcontig.c
index 30044e8847..e4b6b1a83b 100644
--- a/src/H5Dcontig.c
+++ b/src/H5Dcontig.c
@@ -356,6 +356,65 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__contig_delete */
 
+/*-------------------------------------------------------------------------
+ * Function:	H5D__contig_check
+ *
+ * Purpose:	Sanity check the contiguous info for a dataset.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__contig_check(const H5F_t *f, const H5O_layout_t *layout, const H5S_extent_t *extent, const H5T_t *dt)
+{
+    hsize_t nelmts;              /* Number of elements in dataspace */
+    size_t  dt_size;             /* Size of datatype */
+    hsize_t data_size;           /* Raw data size */
+    herr_t  ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    assert(f);
+    assert(layout);
+    assert(extent);
+    assert(dt);
+
+    /* Retrieve the number of elements in the dataspace */
+    nelmts = H5S_extent_nelem(extent);
+
+    /* Get the datatype's size */
+    if (0 == (dt_size = H5T_GET_SIZE(dt)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve size of datatype");
+
+    /* Compute the size of the dataset's contiguous storage */
+    data_size = nelmts * dt_size;
+
+    /* Check for overflow during multiplication */
+    if (nelmts != (data_size / dt_size))
+        HGOTO_ERROR(H5E_DATASET, H5E_OVERFLOW, FAIL, "size of dataset's storage overflowed");
+
+    /* Check for invalid (corrupted in the file, probably) dimensions */
+    if (H5F_addr_defined(layout->storage.u.contig.addr)) {
+        haddr_t rel_eoa; /* Relative end of file address	*/
+
+        if (HADDR_UNDEF == (rel_eoa = H5F_get_eoa(f, H5FD_MEM_DRAW)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to determine file size");
+
+        /* Check for invalid dataset size (from bad dimensions) putting the
+         * dataset elements off the end of the file
+         */
+        if (H5F_addr_le((layout->storage.u.contig.addr + data_size), layout->storage.u.contig.addr))
+            HGOTO_ERROR(H5E_DATASET, H5E_OVERFLOW, FAIL, "invalid dataset size, likely file corruption");
+        if (H5F_addr_gt((layout->storage.u.contig.addr + data_size), rel_eoa))
+            HGOTO_ERROR(H5E_DATASET, H5E_OVERFLOW, FAIL, "invalid dataset size, likely file corruption");
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__contig_check() */
+
 /*-------------------------------------------------------------------------
  * Function:	H5D__contig_construct
  *
@@ -444,11 +503,10 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5D__contig_init(H5F_t H5_ATTR_UNUSED *f, const H5D_t *dset, hid_t H5_ATTR_UNUSED dapl_id)
+H5D__contig_init(H5F_t *f, const H5D_t *dset, hid_t H5_ATTR_UNUSED dapl_id)
 {
-    hsize_t tmp_size;            /* Temporary holder for raw data size */
-    size_t  tmp_sieve_buf_size;  /* Temporary holder for sieve buffer size */
-    herr_t  ret_value = SUCCEED; /* Return value */
+    size_t tmp_sieve_buf_size;  /* Temporary holder for sieve buffer size */
+    herr_t ret_value = SUCCEED; /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -456,6 +514,11 @@ H5D__contig_init(H5F_t H5_ATTR_UNUSED *f, const H5D_t *dset, hid_t H5_ATTR_UNUSE
     HDassert(f);
     HDassert(dset);
 
+    /* Sanity check the dataset's info */
+    if (H5D__contig_check(f, &dset->shared->layout, H5S_GET_EXTENT(dset->shared->space), dset->shared->type) <
+        0)
+        HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "invalid dataset info");
+
     /* Compute the size of the contiguous storage for versions of the
      * layout message less than version 3 because versions 1 & 2 would
      * truncate the dimension sizes to 32-bits of information. - QAK 5/26/04
@@ -475,25 +538,16 @@ H5D__contig_init(H5F_t H5_ATTR_UNUSED *f, const H5D_t *dset, hid_t H5_ATTR_UNUSE
             HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve size of datatype")
 
         /* Compute the size of the dataset's contiguous storage */
-        tmp_size = nelmts * dt_size;
-
-        /* Check for overflow during multiplication */
-        if (nelmts != (tmp_size / dt_size))
-            HGOTO_ERROR(H5E_DATASET, H5E_OVERFLOW, FAIL, "size of dataset's storage overflowed")
-
-        /* Assign the dataset's contiguous storage size */
-        dset->shared->layout.storage.u.contig.size = tmp_size;
-    } /* end if */
-    else
-        tmp_size = dset->shared->layout.storage.u.contig.size;
+        dset->shared->layout.storage.u.contig.size = nelmts * dt_size;
+    }
 
     /* Get the sieve buffer size for the file */
     tmp_sieve_buf_size = H5F_SIEVE_BUF_SIZE(dset->oloc.file);
 
     /* Adjust the sieve buffer size to the smaller one between the dataset size and the buffer size
      * from the file access property.  (SLU - 2012/3/30) */
-    if (tmp_size < tmp_sieve_buf_size)
-        dset->shared->cache.contig.sieve_buf_size = tmp_size;
+    if (dset->shared->layout.storage.u.contig.size < tmp_sieve_buf_size)
+        dset->shared->cache.contig.sieve_buf_size = dset->shared->layout.storage.u.contig.size;
     else
         dset->shared->cache.contig.sieve_buf_size = tmp_sieve_buf_size;
 
diff --git a/src/H5Defl.c b/src/H5Defl.c
index 67416ff9c3..1fd93296cc 100644
--- a/src/H5Defl.c
+++ b/src/H5Defl.c
@@ -60,6 +60,7 @@ typedef struct H5D_efl_writevv_ud_t {
 
 /* Layout operation callbacks */
 static herr_t H5D__efl_construct(H5F_t *f, H5D_t *dset);
+static herr_t  H5D__efl_init(H5F_t *f, const H5D_t *dset, hid_t dapl_id);
 static herr_t H5D__efl_io_init(const H5D_io_info_t *io_info, const H5D_type_info_t *type_info, hsize_t nelmts,
                                H5S_t *file_space, H5S_t *mem_space, H5D_chunk_map_t *cm);
 static ssize_t H5D__efl_readvv(const H5D_io_info_t *io_info, size_t dset_max_nseq, size_t *dset_curr_seq,
@@ -81,7 +82,7 @@ static herr_t H5D__efl_write(const H5O_efl_t *efl, const H5D_t *dset, haddr_t ad
 /* External File List (EFL) storage layout I/O ops */
 const H5D_layout_ops_t H5D_LOPS_EFL[1] = {{
     H5D__efl_construct,      /* construct */
-    NULL,                    /* init */
+    H5D__efl_init,           /* init */
     H5D__efl_is_space_alloc, /* is_space_alloc */
     NULL,                    /* is_data_cached */
     H5D__efl_io_init,        /* io_init */
@@ -147,8 +148,9 @@ H5D__efl_construct(H5F_t *f, H5D_t *dset)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to determine datatype size")
 
     /* Check for storage overflows */
-    max_points  = H5S_get_npoints_max(dset->shared->space);
-    max_storage = H5O_efl_total_size(&dset->shared->dcpl_cache.efl);
+    max_points = H5S_get_npoints_max(dset->shared->space);
+    if (H5O_efl_total_size(&dset->shared->dcpl_cache.efl, &max_storage) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve size of external file");
     if (H5S_UNLIMITED == max_points) {
         if (H5O_EFL_UNLIMITED != max_storage)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unlimited dataspace but finite storage")
@@ -159,8 +161,8 @@ H5D__efl_construct(H5F_t *f, H5D_t *dset)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "dataspace size exceeds external storage size")
 
     /* Compute the total size of dataset */
-    stmp_size = H5S_GET_EXTENT_NPOINTS(dset->shared->space);
-    HDassert(stmp_size >= 0);
+    if ((stmp_size = H5S_GET_EXTENT_NPOINTS(dset->shared->space)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve number of elements in dataspace");
     tmp_size = (hsize_t)stmp_size * dt_size;
     H5_CHECKED_ASSIGN(dset->shared->layout.storage.u.contig.size, hsize_t, tmp_size, hssize_t);
 
@@ -171,6 +173,57 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__efl_construct() */
 
+/*-------------------------------------------------------------------------
+ * Function:	H5D__efl_init
+ *
+ * Purpose:	Initialize the info for a EFL dataset.  This is
+ *		called when the dataset is initialized.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__efl_init(H5F_t H5_ATTR_UNUSED *f, const H5D_t *dset, hid_t H5_ATTR_UNUSED dapl_id)
+{
+    size_t   dt_size;             /* Size of datatype */
+    hssize_t snelmts;             /* Temporary holder for number of elements in dataspace */
+    hsize_t  nelmts;              /* Number of elements in dataspace */
+    hsize_t  data_size;           /* Raw data size */
+    hsize_t  max_storage;         /* Maximum storage size */
+    herr_t   ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    assert(dset);
+
+    /* Retrieve the size of the dataset's datatype */
+    if (0 == (dt_size = H5T_get_size(dset->shared->type)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to determine datatype size");
+
+    /* Retrieve the number of elements in the dataspace */
+    if ((snelmts = H5S_GET_EXTENT_NPOINTS(dset->shared->space)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve number of elements in dataspace");
+    nelmts = (hsize_t)snelmts;
+
+    /* Compute the size of the dataset's contiguous storage */
+    data_size = nelmts * dt_size;
+
+    /* Check for overflow during multiplication */
+    if (nelmts != (data_size / dt_size))
+        HGOTO_ERROR(H5E_DATASET, H5E_OVERFLOW, FAIL, "size of dataset's storage overflowed");
+
+    /* Check for storage overflows */
+    if (H5O_efl_total_size(&dset->shared->dcpl_cache.efl, &max_storage) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve size of external file");
+    if (H5O_EFL_UNLIMITED != max_storage && data_size > max_storage)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "dataspace size exceeds external storage size");
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__efl_init() */
+
 /*-------------------------------------------------------------------------
  * Function:	H5D__efl_is_space_alloc
  *
diff --git a/src/H5Dint.c b/src/H5Dint.c
index ae62ce5416..58ebbc3c74 100644
--- a/src/H5Dint.c
+++ b/src/H5Dint.c
@@ -1659,6 +1659,7 @@ H5D__open_oid(H5D_t *dataset, hid_t dapl_id)
     htri_t          msg_exists;                /* Whether a particular type of message exists */
     hbool_t         layout_init       = FALSE; /* Flag to indicate that chunk information was initialized */
     hbool_t         must_init_storage = FALSE;
+    bool            fill_init         = false;   /* Flag to indicate that fill information was initialized */
     herr_t          ret_value         = SUCCEED; /* Return value */
 
     FUNC_ENTER_STATIC_TAG(dataset->oloc.addr)
@@ -1703,33 +1704,6 @@ H5D__open_oid(H5D_t *dataset, hid_t dapl_id)
     /* Indicate that the layout information was initialized */
     layout_init = TRUE;
 
-    /*
-     * Now that we've read the dataset's datatype, dataspace and
-     * layout information, perform a quick check for compact datasets
-     * to ensure that the size of the internal buffer that was
-     * allocated for the dataset's raw data matches the size of
-     * the data. A corrupted file can cause a mismatch between the
-     * two, which might result in buffer overflows during future
-     * I/O to the dataset.
-     */
-    if (H5D_COMPACT == dataset->shared->layout.type) {
-        hssize_t dset_nelemts   = 0;
-        size_t   dset_type_size = H5T_GET_SIZE(dataset->shared->type);
-        size_t   dset_data_size = 0;
-
-        HDassert(H5D_COMPACT == dataset->shared->layout.storage.type);
-
-        if ((dset_nelemts = H5S_GET_EXTENT_NPOINTS(dataset->shared->space)) < 0)
-            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get number of elements in dataset's dataspace")
-
-        dset_data_size = (size_t)dset_nelemts * dset_type_size;
-
-        if (dataset->shared->layout.storage.u.compact.size != dset_data_size)
-            HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL,
-                        "bad value from dataset header - size of compact dataset's data buffer doesn't match "
-                        "size of dataset data");
-    }
-
     /* Set up flush append property */
     if (H5D__append_flush_setup(dataset, dapl_id))
         HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to set up flush append property")
@@ -1743,6 +1717,9 @@ H5D__open_oid(H5D_t *dataset, hid_t dapl_id)
     if (msg_exists) {
         if (NULL == H5O_msg_read(&(dataset->oloc), H5O_FILL_NEW_ID, fill_prop))
             HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't retrieve message")
+
+        /* Indicate that the fill information was initialized */
+        fill_init = true;
     } /* end if */
     else {
         /* For backward compatibility, try to retrieve the old fill value message */
@@ -1751,6 +1728,9 @@ H5D__open_oid(H5D_t *dataset, hid_t dapl_id)
         if (msg_exists) {
             if (NULL == H5O_msg_read(&(dataset->oloc), H5O_FILL_ID, fill_prop))
                 HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't retrieve message")
+
+            /* Indicate that the fill information was initialized */
+            fill_init = true;
         } /* end if */
         else {
             /* Set the space allocation time appropriately, based on the type of dataset storage */
@@ -1789,6 +1769,33 @@ H5D__open_oid(H5D_t *dataset, hid_t dapl_id)
         (dataset->shared->layout.type == H5D_VIRTUAL && fill_prop->alloc_time == H5D_ALLOC_TIME_INCR))
         alloc_time_state = 1;
 
+    /* Check if there is a fill value, but no type yet */
+    if (fill_prop->buf != NULL && fill_prop->type == NULL) {
+        H5T_t *tmp_type; /* Temporary pointer to dataset's datatype */
+
+        /* Copy the dataset type into the fill value message */
+        if (NULL == (tmp_type = H5T_copy(dataset->shared->type, H5T_COPY_TRANSIENT)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to copy dataset datatype for fill value");
+
+        /* Check if conversion is necessary on fill buffer, and if fill-value
+         * buffer is too small to hold the result.
+         */
+        if (!H5T_noop_conv(dataset->shared->type, tmp_type)) {
+            size_t bkg_size = MAX(H5T_GET_SIZE(tmp_type), H5T_GET_SIZE(dataset->shared->type));
+
+            assert(fill_prop->size >= 0);
+            if ((size_t)fill_prop->size < bkg_size) {
+                if (H5T_close_real(tmp_type) < 0)
+                    HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't free temporary datatype");
+                HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL,
+                            "fill value size doesn't match dataset's datatype size");
+            }
+        }
+
+        if (H5T_close_real(tmp_type) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't free temporary datatype");
+    }
+
     /* Set revised fill value properties, if they are different from the defaults */
     if (H5P_fill_value_cmp(&H5D_def_dset.dcpl_cache.fill, fill_prop, sizeof(H5O_fill_t))) {
         if (H5P_set(plist, H5D_CRT_FILL_VALUE_NAME, fill_prop) < 0)
@@ -1831,6 +1838,8 @@ done:
         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 (fill_init)
+                H5O_msg_reset(H5O_FILL_ID, fill_prop);
             if (layout_init)
                 if (dataset->shared->layout.ops->dest && (dataset->shared->layout.ops->dest)(dataset) < 0)
                     HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy layout info")
diff --git a/src/H5Dpkg.h b/src/H5Dpkg.h
index b881924f72..60de9642c4 100644
--- a/src/H5Dpkg.h
+++ b/src/H5Dpkg.h
@@ -633,6 +633,8 @@ H5_DLL herr_t  H5D__contig_write(H5D_io_info_t *io_info, const H5D_type_info_t *
 H5_DLL herr_t  H5D__contig_copy(H5F_t *f_src, const H5O_storage_contig_t *storage_src, H5F_t *f_dst,
                                 H5O_storage_contig_t *storage_dst, H5T_t *src_dtype, H5O_copy_t *cpy_info);
 H5_DLL herr_t  H5D__contig_delete(H5F_t *f, const H5O_storage_t *store);
+H5_DLL herr_t H5D__contig_check(const H5F_t *f, const H5O_layout_t *layout, const H5S_extent_t *extent,
+                                const H5T_t *dt);
 
 /* Functions that operate on chunked dataset storage */
 H5_DLL htri_t  H5D__chunk_cacheable(const H5D_io_info_t *io_info, haddr_t caddr, hbool_t write_op);
diff --git a/src/H5Edefin.h b/src/H5Edefin.h
index d723222700..a60976ca97 100644
--- a/src/H5Edefin.h
+++ b/src/H5Edefin.h
@@ -18,88 +18,44 @@
 #define H5Edefin_H
 
 /* Major error IDs */
-hid_t H5E_FUNC_g           = FAIL;      /* Function entry/exit */
-hid_t H5E_FILE_g           = FAIL;      /* File accessibility */
-hid_t H5E_SOHM_g           = FAIL;      /* Shared Object Header Messages */
-hid_t H5E_SYM_g            = FAIL;      /* Symbol table */
-hid_t H5E_PLUGIN_g         = FAIL;      /* Plugin for dynamically loaded library */
 hid_t H5E_VFL_g            = FAIL;      /* Virtual File Layer */
-hid_t H5E_INTERNAL_g       = FAIL;      /* Internal error (too specific to document in detail) */
-hid_t H5E_BTREE_g          = FAIL;      /* B-Tree node */
-hid_t H5E_REFERENCE_g      = FAIL;      /* References */
-hid_t H5E_DATASPACE_g      = FAIL;      /* Dataspace */
-hid_t H5E_RESOURCE_g       = FAIL;      /* Resource unavailable */
-hid_t H5E_RS_g             = FAIL;      /* Reference Counted Strings */
-hid_t H5E_FARRAY_g         = FAIL;      /* Fixed Array */
-hid_t H5E_HEAP_g           = FAIL;      /* Heap */
-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_CACHE_g          = FAIL;      /* Object cache */
+hid_t H5E_OHDR_g           = FAIL;      /* Object header */
+hid_t H5E_SLIST_g          = FAIL;      /* Skip Lists */
 hid_t H5E_TST_g            = FAIL;      /* Ternary Search Trees */
+hid_t H5E_STORAGE_g        = FAIL;      /* Data storage */
 hid_t H5E_PAGEBUF_g        = FAIL;      /* Page Buffering */
+hid_t H5E_SOHM_g           = FAIL;      /* Shared Object Header Messages */
+hid_t H5E_SYM_g            = FAIL;      /* Symbol table */
+hid_t H5E_PLIST_g          = FAIL;      /* Property lists */
+hid_t H5E_IO_g             = FAIL;      /* Low-level I/O */
 hid_t H5E_FSPACE_g         = FAIL;      /* Free Space Manager */
+hid_t H5E_FILE_g           = FAIL;      /* File accessibility */
+hid_t H5E_ATTR_g           = FAIL;      /* Attribute */
+hid_t H5E_REFERENCE_g      = FAIL;      /* References */
+hid_t H5E_INTERNAL_g       = FAIL;      /* Internal error (too specific to document in detail) */
 hid_t H5E_DATASET_g        = FAIL;      /* Dataset */
-hid_t H5E_STORAGE_g        = FAIL;      /* Data storage */
-hid_t H5E_LINK_g           = FAIL;      /* Links */
-hid_t H5E_PLIST_g          = FAIL;      /* Property lists */
-hid_t H5E_DATATYPE_g       = FAIL;      /* Datatype */
-hid_t H5E_OHDR_g           = FAIL;      /* Object header */
-hid_t H5E_ATOM_g           = FAIL;      /* Object atom */
-hid_t H5E_NONE_MAJOR_g     = FAIL;      /* No error */
-hid_t H5E_SLIST_g          = FAIL;      /* Skip Lists */
+hid_t H5E_EARRAY_g         = FAIL;      /* Extensible Array */
 hid_t H5E_ARGS_g           = FAIL;      /* Invalid arguments to routine */
 hid_t H5E_CONTEXT_g        = FAIL;      /* API Context */
-hid_t H5E_EARRAY_g         = FAIL;      /* Extensible Array */
+hid_t H5E_PLUGIN_g         = FAIL;      /* Plugin for dynamically loaded library */
+hid_t H5E_LINK_g           = FAIL;      /* Links */
 hid_t H5E_PLINE_g          = FAIL;      /* Data filters */
+hid_t H5E_DATATYPE_g       = FAIL;      /* Datatype */
+hid_t H5E_FUNC_g           = FAIL;      /* Function entry/exit */
+hid_t H5E_RS_g             = FAIL;      /* Reference Counted Strings */
+hid_t H5E_DATASPACE_g      = FAIL;      /* Dataspace */
+hid_t H5E_EFL_g            = FAIL;      /* External file list */
+hid_t H5E_RESOURCE_g       = FAIL;      /* Resource unavailable */
+hid_t H5E_HEAP_g           = FAIL;      /* Heap */
+hid_t H5E_BTREE_g          = FAIL;      /* B-Tree node */
+hid_t H5E_NONE_MAJOR_g     = FAIL;      /* No error */
+hid_t H5E_ATOM_g           = FAIL;      /* Object atom */
+hid_t H5E_FARRAY_g         = FAIL;      /* Fixed Array */
 hid_t H5E_ERROR_g          = FAIL;      /* Error API */
-hid_t H5E_CACHE_g          = FAIL;      /* Object cache */
 
 /* Minor error IDs */
 
-/* Generic low-level file I/O errors */
-hid_t H5E_SEEKERROR_g      = FAIL;      /* Seek failed */
-hid_t H5E_READERROR_g      = FAIL;      /* Read failed */
-hid_t H5E_WRITEERROR_g     = FAIL;      /* Write failed */
-hid_t H5E_CLOSEERROR_g     = FAIL;      /* Close failed */
-hid_t H5E_OVERFLOW_g       = FAIL;      /* Address overflowed */
-hid_t H5E_FCNTL_g          = FAIL;      /* File control (fcntl) failed */
-
-/* Resource errors */
-hid_t H5E_NOSPACE_g        = FAIL;      /* No space available for allocation */
-hid_t H5E_CANTALLOC_g      = FAIL;      /* Can't allocate space */
-hid_t H5E_CANTCOPY_g       = FAIL;      /* Unable to copy object */
-hid_t H5E_CANTFREE_g       = FAIL;      /* Unable to free object */
-hid_t H5E_ALREADYEXISTS_g  = FAIL;      /* Object already exists */
-hid_t H5E_CANTLOCK_g       = FAIL;      /* Unable to lock object */
-hid_t H5E_CANTUNLOCK_g     = FAIL;      /* Unable to unlock object */
-hid_t H5E_CANTGC_g         = FAIL;      /* Unable to garbage collect */
-hid_t H5E_CANTGETSIZE_g    = FAIL;      /* Unable to compute size */
-hid_t H5E_OBJOPEN_g        = FAIL;      /* Object is already open */
-
-/* Heap errors */
-hid_t H5E_CANTRESTORE_g    = FAIL;      /* Can't restore condition */
-hid_t H5E_CANTCOMPUTE_g    = FAIL;      /* Can't compute value */
-hid_t H5E_CANTEXTEND_g     = FAIL;      /* Can't extend heap's space */
-hid_t H5E_CANTATTACH_g     = FAIL;      /* Can't attach object */
-hid_t H5E_CANTUPDATE_g     = FAIL;      /* Can't update object */
-hid_t H5E_CANTOPERATE_g    = FAIL;      /* Can't operate on object */
-
-/* Function entry/exit interface errors */
-hid_t H5E_CANTINIT_g       = FAIL;      /* Unable to initialize object */
-hid_t H5E_ALREADYINIT_g    = FAIL;      /* Object already initialized */
-hid_t H5E_CANTRELEASE_g    = FAIL;      /* Unable to release object */
-
-/* Property list errors */
-hid_t H5E_CANTGET_g        = FAIL;      /* Can't get value */
-hid_t H5E_CANTSET_g        = FAIL;      /* Can't set value */
-hid_t H5E_DUPCLASS_g       = FAIL;      /* Duplicate class name in parent class */
-hid_t H5E_SETDISALLOWED_g  = FAIL;      /* Disallowed operation */
-
-/* Free space errors */
-hid_t H5E_CANTMERGE_g      = FAIL;      /* Can't merge objects */
-hid_t H5E_CANTREVIVE_g     = FAIL;      /* Can't revive object */
-hid_t H5E_CANTSHRINK_g     = FAIL;      /* Can't shrink container */
-
 /* Object header related errors */
 hid_t H5E_LINKCOUNT_g      = FAIL;      /* Bad object header link count */
 hid_t H5E_VERSION_g        = FAIL;      /* Wrong version number */
@@ -111,50 +67,18 @@ hid_t H5E_CANTPACK_g       = FAIL;      /* Can't pack messages */
 hid_t H5E_CANTRESET_g      = FAIL;      /* Can't reset object */
 hid_t H5E_CANTRENAME_g     = FAIL;      /* Unable to rename object */
 
-/* System level errors */
-hid_t H5E_SYSERRSTR_g      = FAIL;      /* System error message */
-
-/* I/O pipeline errors */
-hid_t H5E_NOFILTER_g       = FAIL;      /* Requested filter is not available */
-hid_t H5E_CALLBACK_g       = FAIL;      /* Callback failed */
-hid_t H5E_CANAPPLY_g       = FAIL;      /* Error from filter 'can apply' callback */
-hid_t H5E_SETLOCAL_g       = FAIL;      /* Error from filter 'set local' callback */
-hid_t H5E_NOENCODER_g      = FAIL;      /* Filter present but encoding disabled */
-hid_t H5E_CANTFILTER_g     = FAIL;      /* Filter operation failed */
-
 /* Group related errors */
 hid_t H5E_CANTOPENOBJ_g    = FAIL;      /* Can't open object */
 hid_t H5E_CANTCLOSEOBJ_g   = FAIL;      /* Can't close object */
 hid_t H5E_COMPLEN_g        = FAIL;      /* Name component is too long */
 hid_t H5E_PATH_g           = FAIL;      /* Problem with path to object */
 
-/* No error */
-hid_t H5E_NONE_MINOR_g     = FAIL;      /* No error */
+/* System level errors */
+hid_t H5E_SYSERRSTR_g      = FAIL;      /* System error message */
 
 /* Plugin errors */
 hid_t H5E_OPENERROR_g      = FAIL;      /* Can't open directory or file */
 
-/* File accessibility errors */
-hid_t H5E_FILEEXISTS_g     = FAIL;      /* File already exists */
-hid_t H5E_FILEOPEN_g       = FAIL;      /* File already open */
-hid_t H5E_CANTCREATE_g     = FAIL;      /* Unable to create file */
-hid_t H5E_CANTOPENFILE_g   = FAIL;      /* Unable to open file */
-hid_t H5E_CANTCLOSEFILE_g  = FAIL;      /* Unable to close file */
-hid_t H5E_NOTHDF5_g        = FAIL;      /* Not an HDF5 file */
-hid_t H5E_BADFILE_g        = FAIL;      /* Bad file ID accessed */
-hid_t H5E_TRUNCATED_g      = FAIL;      /* File has been truncated */
-hid_t H5E_MOUNT_g          = FAIL;      /* File mount error */
-hid_t H5E_CANTLOCKFILE_g   = FAIL;      /* Unable to lock file */
-hid_t H5E_CANTUNLOCKFILE_g = FAIL;      /* Unable to unlock file */
-
-/* Object atom related errors */
-hid_t H5E_BADATOM_g        = FAIL;      /* Unable to find atom information (already closed?) */
-hid_t H5E_BADGROUP_g       = FAIL;      /* Unable to find ID group information */
-hid_t H5E_CANTREGISTER_g   = FAIL;      /* Unable to register new atom */
-hid_t H5E_CANTINC_g        = FAIL;      /* Unable to increment reference count */
-hid_t H5E_CANTDEC_g        = FAIL;      /* Unable to decrement reference count */
-hid_t H5E_NOIDS_g          = FAIL;      /* Out of IDs for group */
-
 /* Cache related errors */
 hid_t H5E_CANTFLUSH_g      = FAIL;      /* Unable to flush data from cache */
 hid_t H5E_CANTUNSERIALIZE_g = FAIL;      /* Unable to mark metadata as unserialized */
@@ -185,6 +109,22 @@ hid_t H5E_LOGFAIL_g        = FAIL;      /* old H5E_LOGGING_g (maintained for bin
 hid_t H5E_CANTCORK_g       = FAIL;      /* Unable to cork an object */
 hid_t H5E_CANTUNCORK_g     = FAIL;      /* Unable to uncork an object */
 
+/* I/O pipeline errors */
+hid_t H5E_NOFILTER_g       = FAIL;      /* Requested filter is not available */
+hid_t H5E_CALLBACK_g       = FAIL;      /* Callback failed */
+hid_t H5E_CANAPPLY_g       = FAIL;      /* Error from filter 'can apply' callback */
+hid_t H5E_SETLOCAL_g       = FAIL;      /* Error from filter 'set local' callback */
+hid_t H5E_NOENCODER_g      = FAIL;      /* Filter present but encoding disabled */
+hid_t H5E_CANTFILTER_g     = FAIL;      /* Filter operation failed */
+
+/* Generic low-level file I/O errors */
+hid_t H5E_SEEKERROR_g      = FAIL;      /* Seek failed */
+hid_t H5E_READERROR_g      = FAIL;      /* Read failed */
+hid_t H5E_WRITEERROR_g     = FAIL;      /* Write failed */
+hid_t H5E_CLOSEERROR_g     = FAIL;      /* Close failed */
+hid_t H5E_OVERFLOW_g       = FAIL;      /* Address overflowed */
+hid_t H5E_FCNTL_g          = FAIL;      /* File control (fcntl) failed */
+
 /* Link related errors */
 hid_t H5E_TRAVERSE_g       = FAIL;      /* Link traversal failure */
 hid_t H5E_NLINKS_g         = FAIL;      /* Too many soft links in path */
@@ -192,12 +132,18 @@ hid_t H5E_NOTREGISTERED_g  = FAIL;      /* Link class not registered */
 hid_t H5E_CANTMOVE_g       = FAIL;      /* Can't move object */
 hid_t H5E_CANTSORT_g       = FAIL;      /* Can't sort objects */
 
-/* Parallel MPI errors */
-hid_t H5E_MPI_g            = FAIL;      /* Some MPI function failed */
-hid_t H5E_MPIERRSTR_g      = FAIL;      /* MPI Error String */
-hid_t H5E_CANTRECV_g       = FAIL;      /* Can't receive data */
-hid_t H5E_CANTGATHER_g     = FAIL;      /* Can't gather data */
-hid_t H5E_NO_INDEPENDENT_g = FAIL;      /* Can't perform independent IO */
+/* File accessibility errors */
+hid_t H5E_FILEEXISTS_g     = FAIL;      /* File already exists */
+hid_t H5E_FILEOPEN_g       = FAIL;      /* File already open */
+hid_t H5E_CANTCREATE_g     = FAIL;      /* Unable to create file */
+hid_t H5E_CANTOPENFILE_g   = FAIL;      /* Unable to open file */
+hid_t H5E_CANTCLOSEFILE_g  = FAIL;      /* Unable to close file */
+hid_t H5E_NOTHDF5_g        = FAIL;      /* Not an HDF5 file */
+hid_t H5E_BADFILE_g        = FAIL;      /* Bad file ID accessed */
+hid_t H5E_TRUNCATED_g      = FAIL;      /* File has been truncated */
+hid_t H5E_MOUNT_g          = FAIL;      /* File mount error */
+hid_t H5E_CANTLOCKFILE_g   = FAIL;      /* Unable to lock file */
+hid_t H5E_CANTUNLOCKFILE_g = FAIL;      /* Unable to unlock file */
 
 /* Dataspace errors */
 hid_t H5E_CANTCLIP_g       = FAIL;      /* Can't clip hyperslab region */
@@ -209,6 +155,11 @@ hid_t H5E_CANTCOMPARE_g    = FAIL;      /* Can't compare objects */
 hid_t H5E_INCONSISTENTSTATE_g = FAIL;      /* Internal states are inconsistent */
 hid_t H5E_CANTAPPEND_g     = FAIL;      /* Can't append object */
 
+/* Free space errors */
+hid_t H5E_CANTMERGE_g      = FAIL;      /* Can't merge objects */
+hid_t H5E_CANTREVIVE_g     = FAIL;      /* Can't revive object */
+hid_t H5E_CANTSHRINK_g     = FAIL;      /* Can't shrink container */
+
 /* Argument errors */
 hid_t H5E_UNINITIALIZED_g  = FAIL;      /* Information is uinitialized */
 hid_t H5E_UNSUPPORTED_g    = FAIL;      /* Feature is unsupported */
@@ -216,6 +167,21 @@ hid_t H5E_BADTYPE_g        = FAIL;      /* Inappropriate type */
 hid_t H5E_BADRANGE_g       = FAIL;      /* Out of range */
 hid_t H5E_BADVALUE_g       = FAIL;      /* Bad value */
 
+/* Heap errors */
+hid_t H5E_CANTRESTORE_g    = FAIL;      /* Can't restore condition */
+hid_t H5E_CANTCOMPUTE_g    = FAIL;      /* Can't compute value */
+hid_t H5E_CANTEXTEND_g     = FAIL;      /* Can't extend heap's space */
+hid_t H5E_CANTATTACH_g     = FAIL;      /* Can't attach object */
+hid_t H5E_CANTUPDATE_g     = FAIL;      /* Can't update object */
+hid_t H5E_CANTOPERATE_g    = FAIL;      /* Can't operate on object */
+
+/* Parallel MPI errors */
+hid_t H5E_MPI_g            = FAIL;      /* Some MPI function failed */
+hid_t H5E_MPIERRSTR_g      = FAIL;      /* MPI Error String */
+hid_t H5E_CANTRECV_g       = FAIL;      /* Can't receive data */
+hid_t H5E_CANTGATHER_g     = FAIL;      /* Can't gather data */
+hid_t H5E_NO_INDEPENDENT_g = FAIL;      /* Can't perform independent IO */
+
 /* B-tree related errors */
 hid_t H5E_NOTFOUND_g       = FAIL;      /* Object not found */
 hid_t H5E_EXISTS_g         = FAIL;      /* Object already exists */
@@ -228,9 +194,44 @@ hid_t H5E_CANTINSERT_g     = FAIL;      /* Unable to insert object */
 hid_t H5E_CANTLIST_g       = FAIL;      /* Unable to list node */
 hid_t H5E_CANTMODIFY_g     = FAIL;      /* Unable to modify record */
 hid_t H5E_CANTREMOVE_g     = FAIL;      /* Unable to remove object */
+hid_t H5E_CANTFIND_g       = FAIL;      /* Unable to check for record */
+
+/* Property list errors */
+hid_t H5E_CANTGET_g        = FAIL;      /* Can't get value */
+hid_t H5E_CANTSET_g        = FAIL;      /* Can't set value */
+hid_t H5E_DUPCLASS_g       = FAIL;      /* Duplicate class name in parent class */
+hid_t H5E_SETDISALLOWED_g  = FAIL;      /* Disallowed operation */
+
+/* Resource errors */
+hid_t H5E_NOSPACE_g        = FAIL;      /* No space available for allocation */
+hid_t H5E_CANTALLOC_g      = FAIL;      /* Can't allocate space */
+hid_t H5E_CANTCOPY_g       = FAIL;      /* Unable to copy object */
+hid_t H5E_CANTFREE_g       = FAIL;      /* Unable to free object */
+hid_t H5E_ALREADYEXISTS_g  = FAIL;      /* Object already exists */
+hid_t H5E_CANTLOCK_g       = FAIL;      /* Unable to lock object */
+hid_t H5E_CANTUNLOCK_g     = FAIL;      /* Unable to unlock object */
+hid_t H5E_CANTGC_g         = FAIL;      /* Unable to garbage collect */
+hid_t H5E_CANTGETSIZE_g    = FAIL;      /* Unable to compute size */
+hid_t H5E_OBJOPEN_g        = FAIL;      /* Object is already open */
+
+/* Function entry/exit interface errors */
+hid_t H5E_CANTINIT_g       = FAIL;      /* Unable to initialize object */
+hid_t H5E_ALREADYINIT_g    = FAIL;      /* Object already initialized */
+hid_t H5E_CANTRELEASE_g    = FAIL;      /* Unable to release object */
 
 /* Datatype conversion errors */
 hid_t H5E_CANTCONVERT_g    = FAIL;      /* Can't convert datatypes */
 hid_t H5E_BADSIZE_g        = FAIL;      /* Bad size for object */
 
+/* No error */
+hid_t H5E_NONE_MINOR_g     = FAIL;      /* No error */
+
+/* Object atom related errors */
+hid_t H5E_BADATOM_g        = FAIL;      /* Unable to find atom information (already closed?) */
+hid_t H5E_BADGROUP_g       = FAIL;      /* Unable to find ID group information */
+hid_t H5E_CANTREGISTER_g   = FAIL;      /* Unable to register new atom */
+hid_t H5E_CANTINC_g        = FAIL;      /* Unable to increment reference count */
+hid_t H5E_CANTDEC_g        = FAIL;      /* Unable to decrement reference count */
+hid_t H5E_NOIDS_g          = FAIL;      /* Out of IDs for group */
+
 #endif /* H5Edefin_H */
diff --git a/src/H5Einit.h b/src/H5Einit.h
index d7afd4c5da..6959009d24 100644
--- a/src/H5Einit.h
+++ b/src/H5Einit.h
@@ -21,150 +21,95 @@
 /* Major error codes */
 /*********************/
 
-HDassert(H5E_FUNC_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Function entry/exit"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_FUNC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_FILE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "File accessibility"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_FILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_SOHM_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Shared Object Header Messages"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_SOHM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_SYM_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Symbol table"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_SYM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_PLUGIN_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Plugin for dynamically loaded library"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_PLUGIN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 HDassert(H5E_VFL_g==(-1));
 if((msg = H5E__create_msg(cls, H5E_MAJOR, "Virtual File Layer"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
 if((H5E_VFL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_INTERNAL_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Internal error (too specific to document in detail)"))==NULL)
+HDassert(H5E_CACHE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Object cache"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_INTERNAL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CACHE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_BTREE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "B-Tree node"))==NULL)
+HDassert(H5E_OHDR_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Object header"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_BTREE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_OHDR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_REFERENCE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "References"))==NULL)
+HDassert(H5E_SLIST_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Skip Lists"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_REFERENCE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_SLIST_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_DATASPACE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Dataspace"))==NULL)
+HDassert(H5E_TST_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Ternary Search Trees"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_DATASPACE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_TST_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_RESOURCE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Resource unavailable"))==NULL)
+HDassert(H5E_STORAGE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Data storage"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_RESOURCE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_STORAGE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_RS_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Reference Counted Strings"))==NULL)
+HDassert(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_RS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_PAGEBUF_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_FARRAY_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Fixed Array"))==NULL)
+HDassert(H5E_SOHM_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Shared Object Header Messages"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_FARRAY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_SOHM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_HEAP_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Heap"))==NULL)
+HDassert(H5E_SYM_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Symbol table"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_HEAP_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_SYM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_ATTR_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Attribute"))==NULL)
+HDassert(H5E_PLIST_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Property lists"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_ATTR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_PLIST_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 HDassert(H5E_IO_g==(-1));
 if((msg = H5E__create_msg(cls, H5E_MAJOR, "Low-level I/O"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
 if((H5E_IO_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_EFL_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "External file list"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_EFL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_TST_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Ternary Search Trees"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_TST_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(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")
 HDassert(H5E_FSPACE_g==(-1));
 if((msg = H5E__create_msg(cls, H5E_MAJOR, "Free Space Manager"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
 if((H5E_FSPACE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_DATASET_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Dataset"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_DATASET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_STORAGE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Data storage"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_STORAGE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_LINK_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Links"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_LINK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_PLIST_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Property lists"))==NULL)
+HDassert(H5E_FILE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "File accessibility"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_PLIST_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_FILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_DATATYPE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Datatype"))==NULL)
+HDassert(H5E_ATTR_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Attribute"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_DATATYPE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_ATTR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_OHDR_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Object header"))==NULL)
+HDassert(H5E_REFERENCE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "References"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_OHDR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_REFERENCE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_ATOM_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Object atom"))==NULL)
+HDassert(H5E_INTERNAL_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Internal error (too specific to document in detail)"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_ATOM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_INTERNAL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_NONE_MAJOR_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "No error"))==NULL)
+HDassert(H5E_DATASET_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Dataset"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NONE_MAJOR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_DATASET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_SLIST_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Skip Lists"))==NULL)
+HDassert(H5E_EARRAY_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Extensible Array"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_SLIST_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_EARRAY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 HDassert(H5E_ARGS_g==(-1));
 if((msg = H5E__create_msg(cls, H5E_MAJOR, "Invalid arguments to routine"))==NULL)
@@ -176,204 +121,87 @@ if((msg = H5E__create_msg(cls, H5E_MAJOR, "API Context"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
 if((H5E_CONTEXT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_EARRAY_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Extensible Array"))==NULL)
+HDassert(H5E_PLUGIN_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Plugin for dynamically loaded library"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_EARRAY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_PLUGIN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_LINK_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Links"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_LINK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 HDassert(H5E_PLINE_g==(-1));
 if((msg = H5E__create_msg(cls, H5E_MAJOR, "Data filters"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
 if((H5E_PLINE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_ERROR_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Error API"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_ERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CACHE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MAJOR, "Object cache"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CACHE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/*********************/
-/* Minor error codes */
-/*********************/
-
-
-/* Generic low-level file I/O errors */
-HDassert(H5E_SEEKERROR_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Seek failed"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_SEEKERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_READERROR_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Read failed"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_READERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_WRITEERROR_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Write failed"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_WRITEERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CLOSEERROR_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Close failed"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CLOSEERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_OVERFLOW_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Address overflowed"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_OVERFLOW_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_FCNTL_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "File control (fcntl) failed"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_FCNTL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* Resource errors */
-HDassert(H5E_NOSPACE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "No space available for allocation"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NOSPACE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTALLOC_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't allocate space"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTALLOC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTCOPY_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to copy object"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTCOPY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTFREE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to free object"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTFREE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_ALREADYEXISTS_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Object already exists"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_ALREADYEXISTS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTLOCK_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to lock object"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTLOCK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTUNLOCK_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to unlock object"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTUNLOCK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTGC_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to garbage collect"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTGC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTGETSIZE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to compute size"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTGETSIZE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_OBJOPEN_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Object is already open"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_OBJOPEN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* Heap errors */
-HDassert(H5E_CANTRESTORE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't restore condition"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTRESTORE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTCOMPUTE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't compute value"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTCOMPUTE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTEXTEND_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't extend heap's space"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTEXTEND_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTATTACH_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't attach object"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTATTACH_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTUPDATE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't update object"))==NULL)
+HDassert(H5E_DATATYPE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Datatype"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTUPDATE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_DATATYPE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTOPERATE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't operate on object"))==NULL)
+HDassert(H5E_FUNC_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Function entry/exit"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTOPERATE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_FUNC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* Function entry/exit interface errors */
-HDassert(H5E_CANTINIT_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to initialize object"))==NULL)
+HDassert(H5E_RS_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Reference Counted Strings"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTINIT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_RS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_ALREADYINIT_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Object already initialized"))==NULL)
+HDassert(H5E_DATASPACE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Dataspace"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_ALREADYINIT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_DATASPACE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTRELEASE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to release object"))==NULL)
+HDassert(H5E_EFL_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "External file list"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTRELEASE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_EFL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* Property list errors */
-HDassert(H5E_CANTGET_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't get value"))==NULL)
+HDassert(H5E_RESOURCE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Resource unavailable"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTGET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_RESOURCE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTSET_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't set value"))==NULL)
+HDassert(H5E_HEAP_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Heap"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTSET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_HEAP_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_DUPCLASS_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Duplicate class name in parent class"))==NULL)
+HDassert(H5E_BTREE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "B-Tree node"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_DUPCLASS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_BTREE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_SETDISALLOWED_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Disallowed operation"))==NULL)
+HDassert(H5E_NONE_MAJOR_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "No error"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_SETDISALLOWED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_NONE_MAJOR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* Free space errors */
-HDassert(H5E_CANTMERGE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't merge objects"))==NULL)
+HDassert(H5E_ATOM_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Object atom"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTMERGE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_ATOM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTREVIVE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't revive object"))==NULL)
+HDassert(H5E_FARRAY_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Fixed Array"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTREVIVE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_FARRAY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTSHRINK_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't shrink container"))==NULL)
+HDassert(H5E_ERROR_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MAJOR, "Error API"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTSHRINK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_ERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
+/*********************/
+/* Minor error codes */
+/*********************/
+
+
 /* Object header related errors */
 HDassert(H5E_LINKCOUNT_g==(-1));
 if((msg = H5E__create_msg(cls, H5E_MINOR, "Bad object header link count"))==NULL)
@@ -421,45 +249,6 @@ if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to rename object"))==NULL)
 if((H5E_CANTRENAME_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
-/* System level errors */
-HDassert(H5E_SYSERRSTR_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "System error message"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_SYSERRSTR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* I/O pipeline errors */
-HDassert(H5E_NOFILTER_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Requested filter is not available"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NOFILTER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CALLBACK_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Callback failed"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CALLBACK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANAPPLY_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Error from filter 'can apply' callback"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANAPPLY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_SETLOCAL_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Error from filter 'set local' callback"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_SETLOCAL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_NOENCODER_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Filter present but encoding disabled"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NOENCODER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTFILTER_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Filter operation failed"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTFILTER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
 /* Group related errors */
 HDassert(H5E_CANTOPENOBJ_g==(-1));
 if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't open object"))==NULL)
@@ -482,11 +271,11 @@ if((msg = H5E__create_msg(cls, H5E_MINOR, "Problem with path to object"))==NULL)
 if((H5E_PATH_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
-/* No error */
-HDassert(H5E_NONE_MINOR_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "No error"))==NULL)
+/* System level errors */
+HDassert(H5E_SYSERRSTR_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "System error message"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NONE_MINOR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_SYSERRSTR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
 /* Plugin errors */
@@ -496,95 +285,6 @@ if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't open directory or file"))==NULL
 if((H5E_OPENERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
-/* File accessibility errors */
-HDassert(H5E_FILEEXISTS_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "File already exists"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_FILEEXISTS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_FILEOPEN_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "File already open"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_FILEOPEN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTCREATE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to create file"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTCREATE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTOPENFILE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to open file"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTOPENFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTCLOSEFILE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to close file"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTCLOSEFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_NOTHDF5_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Not an HDF5 file"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NOTHDF5_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_BADFILE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Bad file ID accessed"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_BADFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_TRUNCATED_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "File has been truncated"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_TRUNCATED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_MOUNT_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "File mount error"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_MOUNT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTLOCKFILE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to lock file"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTLOCKFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTUNLOCKFILE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to unlock file"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTUNLOCKFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* Object atom related errors */
-HDassert(H5E_BADATOM_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to find atom information (already closed?)"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_BADATOM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_BADGROUP_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to find ID group information"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_BADGROUP_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTREGISTER_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to register new atom"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTREGISTER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTINC_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to increment reference count"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTINC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTDEC_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to decrement reference count"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTDEC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_NOIDS_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Out of IDs for group"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NOIDS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
 /* Cache related errors */
 HDassert(H5E_CANTFLUSH_g==(-1));
 if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to flush data from cache"))==NULL)
@@ -727,6 +427,70 @@ if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to uncork an object"))==NULL)
 if((H5E_CANTUNCORK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
+/* I/O pipeline errors */
+HDassert(H5E_NOFILTER_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Requested filter is not available"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NOFILTER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CALLBACK_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Callback failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CALLBACK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANAPPLY_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Error from filter 'can apply' callback"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANAPPLY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_SETLOCAL_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Error from filter 'set local' callback"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_SETLOCAL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_NOENCODER_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Filter present but encoding disabled"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NOENCODER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTFILTER_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Filter operation failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTFILTER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Generic low-level file I/O errors */
+HDassert(H5E_SEEKERROR_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Seek failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_SEEKERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_READERROR_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Read failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_READERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_WRITEERROR_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Write failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_WRITEERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CLOSEERROR_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Close failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CLOSEERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_OVERFLOW_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Address overflowed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_OVERFLOW_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_FCNTL_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "File control (fcntl) failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_FCNTL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
 /* Link related errors */
 HDassert(H5E_TRAVERSE_g==(-1));
 if((msg = H5E__create_msg(cls, H5E_MINOR, "Link traversal failure"))==NULL)
@@ -741,44 +505,74 @@ if((H5E_NLINKS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
 HDassert(H5E_NOTREGISTERED_g==(-1));
 if((msg = H5E__create_msg(cls, H5E_MINOR, "Link class not registered"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NOTREGISTERED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_NOTREGISTERED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTMOVE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't move object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTMOVE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTSORT_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't sort objects"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTSORT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* File accessibility errors */
+HDassert(H5E_FILEEXISTS_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "File already exists"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_FILEEXISTS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_FILEOPEN_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "File already open"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_FILEOPEN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTCREATE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to create file"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCREATE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTOPENFILE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to open file"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTOPENFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTMOVE_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't move object"))==NULL)
+HDassert(H5E_CANTCLOSEFILE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to close file"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTMOVE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTCLOSEFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTSORT_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't sort objects"))==NULL)
+HDassert(H5E_NOTHDF5_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Not an HDF5 file"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTSORT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_NOTHDF5_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* Parallel MPI errors */
-HDassert(H5E_MPI_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Some MPI function failed"))==NULL)
+HDassert(H5E_BADFILE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Bad file ID accessed"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_MPI_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_BADFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_MPIERRSTR_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "MPI Error String"))==NULL)
+HDassert(H5E_TRUNCATED_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "File has been truncated"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_MPIERRSTR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_TRUNCATED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTRECV_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't receive data"))==NULL)
+HDassert(H5E_MOUNT_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "File mount error"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTRECV_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_MOUNT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_CANTGATHER_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't gather data"))==NULL)
+HDassert(H5E_CANTLOCKFILE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to lock file"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTGATHER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTLOCKFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-HDassert(H5E_NO_INDEPENDENT_g==(-1));
-if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't perform independent IO"))==NULL)
+HDassert(H5E_CANTUNLOCKFILE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to unlock file"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NO_INDEPENDENT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTUNLOCKFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
 /* Dataspace errors */
@@ -823,6 +617,23 @@ if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't append object"))==NULL)
 if((H5E_CANTAPPEND_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
+/* Free space errors */
+HDassert(H5E_CANTMERGE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't merge objects"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTMERGE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTREVIVE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't revive object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTREVIVE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTSHRINK_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't shrink container"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTSHRINK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
 /* Argument errors */
 HDassert(H5E_UNINITIALIZED_g==(-1));
 if((msg = H5E__create_msg(cls, H5E_MINOR, "Information is uinitialized"))==NULL)
@@ -850,6 +661,65 @@ if((msg = H5E__create_msg(cls, H5E_MINOR, "Bad value"))==NULL)
 if((H5E_BADVALUE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
+/* Heap errors */
+HDassert(H5E_CANTRESTORE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't restore condition"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTRESTORE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTCOMPUTE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't compute value"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCOMPUTE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTEXTEND_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't extend heap's space"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTEXTEND_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTATTACH_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't attach object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTATTACH_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTUPDATE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't update object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTUPDATE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTOPERATE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't operate on object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTOPERATE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Parallel MPI errors */
+HDassert(H5E_MPI_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Some MPI function failed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_MPI_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_MPIERRSTR_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "MPI Error String"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_MPIERRSTR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTRECV_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't receive data"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTRECV_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTGATHER_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't gather data"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTGATHER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_NO_INDEPENDENT_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't perform independent IO"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NO_INDEPENDENT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
 /* B-tree related errors */
 HDassert(H5E_NOTFOUND_g==(-1));
 if((msg = H5E__create_msg(cls, H5E_MINOR, "Object not found"))==NULL)
@@ -906,6 +776,102 @@ if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to remove object"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
 if((H5E_CANTREMOVE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTFIND_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to check for record"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTFIND_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Property list errors */
+HDassert(H5E_CANTGET_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't get value"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTGET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTSET_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't set value"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTSET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_DUPCLASS_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Duplicate class name in parent class"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_DUPCLASS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_SETDISALLOWED_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Disallowed operation"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_SETDISALLOWED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Resource errors */
+HDassert(H5E_NOSPACE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "No space available for allocation"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NOSPACE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTALLOC_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Can't allocate space"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTALLOC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTCOPY_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to copy object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCOPY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTFREE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to free object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTFREE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_ALREADYEXISTS_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Object already exists"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_ALREADYEXISTS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTLOCK_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to lock object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTLOCK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTUNLOCK_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to unlock object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTUNLOCK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTGC_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to garbage collect"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTGC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTGETSIZE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to compute size"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTGETSIZE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_OBJOPEN_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Object is already open"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_OBJOPEN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Function entry/exit interface errors */
+HDassert(H5E_CANTINIT_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to initialize object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTINIT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_ALREADYINIT_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Object already initialized"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_ALREADYINIT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTRELEASE_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to release object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTRELEASE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
 /* Datatype conversion errors */
 HDassert(H5E_CANTCONVERT_g==(-1));
@@ -919,4 +885,43 @@ if((msg = H5E__create_msg(cls, H5E_MINOR, "Bad size for object"))==NULL)
 if((H5E_BADSIZE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
+/* No error */
+HDassert(H5E_NONE_MINOR_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "No error"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NONE_MINOR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Object atom related errors */
+HDassert(H5E_BADATOM_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to find atom information (already closed?)"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADATOM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_BADGROUP_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to find ID group information"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADGROUP_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTREGISTER_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to register new atom"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTREGISTER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTINC_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to increment reference count"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTINC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_CANTDEC_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Unable to decrement reference count"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTDEC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+HDassert(H5E_NOIDS_g==(-1));
+if((msg = H5E__create_msg(cls, H5E_MINOR, "Out of IDs for group"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NOIDS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
 #endif /* H5Einit_H */
diff --git a/src/H5Epubgen.h b/src/H5Epubgen.h
index b495dd6f75..fa3843afac 100644
--- a/src/H5Epubgen.h
+++ b/src/H5Epubgen.h
@@ -25,157 +25,81 @@ extern "C" {
 /* Major error codes */
 /*********************/
 
-#define H5E_FUNC             (H5OPEN H5E_FUNC_g)
-#define H5E_FILE             (H5OPEN H5E_FILE_g)
-#define H5E_SOHM             (H5OPEN H5E_SOHM_g)
-#define H5E_SYM              (H5OPEN H5E_SYM_g)
-#define H5E_PLUGIN           (H5OPEN H5E_PLUGIN_g)
 #define H5E_VFL              (H5OPEN H5E_VFL_g)
-#define H5E_INTERNAL         (H5OPEN H5E_INTERNAL_g)
-#define H5E_BTREE            (H5OPEN H5E_BTREE_g)
-#define H5E_REFERENCE        (H5OPEN H5E_REFERENCE_g)
-#define H5E_DATASPACE        (H5OPEN H5E_DATASPACE_g)
-#define H5E_RESOURCE         (H5OPEN H5E_RESOURCE_g)
-#define H5E_RS               (H5OPEN H5E_RS_g)
-#define H5E_FARRAY           (H5OPEN H5E_FARRAY_g)
-#define H5E_HEAP             (H5OPEN H5E_HEAP_g)
-#define H5E_ATTR             (H5OPEN H5E_ATTR_g)
-#define H5E_IO               (H5OPEN H5E_IO_g)
-#define H5E_EFL              (H5OPEN H5E_EFL_g)
+#define H5E_CACHE            (H5OPEN H5E_CACHE_g)
+#define H5E_OHDR             (H5OPEN H5E_OHDR_g)
+#define H5E_SLIST            (H5OPEN H5E_SLIST_g)
 #define H5E_TST              (H5OPEN H5E_TST_g)
+#define H5E_STORAGE          (H5OPEN H5E_STORAGE_g)
 #define H5E_PAGEBUF          (H5OPEN H5E_PAGEBUF_g)
+#define H5E_SOHM             (H5OPEN H5E_SOHM_g)
+#define H5E_SYM              (H5OPEN H5E_SYM_g)
+#define H5E_PLIST            (H5OPEN H5E_PLIST_g)
+#define H5E_IO               (H5OPEN H5E_IO_g)
 #define H5E_FSPACE           (H5OPEN H5E_FSPACE_g)
+#define H5E_FILE             (H5OPEN H5E_FILE_g)
+#define H5E_ATTR             (H5OPEN H5E_ATTR_g)
+#define H5E_REFERENCE        (H5OPEN H5E_REFERENCE_g)
+#define H5E_INTERNAL         (H5OPEN H5E_INTERNAL_g)
 #define H5E_DATASET          (H5OPEN H5E_DATASET_g)
-#define H5E_STORAGE          (H5OPEN H5E_STORAGE_g)
-#define H5E_LINK             (H5OPEN H5E_LINK_g)
-#define H5E_PLIST            (H5OPEN H5E_PLIST_g)
-#define H5E_DATATYPE         (H5OPEN H5E_DATATYPE_g)
-#define H5E_OHDR             (H5OPEN H5E_OHDR_g)
-#define H5E_ATOM             (H5OPEN H5E_ATOM_g)
-#define H5E_NONE_MAJOR       (H5OPEN H5E_NONE_MAJOR_g)
-#define H5E_SLIST            (H5OPEN H5E_SLIST_g)
+#define H5E_EARRAY           (H5OPEN H5E_EARRAY_g)
 #define H5E_ARGS             (H5OPEN H5E_ARGS_g)
 #define H5E_CONTEXT          (H5OPEN H5E_CONTEXT_g)
-#define H5E_EARRAY           (H5OPEN H5E_EARRAY_g)
+#define H5E_PLUGIN           (H5OPEN H5E_PLUGIN_g)
+#define H5E_LINK             (H5OPEN H5E_LINK_g)
 #define H5E_PLINE            (H5OPEN H5E_PLINE_g)
+#define H5E_DATATYPE         (H5OPEN H5E_DATATYPE_g)
+#define H5E_FUNC             (H5OPEN H5E_FUNC_g)
+#define H5E_RS               (H5OPEN H5E_RS_g)
+#define H5E_DATASPACE        (H5OPEN H5E_DATASPACE_g)
+#define H5E_EFL              (H5OPEN H5E_EFL_g)
+#define H5E_RESOURCE         (H5OPEN H5E_RESOURCE_g)
+#define H5E_HEAP             (H5OPEN H5E_HEAP_g)
+#define H5E_BTREE            (H5OPEN H5E_BTREE_g)
+#define H5E_NONE_MAJOR       (H5OPEN H5E_NONE_MAJOR_g)
+#define H5E_ATOM             (H5OPEN H5E_ATOM_g)
+#define H5E_FARRAY           (H5OPEN H5E_FARRAY_g)
 #define H5E_ERROR            (H5OPEN H5E_ERROR_g)
-#define H5E_CACHE            (H5OPEN H5E_CACHE_g)
-H5_DLLVAR hid_t H5E_FUNC_g;          /* Function entry/exit */
-H5_DLLVAR hid_t H5E_FILE_g;          /* File accessibility */
-H5_DLLVAR hid_t H5E_SOHM_g;          /* Shared Object Header Messages */
-H5_DLLVAR hid_t H5E_SYM_g;           /* Symbol table */
-H5_DLLVAR hid_t H5E_PLUGIN_g;        /* Plugin for dynamically loaded library */
 H5_DLLVAR hid_t H5E_VFL_g;           /* Virtual File Layer */
-H5_DLLVAR hid_t H5E_INTERNAL_g;      /* Internal error (too specific to document in detail) */
-H5_DLLVAR hid_t H5E_BTREE_g;         /* B-Tree node */
-H5_DLLVAR hid_t H5E_REFERENCE_g;     /* References */
-H5_DLLVAR hid_t H5E_DATASPACE_g;     /* Dataspace */
-H5_DLLVAR hid_t H5E_RESOURCE_g;      /* Resource unavailable */
-H5_DLLVAR hid_t H5E_RS_g;            /* Reference Counted Strings */
-H5_DLLVAR hid_t H5E_FARRAY_g;        /* Fixed Array */
-H5_DLLVAR hid_t H5E_HEAP_g;          /* Heap */
-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_CACHE_g;         /* Object cache */
+H5_DLLVAR hid_t H5E_OHDR_g;          /* Object header */
+H5_DLLVAR hid_t H5E_SLIST_g;         /* Skip Lists */
 H5_DLLVAR hid_t H5E_TST_g;           /* Ternary Search Trees */
+H5_DLLVAR hid_t H5E_STORAGE_g;       /* Data storage */
 H5_DLLVAR hid_t H5E_PAGEBUF_g;       /* Page Buffering */
+H5_DLLVAR hid_t H5E_SOHM_g;          /* Shared Object Header Messages */
+H5_DLLVAR hid_t H5E_SYM_g;           /* Symbol table */
+H5_DLLVAR hid_t H5E_PLIST_g;         /* Property lists */
+H5_DLLVAR hid_t H5E_IO_g;            /* Low-level I/O */
 H5_DLLVAR hid_t H5E_FSPACE_g;        /* Free Space Manager */
+H5_DLLVAR hid_t H5E_FILE_g;          /* File accessibility */
+H5_DLLVAR hid_t H5E_ATTR_g;          /* Attribute */
+H5_DLLVAR hid_t H5E_REFERENCE_g;     /* References */
+H5_DLLVAR hid_t H5E_INTERNAL_g;      /* Internal error (too specific to document in detail) */
 H5_DLLVAR hid_t H5E_DATASET_g;       /* Dataset */
-H5_DLLVAR hid_t H5E_STORAGE_g;       /* Data storage */
-H5_DLLVAR hid_t H5E_LINK_g;          /* Links */
-H5_DLLVAR hid_t H5E_PLIST_g;         /* Property lists */
-H5_DLLVAR hid_t H5E_DATATYPE_g;      /* Datatype */
-H5_DLLVAR hid_t H5E_OHDR_g;          /* Object header */
-H5_DLLVAR hid_t H5E_ATOM_g;          /* Object atom */
-H5_DLLVAR hid_t H5E_NONE_MAJOR_g;    /* No error */
-H5_DLLVAR hid_t H5E_SLIST_g;         /* Skip Lists */
+H5_DLLVAR hid_t H5E_EARRAY_g;        /* Extensible Array */
 H5_DLLVAR hid_t H5E_ARGS_g;          /* Invalid arguments to routine */
 H5_DLLVAR hid_t H5E_CONTEXT_g;       /* API Context */
-H5_DLLVAR hid_t H5E_EARRAY_g;        /* Extensible Array */
+H5_DLLVAR hid_t H5E_PLUGIN_g;        /* Plugin for dynamically loaded library */
+H5_DLLVAR hid_t H5E_LINK_g;          /* Links */
 H5_DLLVAR hid_t H5E_PLINE_g;         /* Data filters */
+H5_DLLVAR hid_t H5E_DATATYPE_g;      /* Datatype */
+H5_DLLVAR hid_t H5E_FUNC_g;          /* Function entry/exit */
+H5_DLLVAR hid_t H5E_RS_g;            /* Reference Counted Strings */
+H5_DLLVAR hid_t H5E_DATASPACE_g;     /* Dataspace */
+H5_DLLVAR hid_t H5E_EFL_g;           /* External file list */
+H5_DLLVAR hid_t H5E_RESOURCE_g;      /* Resource unavailable */
+H5_DLLVAR hid_t H5E_HEAP_g;          /* Heap */
+H5_DLLVAR hid_t H5E_BTREE_g;         /* B-Tree node */
+H5_DLLVAR hid_t H5E_NONE_MAJOR_g;    /* No error */
+H5_DLLVAR hid_t H5E_ATOM_g;          /* Object atom */
+H5_DLLVAR hid_t H5E_FARRAY_g;        /* Fixed Array */
 H5_DLLVAR hid_t H5E_ERROR_g;         /* Error API */
-H5_DLLVAR hid_t H5E_CACHE_g;         /* Object cache */
 
 /*********************/
 /* Minor error codes */
 /*********************/
 
-/* Generic low-level file I/O errors */
-#define H5E_SEEKERROR        (H5OPEN H5E_SEEKERROR_g)
-#define H5E_READERROR        (H5OPEN H5E_READERROR_g)
-#define H5E_WRITEERROR       (H5OPEN H5E_WRITEERROR_g)
-#define H5E_CLOSEERROR       (H5OPEN H5E_CLOSEERROR_g)
-#define H5E_OVERFLOW         (H5OPEN H5E_OVERFLOW_g)
-#define H5E_FCNTL            (H5OPEN H5E_FCNTL_g)
-H5_DLLVAR hid_t H5E_SEEKERROR_g;     /* Seek failed */
-H5_DLLVAR hid_t H5E_READERROR_g;     /* Read failed */
-H5_DLLVAR hid_t H5E_WRITEERROR_g;    /* Write failed */
-H5_DLLVAR hid_t H5E_CLOSEERROR_g;    /* Close failed */
-H5_DLLVAR hid_t H5E_OVERFLOW_g;      /* Address overflowed */
-H5_DLLVAR hid_t H5E_FCNTL_g;         /* File control (fcntl) failed */
-
-/* Resource errors */
-#define H5E_NOSPACE          (H5OPEN H5E_NOSPACE_g)
-#define H5E_CANTALLOC        (H5OPEN H5E_CANTALLOC_g)
-#define H5E_CANTCOPY         (H5OPEN H5E_CANTCOPY_g)
-#define H5E_CANTFREE         (H5OPEN H5E_CANTFREE_g)
-#define H5E_ALREADYEXISTS    (H5OPEN H5E_ALREADYEXISTS_g)
-#define H5E_CANTLOCK         (H5OPEN H5E_CANTLOCK_g)
-#define H5E_CANTUNLOCK       (H5OPEN H5E_CANTUNLOCK_g)
-#define H5E_CANTGC           (H5OPEN H5E_CANTGC_g)
-#define H5E_CANTGETSIZE      (H5OPEN H5E_CANTGETSIZE_g)
-#define H5E_OBJOPEN          (H5OPEN H5E_OBJOPEN_g)
-H5_DLLVAR hid_t H5E_NOSPACE_g;       /* No space available for allocation */
-H5_DLLVAR hid_t H5E_CANTALLOC_g;     /* Can't allocate space */
-H5_DLLVAR hid_t H5E_CANTCOPY_g;      /* Unable to copy object */
-H5_DLLVAR hid_t H5E_CANTFREE_g;      /* Unable to free object */
-H5_DLLVAR hid_t H5E_ALREADYEXISTS_g; /* Object already exists */
-H5_DLLVAR hid_t H5E_CANTLOCK_g;      /* Unable to lock object */
-H5_DLLVAR hid_t H5E_CANTUNLOCK_g;    /* Unable to unlock object */
-H5_DLLVAR hid_t H5E_CANTGC_g;        /* Unable to garbage collect */
-H5_DLLVAR hid_t H5E_CANTGETSIZE_g;   /* Unable to compute size */
-H5_DLLVAR hid_t H5E_OBJOPEN_g;       /* Object is already open */
-
-/* Heap errors */
-#define H5E_CANTRESTORE      (H5OPEN H5E_CANTRESTORE_g)
-#define H5E_CANTCOMPUTE      (H5OPEN H5E_CANTCOMPUTE_g)
-#define H5E_CANTEXTEND       (H5OPEN H5E_CANTEXTEND_g)
-#define H5E_CANTATTACH       (H5OPEN H5E_CANTATTACH_g)
-#define H5E_CANTUPDATE       (H5OPEN H5E_CANTUPDATE_g)
-#define H5E_CANTOPERATE      (H5OPEN H5E_CANTOPERATE_g)
-H5_DLLVAR hid_t H5E_CANTRESTORE_g;   /* Can't restore condition */
-H5_DLLVAR hid_t H5E_CANTCOMPUTE_g;   /* Can't compute value */
-H5_DLLVAR hid_t H5E_CANTEXTEND_g;    /* Can't extend heap's space */
-H5_DLLVAR hid_t H5E_CANTATTACH_g;    /* Can't attach object */
-H5_DLLVAR hid_t H5E_CANTUPDATE_g;    /* Can't update object */
-H5_DLLVAR hid_t H5E_CANTOPERATE_g;   /* Can't operate on object */
-
-/* Function entry/exit interface errors */
-#define H5E_CANTINIT         (H5OPEN H5E_CANTINIT_g)
-#define H5E_ALREADYINIT      (H5OPEN H5E_ALREADYINIT_g)
-#define H5E_CANTRELEASE      (H5OPEN H5E_CANTRELEASE_g)
-H5_DLLVAR hid_t H5E_CANTINIT_g;      /* Unable to initialize object */
-H5_DLLVAR hid_t H5E_ALREADYINIT_g;   /* Object already initialized */
-H5_DLLVAR hid_t H5E_CANTRELEASE_g;   /* Unable to release object */
-
-/* Property list errors */
-#define H5E_CANTGET          (H5OPEN H5E_CANTGET_g)
-#define H5E_CANTSET          (H5OPEN H5E_CANTSET_g)
-#define H5E_DUPCLASS         (H5OPEN H5E_DUPCLASS_g)
-#define H5E_SETDISALLOWED    (H5OPEN H5E_SETDISALLOWED_g)
-H5_DLLVAR hid_t H5E_CANTGET_g;       /* Can't get value */
-H5_DLLVAR hid_t H5E_CANTSET_g;       /* Can't set value */
-H5_DLLVAR hid_t H5E_DUPCLASS_g;      /* Duplicate class name in parent class */
-H5_DLLVAR hid_t H5E_SETDISALLOWED_g; /* Disallowed operation */
-
-/* Free space errors */
-#define H5E_CANTMERGE        (H5OPEN H5E_CANTMERGE_g)
-#define H5E_CANTREVIVE       (H5OPEN H5E_CANTREVIVE_g)
-#define H5E_CANTSHRINK       (H5OPEN H5E_CANTSHRINK_g)
-H5_DLLVAR hid_t H5E_CANTMERGE_g;     /* Can't merge objects */
-H5_DLLVAR hid_t H5E_CANTREVIVE_g;    /* Can't revive object */
-H5_DLLVAR hid_t H5E_CANTSHRINK_g;    /* Can't shrink container */
-
 /* Object header related errors */
 #define H5E_LINKCOUNT        (H5OPEN H5E_LINKCOUNT_g)
 #define H5E_VERSION          (H5OPEN H5E_VERSION_g)
@@ -196,24 +120,6 @@ H5_DLLVAR hid_t H5E_CANTPACK_g;      /* Can't pack messages */
 H5_DLLVAR hid_t H5E_CANTRESET_g;     /* Can't reset object */
 H5_DLLVAR hid_t H5E_CANTRENAME_g;    /* Unable to rename object */
 
-/* System level errors */
-#define H5E_SYSERRSTR        (H5OPEN H5E_SYSERRSTR_g)
-H5_DLLVAR hid_t H5E_SYSERRSTR_g;     /* System error message */
-
-/* I/O pipeline errors */
-#define H5E_NOFILTER         (H5OPEN H5E_NOFILTER_g)
-#define H5E_CALLBACK         (H5OPEN H5E_CALLBACK_g)
-#define H5E_CANAPPLY         (H5OPEN H5E_CANAPPLY_g)
-#define H5E_SETLOCAL         (H5OPEN H5E_SETLOCAL_g)
-#define H5E_NOENCODER        (H5OPEN H5E_NOENCODER_g)
-#define H5E_CANTFILTER       (H5OPEN H5E_CANTFILTER_g)
-H5_DLLVAR hid_t H5E_NOFILTER_g;      /* Requested filter is not available */
-H5_DLLVAR hid_t H5E_CALLBACK_g;      /* Callback failed */
-H5_DLLVAR hid_t H5E_CANAPPLY_g;      /* Error from filter 'can apply' callback */
-H5_DLLVAR hid_t H5E_SETLOCAL_g;      /* Error from filter 'set local' callback */
-H5_DLLVAR hid_t H5E_NOENCODER_g;     /* Filter present but encoding disabled */
-H5_DLLVAR hid_t H5E_CANTFILTER_g;    /* Filter operation failed */
-
 /* Group related errors */
 #define H5E_CANTOPENOBJ      (H5OPEN H5E_CANTOPENOBJ_g)
 #define H5E_CANTCLOSEOBJ     (H5OPEN H5E_CANTCLOSEOBJ_g)
@@ -224,52 +130,14 @@ H5_DLLVAR hid_t H5E_CANTCLOSEOBJ_g;  /* Can't close object */
 H5_DLLVAR hid_t H5E_COMPLEN_g;       /* Name component is too long */
 H5_DLLVAR hid_t H5E_PATH_g;          /* Problem with path to object */
 
-/* No error */
-#define H5E_NONE_MINOR       (H5OPEN H5E_NONE_MINOR_g)
-H5_DLLVAR hid_t H5E_NONE_MINOR_g;    /* No error */
+/* System level errors */
+#define H5E_SYSERRSTR        (H5OPEN H5E_SYSERRSTR_g)
+H5_DLLVAR hid_t H5E_SYSERRSTR_g;     /* System error message */
 
 /* Plugin errors */
 #define H5E_OPENERROR        (H5OPEN H5E_OPENERROR_g)
 H5_DLLVAR hid_t H5E_OPENERROR_g;     /* Can't open directory or file */
 
-/* File accessibility errors */
-#define H5E_FILEEXISTS       (H5OPEN H5E_FILEEXISTS_g)
-#define H5E_FILEOPEN         (H5OPEN H5E_FILEOPEN_g)
-#define H5E_CANTCREATE       (H5OPEN H5E_CANTCREATE_g)
-#define H5E_CANTOPENFILE     (H5OPEN H5E_CANTOPENFILE_g)
-#define H5E_CANTCLOSEFILE    (H5OPEN H5E_CANTCLOSEFILE_g)
-#define H5E_NOTHDF5          (H5OPEN H5E_NOTHDF5_g)
-#define H5E_BADFILE          (H5OPEN H5E_BADFILE_g)
-#define H5E_TRUNCATED        (H5OPEN H5E_TRUNCATED_g)
-#define H5E_MOUNT            (H5OPEN H5E_MOUNT_g)
-#define H5E_CANTLOCKFILE     (H5OPEN H5E_CANTLOCKFILE_g)
-#define H5E_CANTUNLOCKFILE   (H5OPEN H5E_CANTUNLOCKFILE_g)
-H5_DLLVAR hid_t H5E_FILEEXISTS_g;    /* File already exists */
-H5_DLLVAR hid_t H5E_FILEOPEN_g;      /* File already open */
-H5_DLLVAR hid_t H5E_CANTCREATE_g;    /* Unable to create file */
-H5_DLLVAR hid_t H5E_CANTOPENFILE_g;  /* Unable to open file */
-H5_DLLVAR hid_t H5E_CANTCLOSEFILE_g; /* Unable to close file */
-H5_DLLVAR hid_t H5E_NOTHDF5_g;       /* Not an HDF5 file */
-H5_DLLVAR hid_t H5E_BADFILE_g;       /* Bad file ID accessed */
-H5_DLLVAR hid_t H5E_TRUNCATED_g;     /* File has been truncated */
-H5_DLLVAR hid_t H5E_MOUNT_g;         /* File mount error */
-H5_DLLVAR hid_t H5E_CANTLOCKFILE_g;  /* Unable to lock file */
-H5_DLLVAR hid_t H5E_CANTUNLOCKFILE_g; /* Unable to unlock file */
-
-/* Object atom related errors */
-#define H5E_BADATOM          (H5OPEN H5E_BADATOM_g)
-#define H5E_BADGROUP         (H5OPEN H5E_BADGROUP_g)
-#define H5E_CANTREGISTER     (H5OPEN H5E_CANTREGISTER_g)
-#define H5E_CANTINC          (H5OPEN H5E_CANTINC_g)
-#define H5E_CANTDEC          (H5OPEN H5E_CANTDEC_g)
-#define H5E_NOIDS            (H5OPEN H5E_NOIDS_g)
-H5_DLLVAR hid_t H5E_BADATOM_g;       /* Unable to find atom information (already closed?) */
-H5_DLLVAR hid_t H5E_BADGROUP_g;      /* Unable to find ID group information */
-H5_DLLVAR hid_t H5E_CANTREGISTER_g;  /* Unable to register new atom */
-H5_DLLVAR hid_t H5E_CANTINC_g;       /* Unable to increment reference count */
-H5_DLLVAR hid_t H5E_CANTDEC_g;       /* Unable to decrement reference count */
-H5_DLLVAR hid_t H5E_NOIDS_g;         /* Out of IDs for group */
-
 /* Cache related errors */
 #define H5E_CANTFLUSH        (H5OPEN H5E_CANTFLUSH_g)
 #define H5E_CANTUNSERIALIZE  (H5OPEN H5E_CANTUNSERIALIZE_g)
@@ -328,6 +196,34 @@ H5_DLLVAR hid_t H5E_LOGFAIL_g;       /* old H5E_LOGGING_g (maintained for binary
 H5_DLLVAR hid_t H5E_CANTCORK_g;      /* Unable to cork an object */
 H5_DLLVAR hid_t H5E_CANTUNCORK_g;    /* Unable to uncork an object */
 
+/* I/O pipeline errors */
+#define H5E_NOFILTER         (H5OPEN H5E_NOFILTER_g)
+#define H5E_CALLBACK         (H5OPEN H5E_CALLBACK_g)
+#define H5E_CANAPPLY         (H5OPEN H5E_CANAPPLY_g)
+#define H5E_SETLOCAL         (H5OPEN H5E_SETLOCAL_g)
+#define H5E_NOENCODER        (H5OPEN H5E_NOENCODER_g)
+#define H5E_CANTFILTER       (H5OPEN H5E_CANTFILTER_g)
+H5_DLLVAR hid_t H5E_NOFILTER_g;      /* Requested filter is not available */
+H5_DLLVAR hid_t H5E_CALLBACK_g;      /* Callback failed */
+H5_DLLVAR hid_t H5E_CANAPPLY_g;      /* Error from filter 'can apply' callback */
+H5_DLLVAR hid_t H5E_SETLOCAL_g;      /* Error from filter 'set local' callback */
+H5_DLLVAR hid_t H5E_NOENCODER_g;     /* Filter present but encoding disabled */
+H5_DLLVAR hid_t H5E_CANTFILTER_g;    /* Filter operation failed */
+
+/* Generic low-level file I/O errors */
+#define H5E_SEEKERROR        (H5OPEN H5E_SEEKERROR_g)
+#define H5E_READERROR        (H5OPEN H5E_READERROR_g)
+#define H5E_WRITEERROR       (H5OPEN H5E_WRITEERROR_g)
+#define H5E_CLOSEERROR       (H5OPEN H5E_CLOSEERROR_g)
+#define H5E_OVERFLOW         (H5OPEN H5E_OVERFLOW_g)
+#define H5E_FCNTL            (H5OPEN H5E_FCNTL_g)
+H5_DLLVAR hid_t H5E_SEEKERROR_g;     /* Seek failed */
+H5_DLLVAR hid_t H5E_READERROR_g;     /* Read failed */
+H5_DLLVAR hid_t H5E_WRITEERROR_g;    /* Write failed */
+H5_DLLVAR hid_t H5E_CLOSEERROR_g;    /* Close failed */
+H5_DLLVAR hid_t H5E_OVERFLOW_g;      /* Address overflowed */
+H5_DLLVAR hid_t H5E_FCNTL_g;         /* File control (fcntl) failed */
+
 /* Link related errors */
 #define H5E_TRAVERSE         (H5OPEN H5E_TRAVERSE_g)
 #define H5E_NLINKS           (H5OPEN H5E_NLINKS_g)
@@ -340,17 +236,29 @@ H5_DLLVAR hid_t H5E_NOTREGISTERED_g; /* Link class not registered */
 H5_DLLVAR hid_t H5E_CANTMOVE_g;      /* Can't move object */
 H5_DLLVAR hid_t H5E_CANTSORT_g;      /* Can't sort objects */
 
-/* Parallel MPI errors */
-#define H5E_MPI              (H5OPEN H5E_MPI_g)
-#define H5E_MPIERRSTR        (H5OPEN H5E_MPIERRSTR_g)
-#define H5E_CANTRECV         (H5OPEN H5E_CANTRECV_g)
-#define H5E_CANTGATHER       (H5OPEN H5E_CANTGATHER_g)
-#define H5E_NO_INDEPENDENT   (H5OPEN H5E_NO_INDEPENDENT_g)
-H5_DLLVAR hid_t H5E_MPI_g;           /* Some MPI function failed */
-H5_DLLVAR hid_t H5E_MPIERRSTR_g;     /* MPI Error String */
-H5_DLLVAR hid_t H5E_CANTRECV_g;      /* Can't receive data */
-H5_DLLVAR hid_t H5E_CANTGATHER_g;    /* Can't gather data */
-H5_DLLVAR hid_t H5E_NO_INDEPENDENT_g; /* Can't perform independent IO */
+/* File accessibility errors */
+#define H5E_FILEEXISTS       (H5OPEN H5E_FILEEXISTS_g)
+#define H5E_FILEOPEN         (H5OPEN H5E_FILEOPEN_g)
+#define H5E_CANTCREATE       (H5OPEN H5E_CANTCREATE_g)
+#define H5E_CANTOPENFILE     (H5OPEN H5E_CANTOPENFILE_g)
+#define H5E_CANTCLOSEFILE    (H5OPEN H5E_CANTCLOSEFILE_g)
+#define H5E_NOTHDF5          (H5OPEN H5E_NOTHDF5_g)
+#define H5E_BADFILE          (H5OPEN H5E_BADFILE_g)
+#define H5E_TRUNCATED        (H5OPEN H5E_TRUNCATED_g)
+#define H5E_MOUNT            (H5OPEN H5E_MOUNT_g)
+#define H5E_CANTLOCKFILE     (H5OPEN H5E_CANTLOCKFILE_g)
+#define H5E_CANTUNLOCKFILE   (H5OPEN H5E_CANTUNLOCKFILE_g)
+H5_DLLVAR hid_t H5E_FILEEXISTS_g;    /* File already exists */
+H5_DLLVAR hid_t H5E_FILEOPEN_g;      /* File already open */
+H5_DLLVAR hid_t H5E_CANTCREATE_g;    /* Unable to create file */
+H5_DLLVAR hid_t H5E_CANTOPENFILE_g;  /* Unable to open file */
+H5_DLLVAR hid_t H5E_CANTCLOSEFILE_g; /* Unable to close file */
+H5_DLLVAR hid_t H5E_NOTHDF5_g;       /* Not an HDF5 file */
+H5_DLLVAR hid_t H5E_BADFILE_g;       /* Bad file ID accessed */
+H5_DLLVAR hid_t H5E_TRUNCATED_g;     /* File has been truncated */
+H5_DLLVAR hid_t H5E_MOUNT_g;         /* File mount error */
+H5_DLLVAR hid_t H5E_CANTLOCKFILE_g;  /* Unable to lock file */
+H5_DLLVAR hid_t H5E_CANTUNLOCKFILE_g; /* Unable to unlock file */
 
 /* Dataspace errors */
 #define H5E_CANTCLIP         (H5OPEN H5E_CANTCLIP_g)
@@ -370,6 +278,14 @@ H5_DLLVAR hid_t H5E_CANTCOMPARE_g;   /* Can't compare objects */
 H5_DLLVAR hid_t H5E_INCONSISTENTSTATE_g; /* Internal states are inconsistent */
 H5_DLLVAR hid_t H5E_CANTAPPEND_g;    /* Can't append object */
 
+/* Free space errors */
+#define H5E_CANTMERGE        (H5OPEN H5E_CANTMERGE_g)
+#define H5E_CANTREVIVE       (H5OPEN H5E_CANTREVIVE_g)
+#define H5E_CANTSHRINK       (H5OPEN H5E_CANTSHRINK_g)
+H5_DLLVAR hid_t H5E_CANTMERGE_g;     /* Can't merge objects */
+H5_DLLVAR hid_t H5E_CANTREVIVE_g;    /* Can't revive object */
+H5_DLLVAR hid_t H5E_CANTSHRINK_g;    /* Can't shrink container */
+
 /* Argument errors */
 #define H5E_UNINITIALIZED    (H5OPEN H5E_UNINITIALIZED_g)
 #define H5E_UNSUPPORTED      (H5OPEN H5E_UNSUPPORTED_g)
@@ -382,6 +298,32 @@ H5_DLLVAR hid_t H5E_BADTYPE_g;       /* Inappropriate type */
 H5_DLLVAR hid_t H5E_BADRANGE_g;      /* Out of range */
 H5_DLLVAR hid_t H5E_BADVALUE_g;      /* Bad value */
 
+/* Heap errors */
+#define H5E_CANTRESTORE      (H5OPEN H5E_CANTRESTORE_g)
+#define H5E_CANTCOMPUTE      (H5OPEN H5E_CANTCOMPUTE_g)
+#define H5E_CANTEXTEND       (H5OPEN H5E_CANTEXTEND_g)
+#define H5E_CANTATTACH       (H5OPEN H5E_CANTATTACH_g)
+#define H5E_CANTUPDATE       (H5OPEN H5E_CANTUPDATE_g)
+#define H5E_CANTOPERATE      (H5OPEN H5E_CANTOPERATE_g)
+H5_DLLVAR hid_t H5E_CANTRESTORE_g;   /* Can't restore condition */
+H5_DLLVAR hid_t H5E_CANTCOMPUTE_g;   /* Can't compute value */
+H5_DLLVAR hid_t H5E_CANTEXTEND_g;    /* Can't extend heap's space */
+H5_DLLVAR hid_t H5E_CANTATTACH_g;    /* Can't attach object */
+H5_DLLVAR hid_t H5E_CANTUPDATE_g;    /* Can't update object */
+H5_DLLVAR hid_t H5E_CANTOPERATE_g;   /* Can't operate on object */
+
+/* Parallel MPI errors */
+#define H5E_MPI              (H5OPEN H5E_MPI_g)
+#define H5E_MPIERRSTR        (H5OPEN H5E_MPIERRSTR_g)
+#define H5E_CANTRECV         (H5OPEN H5E_CANTRECV_g)
+#define H5E_CANTGATHER       (H5OPEN H5E_CANTGATHER_g)
+#define H5E_NO_INDEPENDENT   (H5OPEN H5E_NO_INDEPENDENT_g)
+H5_DLLVAR hid_t H5E_MPI_g;           /* Some MPI function failed */
+H5_DLLVAR hid_t H5E_MPIERRSTR_g;     /* MPI Error String */
+H5_DLLVAR hid_t H5E_CANTRECV_g;      /* Can't receive data */
+H5_DLLVAR hid_t H5E_CANTGATHER_g;    /* Can't gather data */
+H5_DLLVAR hid_t H5E_NO_INDEPENDENT_g; /* Can't perform independent IO */
+
 /* B-tree related errors */
 #define H5E_NOTFOUND         (H5OPEN H5E_NOTFOUND_g)
 #define H5E_EXISTS           (H5OPEN H5E_EXISTS_g)
@@ -394,6 +336,7 @@ H5_DLLVAR hid_t H5E_BADVALUE_g;      /* Bad value */
 #define H5E_CANTLIST         (H5OPEN H5E_CANTLIST_g)
 #define H5E_CANTMODIFY       (H5OPEN H5E_CANTMODIFY_g)
 #define H5E_CANTREMOVE       (H5OPEN H5E_CANTREMOVE_g)
+#define H5E_CANTFIND         (H5OPEN H5E_CANTFIND_g)
 H5_DLLVAR hid_t H5E_NOTFOUND_g;      /* Object not found */
 H5_DLLVAR hid_t H5E_EXISTS_g;        /* Object already exists */
 H5_DLLVAR hid_t H5E_CANTENCODE_g;    /* Unable to encode value */
@@ -405,6 +348,47 @@ H5_DLLVAR hid_t H5E_CANTINSERT_g;    /* Unable to insert object */
 H5_DLLVAR hid_t H5E_CANTLIST_g;      /* Unable to list node */
 H5_DLLVAR hid_t H5E_CANTMODIFY_g;    /* Unable to modify record */
 H5_DLLVAR hid_t H5E_CANTREMOVE_g;    /* Unable to remove object */
+H5_DLLVAR hid_t H5E_CANTFIND_g;      /* Unable to check for record */
+
+/* Property list errors */
+#define H5E_CANTGET          (H5OPEN H5E_CANTGET_g)
+#define H5E_CANTSET          (H5OPEN H5E_CANTSET_g)
+#define H5E_DUPCLASS         (H5OPEN H5E_DUPCLASS_g)
+#define H5E_SETDISALLOWED    (H5OPEN H5E_SETDISALLOWED_g)
+H5_DLLVAR hid_t H5E_CANTGET_g;       /* Can't get value */
+H5_DLLVAR hid_t H5E_CANTSET_g;       /* Can't set value */
+H5_DLLVAR hid_t H5E_DUPCLASS_g;      /* Duplicate class name in parent class */
+H5_DLLVAR hid_t H5E_SETDISALLOWED_g; /* Disallowed operation */
+
+/* Resource errors */
+#define H5E_NOSPACE          (H5OPEN H5E_NOSPACE_g)
+#define H5E_CANTALLOC        (H5OPEN H5E_CANTALLOC_g)
+#define H5E_CANTCOPY         (H5OPEN H5E_CANTCOPY_g)
+#define H5E_CANTFREE         (H5OPEN H5E_CANTFREE_g)
+#define H5E_ALREADYEXISTS    (H5OPEN H5E_ALREADYEXISTS_g)
+#define H5E_CANTLOCK         (H5OPEN H5E_CANTLOCK_g)
+#define H5E_CANTUNLOCK       (H5OPEN H5E_CANTUNLOCK_g)
+#define H5E_CANTGC           (H5OPEN H5E_CANTGC_g)
+#define H5E_CANTGETSIZE      (H5OPEN H5E_CANTGETSIZE_g)
+#define H5E_OBJOPEN          (H5OPEN H5E_OBJOPEN_g)
+H5_DLLVAR hid_t H5E_NOSPACE_g;       /* No space available for allocation */
+H5_DLLVAR hid_t H5E_CANTALLOC_g;     /* Can't allocate space */
+H5_DLLVAR hid_t H5E_CANTCOPY_g;      /* Unable to copy object */
+H5_DLLVAR hid_t H5E_CANTFREE_g;      /* Unable to free object */
+H5_DLLVAR hid_t H5E_ALREADYEXISTS_g; /* Object already exists */
+H5_DLLVAR hid_t H5E_CANTLOCK_g;      /* Unable to lock object */
+H5_DLLVAR hid_t H5E_CANTUNLOCK_g;    /* Unable to unlock object */
+H5_DLLVAR hid_t H5E_CANTGC_g;        /* Unable to garbage collect */
+H5_DLLVAR hid_t H5E_CANTGETSIZE_g;   /* Unable to compute size */
+H5_DLLVAR hid_t H5E_OBJOPEN_g;       /* Object is already open */
+
+/* Function entry/exit interface errors */
+#define H5E_CANTINIT         (H5OPEN H5E_CANTINIT_g)
+#define H5E_ALREADYINIT      (H5OPEN H5E_ALREADYINIT_g)
+#define H5E_CANTRELEASE      (H5OPEN H5E_CANTRELEASE_g)
+H5_DLLVAR hid_t H5E_CANTINIT_g;      /* Unable to initialize object */
+H5_DLLVAR hid_t H5E_ALREADYINIT_g;   /* Object already initialized */
+H5_DLLVAR hid_t H5E_CANTRELEASE_g;   /* Unable to release object */
 
 /* Datatype conversion errors */
 #define H5E_CANTCONVERT      (H5OPEN H5E_CANTCONVERT_g)
@@ -412,6 +396,24 @@ H5_DLLVAR hid_t H5E_CANTREMOVE_g;    /* Unable to remove object */
 H5_DLLVAR hid_t H5E_CANTCONVERT_g;   /* Can't convert datatypes */
 H5_DLLVAR hid_t H5E_BADSIZE_g;       /* Bad size for object */
 
+/* No error */
+#define H5E_NONE_MINOR       (H5OPEN H5E_NONE_MINOR_g)
+H5_DLLVAR hid_t H5E_NONE_MINOR_g;    /* No error */
+
+/* Object atom related errors */
+#define H5E_BADATOM          (H5OPEN H5E_BADATOM_g)
+#define H5E_BADGROUP         (H5OPEN H5E_BADGROUP_g)
+#define H5E_CANTREGISTER     (H5OPEN H5E_CANTREGISTER_g)
+#define H5E_CANTINC          (H5OPEN H5E_CANTINC_g)
+#define H5E_CANTDEC          (H5OPEN H5E_CANTDEC_g)
+#define H5E_NOIDS            (H5OPEN H5E_NOIDS_g)
+H5_DLLVAR hid_t H5E_BADATOM_g;       /* Unable to find atom information (already closed?) */
+H5_DLLVAR hid_t H5E_BADGROUP_g;      /* Unable to find ID group information */
+H5_DLLVAR hid_t H5E_CANTREGISTER_g;  /* Unable to register new atom */
+H5_DLLVAR hid_t H5E_CANTINC_g;       /* Unable to increment reference count */
+H5_DLLVAR hid_t H5E_CANTDEC_g;       /* Unable to decrement reference count */
+H5_DLLVAR hid_t H5E_NOIDS_g;         /* Out of IDs for group */
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/H5Eterm.h b/src/H5Eterm.h
index 9684c29ce1..09f47c9a24 100644
--- a/src/H5Eterm.h
+++ b/src/H5Eterm.h
@@ -19,89 +19,45 @@
 
 /* Reset major error IDs */
     
-H5E_FUNC_g=    
-H5E_FILE_g=    
-H5E_SOHM_g=    
-H5E_SYM_g=    
-H5E_PLUGIN_g=    
 H5E_VFL_g=    
-H5E_INTERNAL_g=    
-H5E_BTREE_g=    
-H5E_REFERENCE_g=    
-H5E_DATASPACE_g=    
-H5E_RESOURCE_g=    
-H5E_RS_g=    
-H5E_FARRAY_g=    
-H5E_HEAP_g=    
-H5E_ATTR_g=    
-H5E_IO_g=    
-H5E_EFL_g=    
+H5E_CACHE_g=    
+H5E_OHDR_g=    
+H5E_SLIST_g=    
 H5E_TST_g=    
+H5E_STORAGE_g=    
 H5E_PAGEBUF_g=    
+H5E_SOHM_g=    
+H5E_SYM_g=    
+H5E_PLIST_g=    
+H5E_IO_g=    
 H5E_FSPACE_g=    
+H5E_FILE_g=    
+H5E_ATTR_g=    
+H5E_REFERENCE_g=    
+H5E_INTERNAL_g=    
 H5E_DATASET_g=    
-H5E_STORAGE_g=    
-H5E_LINK_g=    
-H5E_PLIST_g=    
-H5E_DATATYPE_g=    
-H5E_OHDR_g=    
-H5E_ATOM_g=    
-H5E_NONE_MAJOR_g=    
-H5E_SLIST_g=    
+H5E_EARRAY_g=    
 H5E_ARGS_g=    
 H5E_CONTEXT_g=    
-H5E_EARRAY_g=    
+H5E_PLUGIN_g=    
+H5E_LINK_g=    
 H5E_PLINE_g=    
-H5E_ERROR_g=    
-H5E_CACHE_g= (-1);
+H5E_DATATYPE_g=    
+H5E_FUNC_g=    
+H5E_RS_g=    
+H5E_DATASPACE_g=    
+H5E_EFL_g=    
+H5E_RESOURCE_g=    
+H5E_HEAP_g=    
+H5E_BTREE_g=    
+H5E_NONE_MAJOR_g=    
+H5E_ATOM_g=    
+H5E_FARRAY_g=    
+H5E_ERROR_g= (-1);
 
 /* Reset minor error IDs */
 
 
-/* Generic low-level file I/O errors */    
-H5E_SEEKERROR_g=    
-H5E_READERROR_g=    
-H5E_WRITEERROR_g=    
-H5E_CLOSEERROR_g=    
-H5E_OVERFLOW_g=    
-H5E_FCNTL_g=
-
-/* Resource errors */    
-H5E_NOSPACE_g=    
-H5E_CANTALLOC_g=    
-H5E_CANTCOPY_g=    
-H5E_CANTFREE_g=    
-H5E_ALREADYEXISTS_g=    
-H5E_CANTLOCK_g=    
-H5E_CANTUNLOCK_g=    
-H5E_CANTGC_g=    
-H5E_CANTGETSIZE_g=    
-H5E_OBJOPEN_g=
-
-/* Heap errors */    
-H5E_CANTRESTORE_g=    
-H5E_CANTCOMPUTE_g=    
-H5E_CANTEXTEND_g=    
-H5E_CANTATTACH_g=    
-H5E_CANTUPDATE_g=    
-H5E_CANTOPERATE_g=
-
-/* Function entry/exit interface errors */    
-H5E_CANTINIT_g=    
-H5E_ALREADYINIT_g=    
-H5E_CANTRELEASE_g=
-
-/* Property list errors */    
-H5E_CANTGET_g=    
-H5E_CANTSET_g=    
-H5E_DUPCLASS_g=    
-H5E_SETDISALLOWED_g=
-
-/* Free space errors */    
-H5E_CANTMERGE_g=    
-H5E_CANTREVIVE_g=    
-H5E_CANTSHRINK_g=
-
 /* Object header related errors */    
 H5E_LINKCOUNT_g=    
 H5E_VERSION_g=    
@@ -113,50 +69,18 @@ H5E_CANTPACK_g=
 H5E_CANTRESET_g=    
 H5E_CANTRENAME_g=
 
-/* System level errors */    
-H5E_SYSERRSTR_g=
-
-/* I/O pipeline errors */    
-H5E_NOFILTER_g=    
-H5E_CALLBACK_g=    
-H5E_CANAPPLY_g=    
-H5E_SETLOCAL_g=    
-H5E_NOENCODER_g=    
-H5E_CANTFILTER_g=
-
 /* Group related errors */    
 H5E_CANTOPENOBJ_g=    
 H5E_CANTCLOSEOBJ_g=    
 H5E_COMPLEN_g=    
 H5E_PATH_g=
 
-/* No error */    
-H5E_NONE_MINOR_g=
+/* System level errors */    
+H5E_SYSERRSTR_g=
 
 /* Plugin errors */    
 H5E_OPENERROR_g=
 
-/* File accessibility errors */    
-H5E_FILEEXISTS_g=    
-H5E_FILEOPEN_g=    
-H5E_CANTCREATE_g=    
-H5E_CANTOPENFILE_g=    
-H5E_CANTCLOSEFILE_g=    
-H5E_NOTHDF5_g=    
-H5E_BADFILE_g=    
-H5E_TRUNCATED_g=    
-H5E_MOUNT_g=    
-H5E_CANTLOCKFILE_g=    
-H5E_CANTUNLOCKFILE_g=
-
-/* Object atom related errors */    
-H5E_BADATOM_g=    
-H5E_BADGROUP_g=    
-H5E_CANTREGISTER_g=    
-H5E_CANTINC_g=    
-H5E_CANTDEC_g=    
-H5E_NOIDS_g=
-
 /* Cache related errors */    
 H5E_CANTFLUSH_g=    
 H5E_CANTUNSERIALIZE_g=    
@@ -187,6 +111,22 @@ H5E_LOGFAIL_g=
 H5E_CANTCORK_g=    
 H5E_CANTUNCORK_g=
 
+/* I/O pipeline errors */    
+H5E_NOFILTER_g=    
+H5E_CALLBACK_g=    
+H5E_CANAPPLY_g=    
+H5E_SETLOCAL_g=    
+H5E_NOENCODER_g=    
+H5E_CANTFILTER_g=
+
+/* Generic low-level file I/O errors */    
+H5E_SEEKERROR_g=    
+H5E_READERROR_g=    
+H5E_WRITEERROR_g=    
+H5E_CLOSEERROR_g=    
+H5E_OVERFLOW_g=    
+H5E_FCNTL_g=
+
 /* Link related errors */    
 H5E_TRAVERSE_g=    
 H5E_NLINKS_g=    
@@ -194,12 +134,18 @@ H5E_NOTREGISTERED_g=
 H5E_CANTMOVE_g=    
 H5E_CANTSORT_g=
 
-/* Parallel MPI errors */    
-H5E_MPI_g=    
-H5E_MPIERRSTR_g=    
-H5E_CANTRECV_g=    
-H5E_CANTGATHER_g=    
-H5E_NO_INDEPENDENT_g=
+/* File accessibility errors */    
+H5E_FILEEXISTS_g=    
+H5E_FILEOPEN_g=    
+H5E_CANTCREATE_g=    
+H5E_CANTOPENFILE_g=    
+H5E_CANTCLOSEFILE_g=    
+H5E_NOTHDF5_g=    
+H5E_BADFILE_g=    
+H5E_TRUNCATED_g=    
+H5E_MOUNT_g=    
+H5E_CANTLOCKFILE_g=    
+H5E_CANTUNLOCKFILE_g=
 
 /* Dataspace errors */    
 H5E_CANTCLIP_g=    
@@ -211,6 +157,11 @@ H5E_CANTCOMPARE_g=
 H5E_INCONSISTENTSTATE_g=    
 H5E_CANTAPPEND_g=
 
+/* Free space errors */    
+H5E_CANTMERGE_g=    
+H5E_CANTREVIVE_g=    
+H5E_CANTSHRINK_g=
+
 /* Argument errors */    
 H5E_UNINITIALIZED_g=    
 H5E_UNSUPPORTED_g=    
@@ -218,6 +169,21 @@ H5E_BADTYPE_g=
 H5E_BADRANGE_g=    
 H5E_BADVALUE_g=
 
+/* Heap errors */    
+H5E_CANTRESTORE_g=    
+H5E_CANTCOMPUTE_g=    
+H5E_CANTEXTEND_g=    
+H5E_CANTATTACH_g=    
+H5E_CANTUPDATE_g=    
+H5E_CANTOPERATE_g=
+
+/* Parallel MPI errors */    
+H5E_MPI_g=    
+H5E_MPIERRSTR_g=    
+H5E_CANTRECV_g=    
+H5E_CANTGATHER_g=    
+H5E_NO_INDEPENDENT_g=
+
 /* B-tree related errors */    
 H5E_NOTFOUND_g=    
 H5E_EXISTS_g=    
@@ -229,10 +195,45 @@ H5E_CANTSWAP_g=
 H5E_CANTINSERT_g=    
 H5E_CANTLIST_g=    
 H5E_CANTMODIFY_g=    
-H5E_CANTREMOVE_g=
+H5E_CANTREMOVE_g=    
+H5E_CANTFIND_g=
+
+/* Property list errors */    
+H5E_CANTGET_g=    
+H5E_CANTSET_g=    
+H5E_DUPCLASS_g=    
+H5E_SETDISALLOWED_g=
+
+/* Resource errors */    
+H5E_NOSPACE_g=    
+H5E_CANTALLOC_g=    
+H5E_CANTCOPY_g=    
+H5E_CANTFREE_g=    
+H5E_ALREADYEXISTS_g=    
+H5E_CANTLOCK_g=    
+H5E_CANTUNLOCK_g=    
+H5E_CANTGC_g=    
+H5E_CANTGETSIZE_g=    
+H5E_OBJOPEN_g=
+
+/* Function entry/exit interface errors */    
+H5E_CANTINIT_g=    
+H5E_ALREADYINIT_g=    
+H5E_CANTRELEASE_g=
 
 /* Datatype conversion errors */    
 H5E_CANTCONVERT_g=    
-H5E_BADSIZE_g= (-1);
+H5E_BADSIZE_g=
+
+/* No error */    
+H5E_NONE_MINOR_g=
+
+/* Object atom related errors */    
+H5E_BADATOM_g=    
+H5E_BADGROUP_g=    
+H5E_CANTREGISTER_g=    
+H5E_CANTINC_g=    
+H5E_CANTDEC_g=    
+H5E_NOIDS_g= (-1);
 
 #endif /* H5Eterm_H */
diff --git a/src/H5Gent.c b/src/H5Gent.c
index feaf9f9cf5..a2a94bffde 100644
--- a/src/H5Gent.c
+++ b/src/H5Gent.c
@@ -354,143 +354,6 @@ H5G__ent_reset(H5G_entry_t *ent)
     FUNC_LEAVE_NOAPI_VOID
 } /* end H5G__ent_reset() */
 
-/*-------------------------------------------------------------------------
- * Function:    H5G__ent_convert
- *
- * Purpose:     Convert a link to a symbol table entry
- *
- * Return:	Success:	Non-negative
- *		Failure:	Negative
- *
- * Programmer:  Quincey Koziol
- *              Sep 20 2005
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5G__ent_convert(H5F_t *f, H5HL_t *heap, const char *name, const H5O_link_t *lnk, H5O_type_t obj_type,
-                 const void *crt_info, H5G_entry_t *ent)
-{
-    size_t name_offset;         /* Offset of name in heap */
-    herr_t ret_value = SUCCEED; /* Return value */
-
-    FUNC_ENTER_PACKAGE
-
-    /* check arguments */
-    HDassert(f);
-    HDassert(heap);
-    HDassert(name);
-    HDassert(lnk);
-
-    /* Reset the new entry */
-    H5G__ent_reset(ent);
-
-    /* Add the new name to the heap */
-    if (H5HL_insert(f, heap, HDstrlen(name) + 1, name, &name_offset) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert symbol name into heap")
-    ent->name_off = name_offset;
-
-    /* Build correct information for symbol table entry based on link type */
-    switch (lnk->type) {
-        case H5L_TYPE_HARD:
-            if (obj_type == H5O_TYPE_GROUP) {
-                const H5G_obj_create_t *gcrt_info = (const H5G_obj_create_t *)crt_info;
-
-                ent->type = gcrt_info->cache_type;
-                if (ent->type != H5G_NOTHING_CACHED)
-                    ent->cache = gcrt_info->cache;
-#ifndef NDEBUG
-                else {
-                    /* Make sure there is no stab message in the target object
-                     */
-                    H5O_loc_t targ_oloc;   /* Location of link target */
-                    htri_t    stab_exists; /* Whether the target symbol table exists */
-
-                    /* Build target object location */
-                    if (H5O_loc_reset(&targ_oloc) < 0)
-                        HGOTO_ERROR(H5E_SYM, H5E_CANTRESET, FAIL, "unable to initialize target location")
-                    targ_oloc.file = f;
-                    targ_oloc.addr = lnk->u.hard.addr;
-
-                    /* Check if a symbol table message exists */
-                    if ((stab_exists = H5O_msg_exists(&targ_oloc, H5O_STAB_ID)) < 0)
-                        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to check for STAB message")
-
-                    HDassert(!stab_exists);
-                } /* end else */
-#endif            /* NDEBUG */
-            }     /* end if */
-            else if (obj_type == H5O_TYPE_UNKNOWN) {
-                /* Try to retrieve symbol table information for caching */
-                H5O_loc_t  targ_oloc;   /* Location of link target */
-                H5O_t     *oh;          /* Link target object header */
-                H5O_stab_t stab;        /* Link target symbol table */
-                htri_t     stab_exists; /* Whether the target symbol table exists */
-
-                /* Build target object location */
-                if (H5O_loc_reset(&targ_oloc) < 0)
-                    HGOTO_ERROR(H5E_SYM, H5E_CANTRESET, FAIL, "unable to initialize target location")
-                targ_oloc.file = f;
-                targ_oloc.addr = lnk->u.hard.addr;
-
-                /* Get the object header */
-                if (NULL == (oh = H5O_protect(&targ_oloc, 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 */
-                if ((stab_exists = H5O_msg_exists_oh(oh, H5O_STAB_ID)) < 0) {
-                    if (H5O_unprotect(&targ_oloc, oh, H5AC__NO_FLAGS_SET) < 0)
-                        HERROR(H5E_SYM, H5E_CANTUNPROTECT, "unable to release object header");
-                    HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to check for STAB message")
-                } /* end if */
-
-                if (stab_exists) {
-                    /* Read symbol table message */
-                    if (NULL == H5O_msg_read_oh(f, oh, H5O_STAB_ID, &stab)) {
-                        if (H5O_unprotect(&targ_oloc, oh, H5AC__NO_FLAGS_SET) < 0)
-                            HERROR(H5E_SYM, H5E_CANTUNPROTECT, "unable to release object header");
-                        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to read STAB message")
-                    } /* end if */
-
-                    /* Cache symbol table message */
-                    ent->type                  = H5G_CACHED_STAB;
-                    ent->cache.stab.btree_addr = stab.btree_addr;
-                    ent->cache.stab.heap_addr  = stab.heap_addr;
-                } /* end if */
-                else
-                    /* No symbol table message, don't cache anything */
-                    ent->type = H5G_NOTHING_CACHED;
-
-                if (H5O_unprotect(&targ_oloc, oh, H5AC__NO_FLAGS_SET) < 0)
-                    HGOTO_ERROR(H5E_SYM, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
-            } /* end else */
-            else
-                ent->type = H5G_NOTHING_CACHED;
-
-            ent->header = lnk->u.hard.addr;
-            break;
-
-        case H5L_TYPE_SOFT: {
-            size_t lnk_offset; /* Offset to sym-link value	*/
-
-            /* Insert link value into local heap */
-            if (H5HL_insert(f, heap, HDstrlen(lnk->u.soft.name) + 1, lnk->u.soft.name, &lnk_offset) < 0)
-                HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to write link value to local heap")
-
-            ent->type                    = H5G_CACHED_SLINK;
-            ent->cache.slink.lval_offset = lnk_offset;
-        } break;
-
-        case H5L_TYPE_ERROR:
-        case H5L_TYPE_EXTERNAL:
-        case H5L_TYPE_MAX:
-        default:
-            HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "unrecognized link type")
-    } /* end switch */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5G__ent_convert() */
 
 /*-------------------------------------------------------------------------
  * Function:    H5G__ent_debug
@@ -562,3 +425,76 @@ H5G__ent_debug(const H5G_entry_t *ent, FILE *stream, int indent, int fwidth, con
 
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5G__ent_debug() */
+
+/*-------------------------------------------------------------------------
+ * Function:    H5G__ent_to_link
+ *
+ * Purpose:     Convert a symbol table entry to a link
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__ent_to_link(const H5G_entry_t *ent, const H5HL_t *heap, H5O_link_t *lnk)
+{
+    const char *name;                /* Pointer to link name in heap */
+    size_t      block_size;          /* Size of the heap block */
+    bool        dup_soft  = false;   /* xstrdup the symbolic link name or not */
+    herr_t      ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check arguments */
+    assert(ent);
+    assert(heap);
+    assert(lnk);
+
+    /* Get the size of the heap block */
+    block_size = H5HL_heap_get_size(heap);
+
+    /* Get pointer to link's name in the heap */
+    if (NULL == (name = (const char *)H5HL_offset_into(heap, ent->name_off)))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to get symbol table link name");
+
+    /* Set (default) common info for link */
+    lnk->cset         = H5F_DEFAULT_CSET;
+    lnk->corder       = 0;
+    lnk->corder_valid = false; /* Creation order not valid for this link */
+    if (NULL == (lnk->name = H5MM_strndup(name, (block_size - ent->name_off))))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to duplicate link name");
+
+    /* Object is a symbolic or hard link */
+    if (ent->type == H5G_CACHED_SLINK) {
+        const char *s; /* Pointer to link value */
+
+        if (NULL == (s = (const char *)H5HL_offset_into(heap, ent->cache.slink.lval_offset)))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to get symbolic link name");
+
+        /* Copy the link value */
+        if (NULL == (lnk->u.soft.name = H5MM_strndup(s, (block_size - ent->cache.slink.lval_offset))))
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to duplicate symbolic link name");
+
+        dup_soft = true;
+
+        /* Set link type */
+        lnk->type = H5L_TYPE_SOFT;
+    } /* end if */
+    else {
+        /* Set address of object */
+        lnk->u.hard.addr = ent->header;
+
+        /* Set link type */
+        lnk->type = H5L_TYPE_HARD;
+    } /* end else */
+
+done:
+    if (ret_value < 0) {
+        if (lnk->name)
+            H5MM_xfree(lnk->name);
+        if (ent->type == H5G_CACHED_SLINK && dup_soft)
+            H5MM_xfree(lnk->u.soft.name);
+    }
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__ent_to_link() */
diff --git a/src/H5Glink.c b/src/H5Glink.c
index cd01bc986d..87b909017a 100644
--- a/src/H5Glink.c
+++ b/src/H5Glink.c
@@ -188,72 +188,6 @@ H5G_link_cmp_corder_dec(const void *lnk1, const void *lnk2)
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5G_link_cmp_corder_dec() */
 
-/*-------------------------------------------------------------------------
- * Function:	H5G__ent_to_link
- *
- * Purpose:     Convert a symbol table entry to a link
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	Quincey Koziol
- *		Sep 16 2006
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5G__ent_to_link(H5O_link_t *lnk, const H5HL_t *heap, const H5G_entry_t *ent, const char *name)
-{
-    hbool_t dup_soft  = FALSE;   /* xstrdup the symbolic link name or not */
-    herr_t  ret_value = SUCCEED; /* Return value */
-
-    FUNC_ENTER_PACKAGE
-
-    /* check arguments */
-    HDassert(lnk);
-    HDassert(heap);
-    HDassert(ent);
-    HDassert(name);
-
-    /* Set (default) common info for link */
-    lnk->cset         = H5F_DEFAULT_CSET;
-    lnk->corder       = 0;
-    lnk->corder_valid = FALSE; /* Creation order not valid for this link */
-    if ((lnk->name = H5MM_xstrdup(name)) == NULL)
-        HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "unable to duplicate link name")
-
-    /* Object is a symbolic or hard link */
-    if (ent->type == H5G_CACHED_SLINK) {
-        const char *s; /* Pointer to link value */
-
-        if ((s = (const char *)H5HL_offset_into(heap, ent->cache.slink.lval_offset)) == NULL)
-            HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "unable to get symbolic link name")
-
-        /* Copy the link value */
-        if ((lnk->u.soft.name = H5MM_xstrdup(s)) == NULL)
-            HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "unable to duplicate symbolic link name")
-
-        dup_soft = TRUE;
-
-        /* Set link type */
-        lnk->type = H5L_TYPE_SOFT;
-    } /* end if */
-    else {
-        /* Set address of object */
-        lnk->u.hard.addr = ent->header;
-
-        /* Set link type */
-        lnk->type = H5L_TYPE_HARD;
-    } /* end else */
-
-done:
-    if (ret_value < 0) {
-        if (lnk->name)
-            H5MM_xfree(lnk->name);
-        if (ent->type == H5G_CACHED_SLINK && dup_soft)
-            H5MM_xfree(lnk->u.soft.name);
-    }
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5G__ent_to_link() */
 
 /*-------------------------------------------------------------------------
  * Function:	H5G_link_to_info
@@ -332,6 +266,140 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5G_link_to_info() */
 
+/*-------------------------------------------------------------------------
+ * Function:    H5G__link_to_ent
+ *
+ * Purpose:     Convert a link to a symbol table entry
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__link_to_ent(H5F_t *f, H5HL_t *heap, const H5O_link_t *lnk, H5O_type_t obj_type, const void *crt_info,
+                 H5G_entry_t *ent)
+{
+    size_t name_offset;         /* Offset of name in heap */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check arguments */
+    assert(f);
+    assert(heap);
+    assert(lnk && lnk->name);
+
+    /* Reset the new entry */
+    H5G__ent_reset(ent);
+
+    /* Add the new name to the heap */
+    if (H5HL_insert(f, heap, strlen(lnk->name) + 1, lnk->name, &name_offset) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert symbol name into heap");
+    ent->name_off = name_offset;
+
+    /* Build correct information for symbol table entry based on link type */
+    switch (lnk->type) {
+        case H5L_TYPE_HARD:
+            if (obj_type == H5O_TYPE_GROUP) {
+                const H5G_obj_create_t *gcrt_info = (const H5G_obj_create_t *)crt_info;
+
+                ent->type = gcrt_info->cache_type;
+                if (ent->type != H5G_NOTHING_CACHED)
+                    ent->cache = gcrt_info->cache;
+#ifndef NDEBUG
+                else {
+                    /* Make sure there is no stab message in the target object
+                     */
+                    H5O_loc_t targ_oloc;   /* Location of link target */
+                    htri_t    stab_exists; /* Whether the target symbol table exists */
+
+                    /* Build target object location */
+                    if (H5O_loc_reset(&targ_oloc) < 0)
+                        HGOTO_ERROR(H5E_SYM, H5E_CANTRESET, FAIL, "unable to initialize target location");
+                    targ_oloc.file = f;
+                    targ_oloc.addr = lnk->u.hard.addr;
+
+                    /* Check if a symbol table message exists */
+                    if ((stab_exists = H5O_msg_exists(&targ_oloc, H5O_STAB_ID)) < 0)
+                        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to check for STAB message");
+
+                    assert(!stab_exists);
+                } /* end else */
+#endif            /* NDEBUG */
+            }     /* end if */
+            else if (obj_type == H5O_TYPE_UNKNOWN) {
+                /* Try to retrieve symbol table information for caching */
+                H5O_loc_t  targ_oloc;   /* Location of link target */
+                H5O_t     *oh;          /* Link target object header */
+                H5O_stab_t stab;        /* Link target symbol table */
+                htri_t     stab_exists; /* Whether the target symbol table exists */
+
+                /* Build target object location */
+                if (H5O_loc_reset(&targ_oloc) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTRESET, FAIL, "unable to initialize target location");
+                targ_oloc.file = f;
+                targ_oloc.addr = lnk->u.hard.addr;
+
+                /* Get the object header */
+                if (NULL == (oh = H5O_protect(&targ_oloc, 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 */
+                if ((stab_exists = H5O_msg_exists_oh(oh, H5O_STAB_ID)) < 0) {
+                    if (H5O_unprotect(&targ_oloc, oh, H5AC__NO_FLAGS_SET) < 0)
+                        HERROR(H5E_SYM, H5E_CANTUNPROTECT, "unable to release object header");
+                    HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to check for STAB message");
+                } /* end if */
+
+                if (stab_exists) {
+                    /* Read symbol table message */
+                    if (NULL == H5O_msg_read_oh(f, oh, H5O_STAB_ID, &stab)) {
+                        if (H5O_unprotect(&targ_oloc, oh, H5AC__NO_FLAGS_SET) < 0)
+                            HERROR(H5E_SYM, H5E_CANTUNPROTECT, "unable to release object header");
+                        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to read STAB message");
+                    } /* end if */
+
+                    /* Cache symbol table message */
+                    ent->type                  = H5G_CACHED_STAB;
+                    ent->cache.stab.btree_addr = stab.btree_addr;
+                    ent->cache.stab.heap_addr  = stab.heap_addr;
+                } /* end if */
+                else
+                    /* No symbol table message, don't cache anything */
+                    ent->type = H5G_NOTHING_CACHED;
+
+                if (H5O_unprotect(&targ_oloc, oh, H5AC__NO_FLAGS_SET) < 0)
+                    HGOTO_ERROR(H5E_SYM, H5E_CANTUNPROTECT, FAIL, "unable to release object header");
+            } /* end else */
+            else
+                ent->type = H5G_NOTHING_CACHED;
+
+            ent->header = lnk->u.hard.addr;
+            break;
+
+        case H5L_TYPE_SOFT: {
+            size_t lnk_offset; /* Offset to sym-link value	*/
+
+            /* Insert link value into local heap */
+            if (H5HL_insert(f, heap, strlen(lnk->u.soft.name) + 1, lnk->u.soft.name, &lnk_offset) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to write link value to local heap");
+
+            ent->type                    = H5G_CACHED_SLINK;
+            ent->cache.slink.lval_offset = lnk_offset;
+        } break;
+
+        case H5L_TYPE_ERROR:
+        case H5L_TYPE_EXTERNAL:
+        case H5L_TYPE_MAX:
+        default:
+            HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "unrecognized link type");
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__link_to_ent() */
+
 /*-------------------------------------------------------------------------
  * Function:	H5G__link_to_loc
  *
diff --git a/src/H5Gloc.c b/src/H5Gloc.c
index 84e8fffa93..f2001cdede 100644
--- a/src/H5Gloc.c
+++ b/src/H5Gloc.c
@@ -539,7 +539,7 @@ H5G__loc_insert(H5G_loc_t *grp_loc, char *name, H5G_loc_t *obj_loc, H5O_type_t o
     lnk.u.hard.addr  = obj_loc->oloc->addr;
 
     /* Insert new group into current group's symbol table */
-    if (H5G_obj_insert(grp_loc->oloc, name, &lnk, TRUE, obj_type, crt_info) < 0)
+    if (H5G_obj_insert(grp_loc->oloc, &lnk, true, obj_type, crt_info) < 0)
         HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert object")
 
     /* Set the name of the object location */
@@ -626,6 +626,68 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5G_loc_exists() */
 
+/*-------------------------------------------------------------------------
+ * Function:    H5G__loc_addr_cb
+ *
+ * Purpose:     Callback for retrieving the address for an object in a group
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G__loc_addr_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc /*in*/, const char H5_ATTR_UNUSED *name,
+                 const H5O_link_t H5_ATTR_UNUSED *lnk, H5G_loc_t *obj_loc, void *_udata /*in,out*/,
+                 H5G_own_loc_t *own_loc /*out*/)
+{
+    haddr_t *udata = (haddr_t *)_udata; /* User data passed in */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Check if the name in this group resolved to a valid link */
+    if (obj_loc == NULL)
+        *udata = HADDR_UNDEF; /* No object found */
+    else
+        *udata = obj_loc->oloc->addr; /* Set address of object */
+
+    /* Indicate that this callback didn't take ownership of the group *
+     * location for the object */
+    *own_loc = H5G_OWN_NONE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G__loc_addr_cb() */
+
+/*-------------------------------------------------------------------------
+ * Function:    H5G__loc_addr
+ *
+ * Purpose:     Retrieve the information for an object from a group location
+ *              and path to that object
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5G__loc_addr(const H5G_loc_t *loc, const char *name, haddr_t *addr /*out*/)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args. */
+    assert(loc);
+    assert(name && *name);
+    assert(addr);
+
+    /* Traverse group hierarchy to locate object */
+    if (H5G_traverse(loc, name, H5G_TARGET_NORMAL, H5G__loc_addr_cb, addr) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't find object");
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G__loc_addr() */
+
+
 /*-------------------------------------------------------------------------
  * Function:    H5G__loc_info_cb
  *
diff --git a/src/H5Gnode.c b/src/H5Gnode.c
index 20e496de00..a56b495bae 100644
--- a/src/H5Gnode.c
+++ b/src/H5Gnode.c
@@ -367,6 +367,7 @@ H5G_node_cmp2(void *_lt_key, void *_udata, void *_rt_key)
     H5G_node_key_t  *lt_key = (H5G_node_key_t *)_lt_key;
     H5G_node_key_t  *rt_key = (H5G_node_key_t *)_rt_key;
     const char      *s1, *s2;
+    size_t           max_len;
     int              ret_value = SUCCEED; /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
@@ -382,8 +383,14 @@ H5G_node_cmp2(void *_lt_key, void *_udata, void *_rt_key)
     if ((s2 = (const char *)H5HL_offset_into(udata->heap, rt_key->offset)) == NULL)
         HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to get key name")
 
+    /* Compute maximum length of string to compare */
+    if (rt_key->offset > lt_key->offset)
+        max_len = udata->block_size - rt_key->offset;
+    else
+        max_len = udata->block_size - lt_key->offset;
+
     /* Set return value */
-    ret_value = HDstrcmp(s1, s2);
+    ret_value = HDstrncmp(s1, s2, max_len);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -432,13 +439,13 @@ H5G_node_cmp3(void *_lt_key, void *_udata, void *_rt_key)
     /* left side */
     if ((s = (const char *)H5HL_offset_into(udata->heap, lt_key->offset)) == NULL)
         HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to get key name")
-    if (HDstrcmp(udata->name, s) <= 0)
+        if (HDstrncmp(udata->name, s, (udata->block_size - lt_key->offset)) <= 0)
         ret_value = (-1);
     else {
         /* right side */
         if ((s = (const char *)H5HL_offset_into(udata->heap, rt_key->offset)) == NULL)
             HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to get key name")
-        if (HDstrcmp(udata->name, s) > 0)
+        if (HDstrncmp(udata->name, s, (udata->block_size - rt_key->offset)) > 0)
             ret_value = 1;
     } /* end else */
 
@@ -505,7 +512,7 @@ H5G_node_found(H5F_t *f, haddr_t addr, const void H5_ATTR_UNUSED *_lt_key, void
 
         if ((s = (const char *)H5HL_offset_into(udata->common.heap, sn->entry[idx].name_off)) == NULL)
             HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to get symbol table name")
-        cmp = HDstrcmp(udata->common.name, s);
+            cmp = HDstrncmp(udata->common.name, s, (udata->common.block_size - sn->entry[idx].name_off));
 
         if (cmp < 0)
             rt = idx;
@@ -602,7 +609,7 @@ H5G__node_insert(H5F_t *f, haddr_t addr, void H5_ATTR_UNUSED *_lt_key, hbool_t H
             HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5B_INS_ERROR, "unable to get symbol table name")
 
         /* Check if symbol is already present */
-        if (0 == (cmp = HDstrcmp(udata->common.name, s)))
+        if (0 == (cmp = HDstrncmp(udata->common.name, s, (udata->common.block_size - sn->entry[idx].name_off))))
             HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, H5B_INS_ERROR, "symbol is already present in symbol table")
 
         if (cmp < 0)
@@ -613,8 +620,7 @@ H5G__node_insert(H5F_t *f, haddr_t addr, void H5_ATTR_UNUSED *_lt_key, hbool_t H
     idx += cmp > 0 ? 1 : 0;
 
     /* Convert link information & name to symbol table entry */
-    if (H5G__ent_convert(f, udata->common.heap, udata->common.name, udata->lnk, udata->obj_type,
-                         udata->crt_info, &ent) < 0)
+    if (H5G__link_to_ent(f, udata->common.heap, udata->lnk, udata->obj_type, udata->crt_info, &ent) < 0)
         HGOTO_ERROR(H5E_SYM, H5E_CANTCONVERT, H5B_INS_ERROR, "unable to convert link")
 
     /* Determine where to place entry in node */
@@ -759,7 +765,7 @@ H5G_node_remove(H5F_t *f, haddr_t addr, void *_lt_key /*in,out*/,
             idx = (lt + rt) / 2;
             if ((s = (const char *)H5HL_offset_into(udata->common.heap, sn->entry[idx].name_off)) == NULL)
                 HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5B_INS_ERROR, "unable to get symbol table name")
-            cmp = HDstrcmp(udata->common.name, s);
+            cmp = HDstrncmp(udata->common.name, s, (udata->common.block_size - sn->entry[idx].name_off));
             if (cmp < 0)
                 rt = idx;
             else
@@ -772,7 +778,11 @@ H5G_node_remove(H5F_t *f, haddr_t addr, void *_lt_key /*in,out*/,
         /* Get a pointer to the name of the link */
         if (NULL == (lnk.name = (char *)H5HL_offset_into(udata->common.heap, sn->entry[idx].name_off)))
             HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5B_INS_ERROR, "unable to get link name")
-        link_name_len = HDstrlen(lnk.name) + 1;
+
+        /* Compute the size of the link name in the heap, being defensive about corrupted data */
+        link_name_len = HDstrnlen(lnk.name, (udata->common.block_size - sn->entry[idx].name_off)) + 1;
+        if (link_name_len > (udata->common.block_size - sn->entry[idx].name_off))
+            link_name_len = (udata->common.block_size - sn->entry[idx].name_off);
 
         /* Set up rest of link structure */
         lnk.corder_valid = FALSE;
@@ -809,8 +819,13 @@ H5G_node_remove(H5F_t *f, haddr_t addr, void *_lt_key /*in,out*/,
             /* Remove the soft link's value from the local heap */
             if (lnk.u.soft.name) {
                 size_t soft_link_len; /* Length of string in local heap */
+                /* Compute the size of the soft link name in the heap, being defensive about corrupted data */
+                soft_link_len = HDstrnlen(lnk.u.soft.name,
+                                        (udata->common.block_size - sn->entry[idx].cache.slink.lval_offset)) +
+                                1;
+                if (soft_link_len > (udata->common.block_size - sn->entry[idx].cache.slink.lval_offset))
+                    soft_link_len = (udata->common.block_size - sn->entry[idx].cache.slink.lval_offset);
 
-                soft_link_len = HDstrlen(lnk.u.soft.name) + 1;
                 if (H5HL_remove(f, udata->common.heap, sn->entry[idx].cache.slink.lval_offset,
                                 soft_link_len) < 0)
                     HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, H5B_INS_ERROR,
@@ -947,15 +962,10 @@ H5G__node_iterate(H5F_t *f, const void H5_ATTR_UNUSED *_lt_key, haddr_t addr,
         if (udata->skip > 0)
             --udata->skip;
         else {
-            H5O_link_t  lnk;  /* Link for entry */
-            const char *name; /* Pointer to link name in heap */
-
-            /* Get the pointer to the name of the link in the heap */
-            if ((name = (const char *)H5HL_offset_into(udata->heap, ents[u].name_off)) == NULL)
-                HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5_ITER_ERROR, "unable to get symbol table node name")
+ 	    H5O_link_t lnk; /* Link for entry */
 
             /* Convert the entry to a link */
-            if (H5G__ent_to_link(&lnk, udata->heap, &ents[u], name) < 0)
+	    if (H5G__ent_to_link(&ents[u], udata->heap, &lnk) < 0)
                 HGOTO_ERROR(H5E_SYM, H5E_CANTCONVERT, H5_ITER_ERROR,
                             "unable to convert symbol table entry to link")
 
@@ -1180,7 +1190,6 @@ H5G__node_copy(H5F_t *f, const void H5_ATTR_UNUSED *_lt_key, haddr_t addr, const
     H5G_bt_it_cpy_t *udata    = (H5G_bt_it_cpy_t *)_udata;
     const H5O_loc_t *src_oloc = udata->src_oloc;
     H5O_copy_t      *cpy_info = udata->cpy_info;
-    H5HL_t          *heap     = NULL;
     H5G_node_t      *sn       = NULL;
     unsigned int     i; /* Local index variable */
     int              ret_value = H5_ITER_CONT;
@@ -1191,32 +1200,30 @@ H5G__node_copy(H5F_t *f, const void H5_ATTR_UNUSED *_lt_key, haddr_t addr, const
     HDassert(f);
     HDassert(H5F_addr_defined(addr));
     HDassert(udata);
+    HDassert(udata->src_heap);
 
     /* load the symbol table into memory from the source file */
     if (NULL == (sn = (H5G_node_t *)H5AC_protect(f, H5AC_SNODE, addr, f, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node")
 
-    /* get the base address of the heap */
-    if (NULL == (heap = H5HL_protect(f, udata->src_heap_addr, H5AC__READ_ONLY_FLAG)))
-        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, H5_ITER_ERROR, "unable to protect symbol name")
-
     /* copy object in this node one by one */
     for (i = 0; i < sn->nsyms; i++) {
         H5G_entry_t *src_ent =
             &(sn->entry[i]);             /* Convenience variable to refer to current source group entry */
         H5O_link_t          lnk;         /* Link to insert */
-        const char         *name;        /* Name of source object */
+        char         *name;        /* Name of source object */
         H5G_entry_t         tmp_src_ent; /* Temporary copy. Change will not affect the cache */
         H5O_type_t          obj_type = H5O_TYPE_UNKNOWN; /* Target object type */
         H5G_copy_file_ud_t *cpy_udata;                   /* Copy file udata */
         H5G_obj_create_t    gcrt_info;                   /* Group creation info */
+        size_t              max_link_len;                /* Max. length of string in local heap */
 
         /* expand soft link */
         if (H5G_CACHED_SLINK == src_ent->type && cpy_info->expand_soft_link) {
-            H5O_info_t oinfo;     /* Information about object pointed to by soft link */
-            H5G_loc_t  grp_loc;   /* Group location holding soft link */
-            H5G_name_t grp_path;  /* Path for group holding soft link */
-            char      *link_name; /* Pointer to value of soft link */
+            haddr_t    obj_addr = HADDR_UNDEF; /* Address of object pointed to by soft link */
+            H5G_loc_t  grp_loc;                /* Group location holding soft link */
+            H5G_name_t grp_path;               /* Path for group holding soft link */
+            char      *link_name;              /* Pointer to value of soft link */
 
             /* Make a temporary copy, so that it will not change the info in the cache */
             H5MM_memcpy(&tmp_src_ent, src_ent, sizeof(H5G_entry_t));
@@ -1228,20 +1235,25 @@ H5G__node_copy(H5F_t *f, const void H5_ATTR_UNUSED *_lt_key, haddr_t addr, const
             grp_loc.oloc = (H5O_loc_t *)src_oloc;
             H5_GCC_CLANG_DIAG_ON("cast-qual")
 
-            /* Get pointer to link value in local heap */
-            if ((link_name = (char *)H5HL_offset_into(heap, tmp_src_ent.cache.slink.lval_offset)) == NULL)
-                HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, H5_ITER_ERROR, "unable to get link name")
+            if ((link_name =
+                     (char *)H5HL_offset_into(udata->src_heap, tmp_src_ent.cache.slink.lval_offset)) == NULL)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5_ITER_ERROR, "unable to get link name");
+
+            /* Sanity check soft link name, to detect running off the end of the heap block */
+            max_link_len = udata->src_block_size - tmp_src_ent.cache.slink.lval_offset;
+            if (strnlen(link_name, max_link_len) == max_link_len)
+                HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, H5_ITER_ERROR, "invalid link name offset");
 
             /* Check if the object pointed by the soft link exists in the source file */
             /* Only basic information is needed */
-            if (H5G_loc_info(&grp_loc, link_name, &oinfo, H5O_INFO_BASIC) >= 0) {
-                tmp_src_ent.header = oinfo.addr;
+            if (H5G__loc_addr(&grp_loc, link_name, &obj_addr) < 0)
+                HGOTO_ERROR(H5E_SYM, H5E_CANTFIND, H5_ITER_ERROR,
+                            "unable to check if soft link resolves to an object");
+            if (H5F_addr_defined(obj_addr)) {
+                tmp_src_ent.header = obj_addr;
                 src_ent            = &tmp_src_ent;
             } /* end if */
-            else
-                H5E_clear_stack(NULL); /* discard any errors from a dangling soft link */
-        }                              /* if ((H5G_CACHED_SLINK == src_ent->type)... */
-
+        }     /* if ((H5G_CACHED_SLINK == src_ent->type)... */
         /* Check if object in source group is a hard link */
         if (H5F_addr_defined(src_ent->header)) {
             H5O_loc_t new_dst_oloc; /* Copied object location in destination */
@@ -1281,28 +1293,39 @@ H5G__node_copy(H5F_t *f, const void H5_ATTR_UNUSED *_lt_key, haddr_t addr, const
 
             /* Construct link information for eventual insertion */
             lnk.type = H5L_TYPE_SOFT;
-            if ((lnk.u.soft.name = (char *)H5HL_offset_into(heap, src_ent->cache.slink.lval_offset)) == NULL)
+            if ((lnk.u.soft.name =
+                     (char *)H5HL_offset_into(udata->src_heap, src_ent->cache.slink.lval_offset)) == NULL)
                 HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, H5_ITER_ERROR, "unable to get link name")
+
+            /* Sanity check soft link name, to detect running off the end of the heap block */
+            max_link_len = udata->src_block_size - src_ent->cache.slink.lval_offset;
+            if (strnlen(lnk.u.soft.name, max_link_len) == max_link_len)
+                HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, H5_ITER_ERROR, "invalid link name offset");
         } /* else if */
         else
             HDassert(0 && "Unknown entry type");
 
+        /* Determine name of source object */
+        if ((name = (char *)H5HL_offset_into(udata->src_heap, src_ent->name_off)) == NULL)
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5_ITER_ERROR, "unable to get source object name");
+
+        /* Sanity check soft link name, to detect running off the end of the heap block */
+        max_link_len = udata->src_block_size - src_ent->name_off;
+        if (strnlen(name, max_link_len) == max_link_len)
+            HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, H5_ITER_ERROR, "invalid link name offset");
+
         /* Set up common link data */
         lnk.cset         = H5F_DEFAULT_CSET; /* XXX: Allow user to set this */
         lnk.corder       = 0;                /* Creation order is not tracked for old-style links */
         lnk.corder_valid = FALSE;            /* Creation order is not valid */
-        /* lnk.name = name; */               /* This will be set in callback */
-
-        /* Determine name of source object */
-        if ((name = (const char *)H5HL_offset_into(heap, src_ent->name_off)) == NULL)
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, H5_ITER_ERROR, "unable to get source object name")
+	lnk.name         = name;             /* Name of link */
 
         /* Set copied metadata tag */
         H5_BEGIN_TAG(H5AC__COPIED_TAG);
 
         /* Insert the new object in the destination file's group */
         /* (Don't increment the link count - that's already done above for hard links) */
-        if (H5G__stab_insert_real(udata->dst_file, udata->dst_stab, name, &lnk, obj_type,
+        if (H5G__stab_insert_real(udata->dst_file, udata->dst_stab, &lnk, obj_type,
                                   (obj_type == H5O_TYPE_GROUP ? &gcrt_info : NULL)) < 0)
             HGOTO_ERROR_TAG(H5E_DATATYPE, H5E_CANTINIT, H5_ITER_ERROR, "unable to insert the name")
 
@@ -1312,9 +1335,6 @@ H5G__node_copy(H5F_t *f, const void H5_ATTR_UNUSED *_lt_key, haddr_t addr, const
     } /* end of for (i=0; i<sn->nsyms; i++) */
 
 done:
-    if (heap && H5HL_unprotect(heap) < 0)
-        HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5_ITER_ERROR, "unable to unprotect symbol name")
-
     if (sn && H5AC_unprotect(f, H5AC_SNODE, addr, sn, H5AC__NO_FLAGS_SET) < 0)
         HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5_ITER_ERROR, "unable to release object header")
 
@@ -1372,18 +1392,13 @@ H5G__node_build_table(H5F_t *f, const void H5_ATTR_UNUSED *_lt_key, haddr_t addr
 
     /* Iterate over the symbol table node entries, adding to link table */
     for (u = 0; u < sn->nsyms; u++) {
-        const char *name;   /* Pointer to link name in heap */
-        size_t      linkno; /* Link allocated */
-
-        /* Get pointer to link's name in the heap */
-        if ((name = (const char *)H5HL_offset_into(udata->heap, sn->entry[u].name_off)) == NULL)
-            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5_ITER_ERROR, "unable to get symbol table link name")
+        size_t linkno; /* Link allocated */
 
         /* Determine the link to operate on in the table */
         linkno = udata->ltable->nlinks++;
 
         /* Convert the entry to a link */
-        if (H5G__ent_to_link(&udata->ltable->lnks[linkno], udata->heap, &sn->entry[u], name) < 0)
+        if (H5G__ent_to_link(&sn->entry[u], udata->heap, &udata->ltable->lnks[linkno]) < 0)
             HGOTO_ERROR(H5E_SYM, H5E_CANTCONVERT, H5_ITER_ERROR,
                         "unable to convert symbol table entry to link")
     } /* end for */
@@ -1471,7 +1486,8 @@ H5G_node_debug(H5F_t *f, haddr_t addr, FILE *stream, int indent, int fwidth, had
         H5G_bt_common_t udata; /*data to pass through B-tree	*/
 
         H5E_clear_stack(NULL); /* discard that error */
-        udata.heap = heap;
+        udata.heap       = heap;
+        udata.block_size = H5HL_heap_get_size(heap);
         if (H5B_debug(f, addr, stream, indent, fwidth, H5B_SNODE, &udata) < 0)
             HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, FAIL, "unable to debug B-tree node");
     } /* end if */
diff --git a/src/H5Gobj.c b/src/H5Gobj.c
index 7570a4f4a6..cc1f91ea34 100644
--- a/src/H5Gobj.c
+++ b/src/H5Gobj.c
@@ -398,7 +398,7 @@ H5G_obj_stab_to_new_cb(const H5O_link_t *lnk, void *_udata)
 
     /* Insert link into group */
     H5_GCC_CLANG_DIAG_OFF("cast-qual")
-    if (H5G_obj_insert(udata->grp_oloc, lnk->name, (H5O_link_t *)lnk, FALSE, H5O_TYPE_UNKNOWN, NULL) < 0)
+    if (H5G_obj_insert(udata->grp_oloc, (H5O_link_t *)lnk, false, H5O_TYPE_UNKNOWN, NULL) < 0)
         HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, H5_ITER_ERROR, "can't insert link into group")
     H5_GCC_CLANG_DIAG_ON("cast-qual")
 
@@ -410,8 +410,8 @@ done:
  * Function:	H5G_obj_insert
  *
  * Purpose:	Insert a new symbol into the group described by GRP_OLOC.
- *		file F.	 The name of the new symbol is NAME and its symbol
- *		table entry is OBJ_LNK.  Increment the reference
+ *		file F.	 The name of the new symbol is OBJ_LNK->NAME and its
+ *		symbol table entry is OBJ_LNK.  Increment the reference
  *              count for the object the link points if OBJ_LNK is a hard link
  *              and ADJ_LINK is true.
  *
@@ -423,8 +423,8 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5G_obj_insert(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *obj_lnk, hbool_t adj_link,
-               H5O_type_t obj_type, const void *crt_info)
+H5G_obj_insert(const H5O_loc_t *grp_oloc, H5O_link_t *obj_lnk, hbool_t adj_link, H5O_type_t obj_type,
+	       const void *crt_info)
 {
     H5O_pline_t  tmp_pline;             /* Pipeline message */
     H5O_pline_t *pline = NULL;          /* Pointer to pipeline message */
@@ -438,7 +438,6 @@ H5G_obj_insert(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *obj_lnk,
 
     /* check arguments */
     HDassert(grp_oloc && grp_oloc->file);
-    HDassert(name && *name);
     HDassert(obj_lnk);
 
     /* Check if we have information about the number of objects in this group */
@@ -548,7 +547,7 @@ H5G_obj_insert(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *obj_lnk,
              *  group is in the "new format" now and the link info should be
              *  set up, etc.
              */
-            if (H5G_obj_insert(grp_oloc, name, obj_lnk, adj_link, obj_type, crt_info) < 0)
+            if (H5G_obj_insert(grp_oloc, obj_lnk, adj_link, obj_type, crt_info) < 0)
                 HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert link into group")
 
             /* Done with insertion now */
@@ -561,7 +560,7 @@ H5G_obj_insert(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *obj_lnk,
     /* Insert into symbol table or "dense" storage */
     if (use_old_format) {
         /* Insert into symbol table */
-        if (H5G__stab_insert(grp_oloc, name, obj_lnk, obj_type, crt_info) < 0)
+        if (H5G__stab_insert(grp_oloc, obj_lnk, obj_type, crt_info) < 0)
             HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert entry into symbol table")
     } /* end if */
     else {
diff --git a/src/H5Gpkg.h b/src/H5Gpkg.h
index d3aa8afe60..0bb7b5c83c 100644
--- a/src/H5Gpkg.h
+++ b/src/H5Gpkg.h
@@ -154,8 +154,9 @@ typedef struct {
  */
 typedef struct H5G_bt_common_t {
     /* downward */
-    const char *name; /*points to temporary memory         */
-    H5HL_t     *heap; /*symbol table heap             */
+    const char *name;       /* Points to temporary memory */
+    H5HL_t     *heap;       /* Symbol table heap */
+    size_t      block_size; /* Size of the heap block */
 } H5G_bt_common_t;
 
 /*
@@ -213,11 +214,12 @@ typedef struct H5G_bt_it_it_t {
 
 /* Data passed through B-tree iteration for copying copy symbol table content */
 typedef struct H5G_bt_it_cpy_t {
-    const H5O_loc_t  *src_oloc;      /* Source object location */
-    haddr_t           src_heap_addr; /* Heap address of the source symbol table  */
-    H5F_t            *dst_file;      /* File of destination group */
-    const H5O_stab_t *dst_stab;      /* Symbol table message for destination group */
-    H5O_copy_t       *cpy_info;      /* Information for copy operation */
+    const H5O_loc_t  *src_oloc;       /* Source object location */
+    H5HL_t           *src_heap;       /* Heap for the source symbol table  */
+    size_t            src_block_size; /* Size of the heap block */
+    H5F_t            *dst_file;       /* File of destination group */
+    const H5O_stab_t *dst_stab;       /* Symbol table message for destination group */
+    H5O_copy_t       *cpy_info;       /* Information for copy operation */
 } H5G_bt_it_cpy_t;
 
 /* Common information for "by index" lookups in symbol tables */
@@ -349,9 +351,9 @@ H5_DLL const char *H5G__component(const char *name, size_t *size_p);
  */
 H5_DLL herr_t H5G__stab_create(H5O_loc_t *grp_oloc, const H5O_ginfo_t *ginfo, H5O_stab_t *stab);
 H5_DLL herr_t H5G__stab_create_components(H5F_t *f, H5O_stab_t *stab, size_t size_hint);
-H5_DLL herr_t H5G__stab_insert(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *obj_lnk,
-                               H5O_type_t obj_type, const void *crt_info);
-H5_DLL herr_t H5G__stab_insert_real(H5F_t *f, const H5O_stab_t *stab, const char *name, H5O_link_t *obj_lnk,
+H5_DLL herr_t H5G__stab_insert(const H5O_loc_t *grp_oloc, H5O_link_t *obj_lnk, H5O_type_t obj_type,
+                               const void *crt_info);
+H5_DLL herr_t H5G__stab_insert_real(H5F_t *f, const H5O_stab_t *stab, H5O_link_t *obj_lnk,
                                     H5O_type_t obj_type, const void *crt_info);
 H5_DLL herr_t H5G__stab_delete(H5F_t *f, const H5O_stab_t *stab);
 H5_DLL herr_t H5G__stab_iterate(const H5O_loc_t *oloc, H5_iter_order_t order, hsize_t skip, hsize_t *last_lnk,
@@ -381,8 +383,7 @@ H5_DLL void   H5G__ent_reset(H5G_entry_t *ent);
 H5_DLL herr_t H5G__ent_decode_vec(const H5F_t *f, const uint8_t **pp, const uint8_t *p_end, H5G_entry_t *ent,
                                   unsigned n);
 H5_DLL herr_t H5G__ent_encode_vec(const H5F_t *f, uint8_t **pp, const H5G_entry_t *ent, unsigned n);
-H5_DLL herr_t H5G__ent_convert(H5F_t *f, H5HL_t *heap, const char *name, const H5O_link_t *lnk,
-                               H5O_type_t obj_type, const void *crt_info, H5G_entry_t *ent);
+H5_DLL herr_t H5G__ent_to_link(const H5G_entry_t *ent, const H5HL_t *heap, H5O_link_t *lnk);
 H5_DLL herr_t H5G__ent_debug(const H5G_entry_t *ent, FILE *stream, int indent, int fwidth,
                              const H5HL_t *heap);
 
@@ -399,7 +400,8 @@ H5_DLL herr_t H5G__node_iterate_size(H5F_t *f, const void *_lt_key, haddr_t addr
 H5_DLL herr_t H5G__node_free(H5G_node_t *sym);
 
 /* Functions that understand links in groups */
-H5_DLL herr_t H5G__ent_to_link(H5O_link_t *lnk, const H5HL_t *heap, const H5G_entry_t *ent, const char *name);
+H5_DLL herr_t H5G__link_to_ent(H5F_t *f, H5HL_t *heap, const H5O_link_t *lnk, H5O_type_t obj_type,
+                               const void *crt_info, H5G_entry_t *ent);
 H5_DLL herr_t H5G__link_to_loc(const H5G_loc_t *grp_loc, const H5O_link_t *lnk, H5G_loc_t *obj_loc);
 H5_DLL herr_t H5G__link_sort_table(H5G_link_table_t *ltable, H5_index_t idx_type, H5_iter_order_t order);
 H5_DLL herr_t H5G__link_iterate_table(const H5G_link_table_t *ltable, hsize_t skip, hsize_t *last_lnk,
@@ -469,6 +471,7 @@ H5_DLL herr_t H5G__name_init(H5G_name_t *name, const char *path);
  */
 H5_DLL herr_t H5G__loc_insert(H5G_loc_t *grp_loc, char *name, H5G_loc_t *obj_loc, H5O_type_t obj_type,
                               const void *crt_info);
+H5_DLL herr_t H5G__loc_addr(const H5G_loc_t *loc, const char *name, haddr_t *addr /*out*/);
 
 /* Testing functions */
 #ifdef H5G_TESTING
diff --git a/src/H5Gprivate.h b/src/H5Gprivate.h
index 8063a5b8ef..61aced37c1 100644
--- a/src/H5Gprivate.h
+++ b/src/H5Gprivate.h
@@ -224,8 +224,8 @@ H5_DLL herr_t H5G_link_to_info(const struct H5O_link_t *lnk, H5L_info_t *linfo);
 /*
  * Functions that understand group objects
  */
-H5_DLL herr_t  H5G_obj_insert(const struct H5O_loc_t *grp_oloc, const char *name, struct H5O_link_t *obj_lnk,
-                              hbool_t adj_link, H5O_type_t obj_type, const void *crt_info);
+H5_DLL herr_t H5G_obj_insert(const struct H5O_loc_t *grp_oloc, struct H5O_link_t *obj_lnk, bool adj_link,
+                             H5O_type_t obj_type, const void *crt_info);
 H5_DLL ssize_t H5G_obj_get_name_by_idx(const struct H5O_loc_t *oloc, H5_index_t idx_type,
                                        H5_iter_order_t order, hsize_t n, char *name, size_t size);
 H5_DLL herr_t  H5G_obj_remove(const struct H5O_loc_t *oloc, H5RS_str_t *grp_full_path_r, const char *name);
diff --git a/src/H5Gstab.c b/src/H5Gstab.c
index 01f8ae05aa..97bc514647 100644
--- a/src/H5Gstab.c
+++ b/src/H5Gstab.c
@@ -241,8 +241,8 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5G__stab_insert_real(H5F_t *f, const H5O_stab_t *stab, const char *name, H5O_link_t *obj_lnk,
-                      H5O_type_t obj_type, const void *crt_info)
+H5G__stab_insert_real(H5F_t *f, const H5O_stab_t *stab, H5O_link_t *obj_lnk, H5O_type_t obj_type,
+                      const void *crt_info)
 {
     H5HL_t      *heap = NULL;         /* Pointer to local heap */
     H5G_bt_ins_t udata;               /* Data to pass through B-tree	*/
@@ -253,7 +253,6 @@ H5G__stab_insert_real(H5F_t *f, const H5O_stab_t *stab, const char *name, H5O_li
     /* check arguments */
     HDassert(f);
     HDassert(stab);
-    HDassert(name && *name);
     HDassert(obj_lnk);
 
     /* Pin the heap down in memory */
@@ -261,11 +260,12 @@ H5G__stab_insert_real(H5F_t *f, const H5O_stab_t *stab, const char *name, H5O_li
         HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
 
     /* Initialize data to pass through B-tree */
-    udata.common.name = name;
-    udata.common.heap = heap;
-    udata.lnk         = obj_lnk;
-    udata.obj_type    = obj_type;
-    udata.crt_info    = crt_info;
+    udata.common.name       = obj_lnk->name;
+    udata.common.heap       = heap;
+    udata.common.block_size = H5HL_heap_get_size(heap);
+    udata.lnk               = obj_lnk;
+    udata.obj_type          = obj_type;
+    udata.crt_info          = crt_info;
 
     /* Insert into symbol table */
     if (H5B_insert(f, H5B_SNODE, stab->btree_addr, &udata) < 0)
@@ -282,9 +282,7 @@ done:
 /*-------------------------------------------------------------------------
  * Function:	H5G__stab_insert
  *
- * Purpose:	Insert a new symbol into the table described by GRP_ENT in
- *		file F.	 The name of the new symbol is NAME and its symbol
- *		table entry is OBJ_ENT.
+ * Purpose:    Insert a new link, OBJ_LNK, into the group, GRP_OLOC.
  *
  * Return:	Non-negative on success/Negative on failure
  *
@@ -294,8 +292,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5G__stab_insert(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *obj_lnk, H5O_type_t obj_type,
-                 const void *crt_info)
+H5G__stab_insert(const H5O_loc_t *grp_oloc, H5O_link_t *obj_lnk, H5O_type_t obj_type, const void *crt_info)
 {
     H5O_stab_t stab;                /* Symbol table message		*/
     herr_t     ret_value = SUCCEED; /* Return value */
@@ -304,15 +301,14 @@ H5G__stab_insert(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *obj_ln
 
     /* check arguments */
     HDassert(grp_oloc && grp_oloc->file);
-    HDassert(name && *name);
     HDassert(obj_lnk);
 
     /* Retrieve symbol table message */
     if (NULL == H5O_msg_read(grp_oloc, H5O_STAB_ID, &stab))
         HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "not a symbol table")
 
-    if (H5G__stab_insert_real(grp_oloc->file, &stab, name, obj_lnk, obj_type, crt_info) < 0)
-        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5_ITER_ERROR, "unable to insert the name")
+    if (H5G__stab_insert_real(grp_oloc->file, &stab, obj_lnk, obj_type, crt_info) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5_ITER_ERROR, "unable to insert the link");
 
 done:
     FUNC_LEAVE_NOAPI_TAG(ret_value)
@@ -352,9 +348,10 @@ H5G__stab_remove(const H5O_loc_t *loc, H5RS_str_t *grp_full_path_r, const char *
         HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
 
     /* Initialize data to pass through B-tree */
-    udata.common.name     = name;
-    udata.common.heap     = heap;
-    udata.grp_full_path_r = grp_full_path_r;
+    udata.common.name       = name;
+    udata.common.heap       = heap;
+    udata.common.block_size = H5HL_heap_get_size(heap);
+    udata.grp_full_path_r   = grp_full_path_r;
 
     /* Remove from symbol table */
     if (H5B_remove(loc->file, H5B_SNODE, stab.btree_addr, &udata) < 0)
@@ -409,9 +406,10 @@ H5G__stab_remove_by_idx(const H5O_loc_t *grp_oloc, H5RS_str_t *grp_full_path_r,
         HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
 
     /* Initialize data to pass through B-tree */
-    udata.common.name     = obj_lnk.name;
-    udata.common.heap     = heap;
-    udata.grp_full_path_r = grp_full_path_r;
+    udata.common.name       = obj_lnk.name;
+    udata.common.heap       = heap;
+    udata.common.block_size = H5HL_heap_get_size(heap);
+    udata.grp_full_path_r   = grp_full_path_r;
 
     /* Remove link from symbol table */
     if (H5B_remove(grp_oloc->file, H5B_SNODE, stab.btree_addr, &udata) < 0)
@@ -678,6 +676,7 @@ H5G_stab_get_name_by_idx_cb(const H5G_entry_t *ent, void *_udata)
     H5G_bt_it_gnbi_t *udata = (H5G_bt_it_gnbi_t *)_udata;
     size_t            name_off;            /* Offset of name in heap */
     const char       *name;                /* Pointer to name string in heap */
+    size_t            block_size;          /* Size of the heap block */
     herr_t            ret_value = SUCCEED; /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
@@ -686,13 +685,16 @@ H5G_stab_get_name_by_idx_cb(const H5G_entry_t *ent, void *_udata)
     HDassert(ent);
     HDassert(udata && udata->heap);
 
+    /* Get the size of the heap block */
+    block_size = H5HL_heap_get_size(udata->heap);
+
     /* Get name offset in heap */
     name_off = ent->name_off;
 
     if ((name = (const char *)H5HL_offset_into(udata->heap, name_off)) == NULL)
         HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to get symbol table link name")
 
-    if ((udata->name = H5MM_strdup(name)) == NULL)
+    if (NULL == (udata->name = H5MM_strndup(name, (block_size - name_off))))
         HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to duplicate symbol table link name")
 
 done:
@@ -812,7 +814,7 @@ H5G_stab_lookup_cb(const H5G_entry_t *ent, void *_udata)
     /* Check for setting link info */
     if (udata->lnk)
         /* Convert the entry to a link */
-        if (H5G__ent_to_link(udata->lnk, udata->heap, ent, udata->name) < 0)
+        if (H5G__ent_to_link(ent, udata->heap, udata->lnk) < 0)
             HGOTO_ERROR(H5E_SYM, H5E_CANTCONVERT, FAIL, "unable to convert symbol table entry to link")
 
 done:
@@ -861,10 +863,11 @@ H5G__stab_lookup(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *lnk)
     udata.heap = heap;
 
     /* Set up the user data for actual B-tree find operation */
-    bt_udata.common.name = name;
-    bt_udata.common.heap = heap;
-    bt_udata.op          = H5G_stab_lookup_cb;
-    bt_udata.op_data     = &udata;
+    bt_udata.common.name       = name;
+    bt_udata.common.heap       = heap;
+    bt_udata.common.block_size = H5HL_heap_get_size(heap);
+    bt_udata.op                = H5G_stab_lookup_cb;
+    bt_udata.op_data           = &udata;
 
     /* Search the B-tree */
     if ((ret_value = H5B_find(grp_oloc->file, H5B_SNODE, stab.btree_addr, &bt_udata)) < 0)
@@ -895,8 +898,7 @@ done:
 static herr_t
 H5G_stab_lookup_by_idx_cb(const H5G_entry_t *ent, void *_udata)
 {
-    H5G_bt_it_lbi_t *udata = (H5G_bt_it_lbi_t *)_udata;
-    const char      *name;                /* Pointer to name string in heap */
+    H5G_bt_it_lbi_t *udata     = (H5G_bt_it_lbi_t *)_udata;
     herr_t           ret_value = SUCCEED; /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
@@ -905,12 +907,8 @@ H5G_stab_lookup_by_idx_cb(const H5G_entry_t *ent, void *_udata)
     HDassert(ent);
     HDassert(udata && udata->heap);
 
-    /* Get a pointer to the link name */
-    if ((name = (const char *)H5HL_offset_into(udata->heap, ent->name_off)) == NULL)
-        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to get symbol table link name")
-
     /* Convert the entry to a link */
-    if (H5G__ent_to_link(udata->lnk, udata->heap, ent, name) < 0)
+    if (H5G__ent_to_link(ent, udata->heap, udata->lnk) < 0)
         HGOTO_ERROR(H5E_SYM, H5E_CANTCONVERT, FAIL, "unable to convert symbol table entry to link")
     udata->found = TRUE;
 
diff --git a/src/H5Gtest.c b/src/H5Gtest.c
index 404bfadcbf..d73da48dee 100644
--- a/src/H5Gtest.c
+++ b/src/H5Gtest.c
@@ -801,10 +801,10 @@ H5G__verify_cached_stabs_test(hid_t gid)
 {
     H5G_t          *grp = NULL; /* Group */
     htri_t          stab_exists;
-    H5O_stab_t      stab;                     /* Symbol table message */
-    H5G_bt_common_t udata     = {NULL, NULL}; /* Dummy udata so H5B_iterate doesn't freak out */
-    haddr_t         prev_tag  = HADDR_UNDEF;  /* Previous metadata tag */
-    herr_t          ret_value = SUCCEED;      /* Return value */
+    H5O_stab_t      stab;                        /* Symbol table message */
+    H5G_bt_common_t udata     = {NULL, NULL, 0}; /* Dummy udata so H5B_iterate doesn't freak out */
+    haddr_t         prev_tag  = HADDR_UNDEF;     /* Previous metadata tag */
+    herr_t          ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_PACKAGE
 
diff --git a/src/H5HG.c b/src/H5HG.c
index 7461a9de76..80b0750e74 100644
--- a/src/H5HG.c
+++ b/src/H5HG.c
@@ -593,6 +593,11 @@ H5HG_read(H5F_t *f, H5HG_t *hobj, void *object /*out*/, size_t *buf_size)
     HDassert(f);
     HDassert(hobj);
 
+    /* Heap object idx 0 is the free space in the heap and should never be given out */
+    if (0 == hobj->idx)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "bad heap index, heap object = {%" PRIxHADDR ", %zu}",
+                    hobj->addr, hobj->idx);
+
     /* Load the heap */
     if (NULL == (heap = H5HG__protect(f, hobj->addr, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect global heap")
@@ -666,6 +671,11 @@ H5HG_link(H5F_t *f, const H5HG_t *hobj, int adjust)
     if (0 == (H5F_INTENT(f) & H5F_ACC_RDWR))
         HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "no write intent on file")
 
+    /* Heap object idx 0 is the free space in the heap and should never be given out */
+    if (0 == hobj->idx)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, FAIL, "bad heap index, heap object = {%" PRIxHADDR ", %zu}",
+                    hobj->addr, hobj->idx);
+
     /* Load the heap */
     if (NULL == (heap = H5HG__protect(f, hobj->addr, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect global heap")
@@ -717,6 +727,11 @@ H5HG_get_obj_size(H5F_t *f, H5HG_t *hobj, size_t *obj_size)
     HDassert(hobj);
     HDassert(obj_size);
 
+    /* Heap object idx 0 is the free space in the heap and should never be given out */
+    if (0 == hobj->idx)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, FAIL, "bad heap index, heap object = {%" PRIxHADDR ", %zu}",
+                    hobj->addr, hobj->idx);
+
     /* Load the heap */
     if (NULL == (heap = H5HG__protect(f, hobj->addr, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect global heap")
@@ -764,6 +779,11 @@ H5HG_remove(H5F_t *f, H5HG_t *hobj)
     if (0 == (H5F_INTENT(f) & H5F_ACC_RDWR))
         HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "no write intent on file")
 
+    /* Heap object idx 0 is the free space in the heap and should never be given out */
+    if (0 == hobj->idx)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, FAIL, "bad heap index, heap object = {%" PRIxHADDR ", %zu}",
+                    hobj->addr, hobj->idx);
+
     /* Load the heap */
     if (NULL == (heap = H5HG__protect(f, hobj->addr, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect global heap")
diff --git a/src/H5HL.c b/src/H5HL.c
index 8a59d0474e..6037e4899e 100644
--- a/src/H5HL.c
+++ b/src/H5HL.c
@@ -306,13 +306,11 @@ done:
 H5HL_t *
 H5HL_protect(H5F_t *f, haddr_t addr, unsigned flags)
 {
-    H5HL_cache_prfx_ud_t prfx_udata;                /* User data for protecting local heap prefix       */
-    H5HL_prfx_t         *prfx = NULL;               /* Local heap prefix                                */
-    H5HL_dblk_t         *dblk = NULL;               /* Local heap data block                            */
-    H5HL_t              *heap = NULL;               /* Heap data structure                              */
-    unsigned prfx_cache_flags = H5AC__NO_FLAGS_SET; /* Cache flags for unprotecting prefix entry        */
-    unsigned dblk_cache_flags = H5AC__NO_FLAGS_SET; /* Cache flags for unprotecting data block entry    */
-    H5HL_t  *ret_value        = NULL;
+    H5HL_cache_prfx_ud_t prfx_udata;       /* User data for protecting local heap prefix       */
+    H5HL_prfx_t         *prfx      = NULL; /* Local heap prefix                                */
+    H5HL_dblk_t         *dblk      = NULL; /* Local heap data block                            */
+    H5HL_t              *heap      = NULL; /* Heap data structure                              */
+    H5HL_t              *ret_value = NULL;
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -339,19 +337,25 @@ H5HL_protect(H5F_t *f, haddr_t addr, unsigned flags)
     /* Check if the heap is already pinned in memory */
     /* (for re-entrant situation) */
     if (heap->prots == 0) {
+        void *pin_obj; /* Pointer to local heap object to pin */
+
         /* Check if heap has separate data block */
         if (heap->single_cache_obj)
-            /* Set the flag for pinning the prefix when unprotecting it */
-            prfx_cache_flags |= H5AC__PIN_ENTRY_FLAG;
+            /* Pin prefix */
+            pin_obj = prfx;
         else {
             /* Protect the local heap data block */
             if (NULL ==
                 (dblk = (H5HL_dblk_t *)H5AC_protect(f, H5AC_LHEAP_DBLK, heap->dblk_addr, heap, flags)))
                 HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to load heap data block");
 
-            /* Set the flag for pinning the data block when unprotecting it */
-            dblk_cache_flags |= H5AC__PIN_ENTRY_FLAG;
+            /* Pin data block */
+            pin_obj = dblk;
         }
+
+        /* Pin local heap object */
+        if (H5AC_pin_protected_entry(pin_obj) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTPIN, NULL, "unable to pin local heap object");
     }
 
     /* Increment # of times heap is protected */
@@ -362,11 +366,11 @@ H5HL_protect(H5F_t *f, haddr_t addr, unsigned flags)
 
 done:
     /* Release the prefix from the cache, now pinned */
-    if (prfx && heap && H5AC_unprotect(f, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, prfx_cache_flags) < 0)
+    if (prfx && heap && H5AC_unprotect(f, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, H5AC__NO_FLAGS_SET) < 0)
         HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, NULL, "unable to release local heap prefix");
 
     /* Release the data block from the cache, now pinned */
-    if (dblk && heap && H5AC_unprotect(f, H5AC_LHEAP_DBLK, heap->dblk_addr, dblk, dblk_cache_flags) < 0)
+    if (dblk && heap && H5AC_unprotect(f, H5AC_LHEAP_DBLK, heap->dblk_addr, dblk, H5AC__NO_FLAGS_SET) < 0)
         HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, NULL, "unable to release local heap data block");
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -945,6 +949,26 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5HL_delete() */
 
+/*-------------------------------------------------------------------------
+ * Function:    H5HL_heap_get_size
+ *
+ * Purpose:     Retrieves the current size of a heap's block
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5HL_heap_get_size(const H5HL_t *heap)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    assert(heap);
+
+    FUNC_LEAVE_NOAPI(heap->dblk_size)
+} /* end H5HL_heap_get_size() */
+
 /*-------------------------------------------------------------------------
  * Function:    H5HL_get_size
  *
diff --git a/src/H5HLcache.c b/src/H5HLcache.c
index dcf1249dda..1758159cc4 100644
--- a/src/H5HLcache.c
+++ b/src/H5HLcache.c
@@ -241,7 +241,7 @@ H5HL__fl_deserialize(H5HL_t *heap)
         const uint8_t *image; /* Pointer into image buffer */
 
         /* Sanity check */
-        if (free_block >= heap->dblk_size)
+        if ((free_block + (2 * heap->sizeof_size)) > heap->dblk_size)
             HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "bad heap free list");
 
         /* Allocate & initialize free list node */
diff --git a/src/H5HLprivate.h b/src/H5HLprivate.h
index 51e7e992b0..70ecf906a3 100644
--- a/src/H5HLprivate.h
+++ b/src/H5HLprivate.h
@@ -54,6 +54,7 @@ typedef struct H5HL_t H5HL_t;
  */
 H5_DLL herr_t  H5HL_create(H5F_t *f, size_t size_hint, haddr_t *addr /*out*/);
 H5_DLL herr_t  H5HL_delete(H5F_t *f, haddr_t addr);
+H5_DLL size_t  H5HL_heap_get_size(const H5HL_t *heap);
 H5_DLL herr_t  H5HL_get_size(H5F_t *f, haddr_t addr, size_t *size);
 H5_DLL herr_t  H5HL_heapsize(H5F_t *f, haddr_t addr, hsize_t *heap_size);
 H5_DLL herr_t  H5HL_insert(H5F_t *f, H5HL_t *heap, size_t size, const void *buf, size_t *offset);
diff --git a/src/H5L.c b/src/H5L.c
index d670365743..248b6342a1 100644
--- a/src/H5L.c
+++ b/src/H5L.c
@@ -1625,7 +1625,7 @@ H5L__link_cb(H5G_loc_t *grp_loc /*in*/, const char *name, const H5O_link_t H5_AT
     H5_GCC_CLANG_DIAG_ON("cast-qual")
 
     /* Insert link into group */
-    if (H5G_obj_insert(grp_loc->oloc, name, udata->lnk, TRUE,
+    if (H5G_obj_insert(grp_loc->oloc, udata->lnk, TRUE,
                        udata->ocrt_info ? udata->ocrt_info->obj_type : H5O_TYPE_UNKNOWN,
                        udata->ocrt_info ? udata->ocrt_info->crt_info : NULL) < 0)
         HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create new link for object")
@@ -2406,7 +2406,7 @@ H5L__move_dest_cb(H5G_loc_t *grp_loc /*in*/, const char *name, const H5O_link_t
     H5_GCC_CLANG_DIAG_ON("cast-qual")
 
     /* Insert the link into the group */
-    if (H5G_obj_insert(grp_loc->oloc, name, udata->lnk, TRUE, H5O_TYPE_UNKNOWN, NULL) < 0)
+    if (H5G_obj_insert(grp_loc->oloc, udata->lnk, TRUE, H5O_TYPE_UNKNOWN, NULL) < 0)
         HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create new link to object")
 
     /* If the link was a user-defined link, call its move callback if it has one */
diff --git a/src/H5Ocache.c b/src/H5Ocache.c
index b32b82ff9e..230ef4e064 100644
--- a/src/H5Ocache.c
+++ b/src/H5Ocache.c
@@ -336,6 +336,10 @@ H5O__cache_deserialize(const void *image, size_t len, void *_udata, hbool_t *dir
                                &(udata->common), dirty) < 0)
         HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't deserialize first object header chunk")
 
+    /* Check for corruption in object header # of messages */
+    if (oh->version == H5O_VERSION_1 && udata->v1_pfx_nmesgs < oh->nmesgs)
+        HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "bad object header message count");
+
     /* Note that we've loaded the object header from the file */
     udata->made_attempt = TRUE;
 
diff --git a/src/H5Ocopy.c b/src/H5Ocopy.c
index 2d458fcba8..90c61fd006 100644
--- a/src/H5Ocopy.c
+++ b/src/H5Ocopy.c
@@ -501,6 +501,12 @@ H5O__copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/, H5
         /* Get message class to operate on */
         copy_type = mesg_src->type;
 
+        /* Sanity check message for possible corruption */
+        if (H5O_UNKNOWN_ID != mesg_src->type->id && H5O_NULL_ID != mesg_src->type->id)
+            if (0 == mesg_src->raw_size)
+                HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "message of type '%s' has zero size",
+                            mesg_src->type->name);
+
         /* Check for continuation message; these are converted to NULL
          * messages because the destination OH will have only one chunk
          */
diff --git a/src/H5Odtype.c b/src/H5Odtype.c
index 16a12eb95c..65fb83c5ae 100644
--- a/src/H5Odtype.c
+++ b/src/H5Odtype.c
@@ -359,6 +359,7 @@ H5O_dtype_decode_helper(H5F_t *f, unsigned *ioflags /*in,out*/, const uint8_t **
                 hsize_t  dim[H5O_LAYOUT_NDIMS];  /* Dimensions of the array */
                 H5T_t   *array_dt;               /* Temporary pointer to the array datatype */
                 H5T_t   *temp_type;              /* Temporary pointer to the field's datatype */
+                unsigned memb_idx;               /* Local index counter */
 
                 /* Get the length of the field name */
                 if (!skip) {
@@ -377,10 +378,19 @@ H5O_dtype_decode_helper(H5F_t *f, unsigned *ioflags /*in,out*/, const uint8_t **
                      */
                     actual_name_length = HDstrlen((const char *)*pp);
                 }
+                if (0 == actual_name_length)
+                    HGOTO_ERROR(H5E_OHDR, H5E_BADSIZE, FAIL, "0 length enum name");
 
                 if (H5_IS_KNOWN_BUFFER_OVERFLOW(skip, *pp, actual_name_length, p_end))
                     HGOTO_ERROR(H5E_OHDR, H5E_OVERFLOW, FAIL, "ran off end of input buffer while decoding");
 
+                /* Check for duplicated field name */
+                for (memb_idx = 0; memb_idx < dt->shared->u.compnd.nmembs; memb_idx++)
+                    if (0 == strcmp((const char *)*pp, dt->shared->u.compnd.memb[memb_idx].name))
+                        HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL,
+                                    "duplicated compound field name '%s', for fields %u and %u",
+                                    (const char *)*pp, memb_idx, dt->shared->u.compnd.nmembs);
+
                 /* Decode the field name */
                 if (NULL == (dt->shared->u.compnd.memb[dt->shared->u.compnd.nmembs].name =
                                  H5MM_xstrdup((const char *)*pp)))
@@ -497,6 +507,18 @@ H5O_dtype_decode_helper(H5F_t *f, unsigned *ioflags /*in,out*/, const uint8_t **
                 if (version == H5O_DTYPE_VERSION_1) {
                     /* Check if this member is an array field */
                     if (ndims > 0) {
+                        /* Validate decoded dims */
+                        for (unsigned u = 0; u < ndims; u++)
+                            if (!(dim[u] > 0)) {
+                                dt->shared->u.compnd.memb[dt->shared->u.compnd.nmembs].name =
+                                    H5MM_xfree(dt->shared->u.compnd.memb[dt->shared->u.compnd.nmembs].name);
+                                if (H5T_close_real(temp_type) < 0)
+                                    HDONE_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, FAIL,
+                                                "can't release datatype info");
+                                HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, FAIL,
+                                            "zero-sized dimension specified");
+                            }
+
                         /* Create the array datatype for the field */
                         if ((array_dt = H5T__array_create(temp_type, ndims, dim)) == NULL) {
                             dt->shared->u.compnd.memb[dt->shared->u.compnd.nmembs].name =
diff --git a/src/H5Oefl.c b/src/H5Oefl.c
index af8f83b4f0..2f70c84978 100644
--- a/src/H5Oefl.c
+++ b/src/H5Oefl.c
@@ -80,9 +80,10 @@ H5O_efl_decode(H5F_t *f, H5O_t H5_ATTR_UNUSED *open_oh, unsigned H5_ATTR_UNUSED
 {
     H5O_efl_t     *mesg = NULL;
     int            version;
-    const uint8_t *p_end     = p + p_size - 1; /* pointer to last byte in p */
-    const char    *s         = NULL;
-    H5HL_t        *heap      = NULL;
+    const uint8_t *p_end = p + p_size - 1; /* pointer to last byte in p */
+    const char    *s     = NULL;
+    H5HL_t        *heap  = NULL;
+    size_t         block_size;       /* Size of the heap block */
     void          *ret_value = NULL; /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
@@ -140,6 +141,8 @@ H5O_efl_decode(H5F_t *f, H5O_t H5_ATTR_UNUSED *open_oh, unsigned H5_ATTR_UNUSED
     if (*s != '\0')
         HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "entry at offset 0 in local heap not an empty string")
 #endif
+    /* Get the size of the heap block */
+    block_size = H5HL_heap_get_size(heap);
 
     for (size_t u = 0; u < mesg->nused; u++) {
         /* Name */
@@ -151,7 +154,7 @@ H5O_efl_decode(H5F_t *f, H5O_t H5_ATTR_UNUSED *open_oh, unsigned H5_ATTR_UNUSED
             HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to get external file name")
         if (*s == '\0')
             HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "invalid external file name")
-        mesg->slot[u].name = H5MM_xstrdup(s);
+        mesg->slot[u].name = H5MM_strndup(s, (block_size - mesg->slot[u].name_offset));
         if (mesg->slot[u].name == NULL)
             HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, NULL, "string duplication failed")
 
@@ -391,36 +394,38 @@ H5O__efl_reset(void *_mesg)
 /*-------------------------------------------------------------------------
  * Function:	H5O_efl_total_size
  *
- * Purpose:	Return the total size of the external file list by summing
+ * Purpose:	Query the total size of the external file list by summing
  *		the sizes of all of the files.
  *
- * Return:	Success:	Total reserved size for external data.
- *
- *		Failure:	0
+ * Return:	Non-negative on success/Negative on failure
  *
  * Programmer:	Robb Matzke
  *              Tuesday, March  3, 1998
  *
  *-------------------------------------------------------------------------
  */
-hsize_t
-H5O_efl_total_size(H5O_efl_t *efl)
+herr_t
+H5O_efl_total_size(const H5O_efl_t *efl, hsize_t *size)
 {
-    hsize_t ret_value = 0, tmp;
+    hsize_t total_size = 0, tmp;
+    herr_t  ret_value  = SUCCEED; /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
     if (efl->nused > 0 && H5O_EFL_UNLIMITED == efl->slot[efl->nused - 1].size)
-        ret_value = H5O_EFL_UNLIMITED;
+        *size = H5O_EFL_UNLIMITED;
     else {
         size_t u; /* Local index variable */
 
-        for (u = 0; u < efl->nused; u++, ret_value = tmp) {
-            tmp = ret_value + efl->slot[u].size;
-            if (tmp <= ret_value)
-                HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, 0, "total external storage size overflowed");
+        for (u = 0; u < efl->nused; u++, total_size = tmp) {
+            tmp = total_size + efl->slot[u].size;
+            if (tmp < total_size)
+                HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "total external storage size overflowed");
         } /* end for */
-    }     /* end else */
+
+        /* Set the size to return */
+        *size = total_size;
+    } /* end else */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
diff --git a/src/H5Olayout.c b/src/H5Olayout.c
index 0c5c993f56..3536648ef0 100644
--- a/src/H5Olayout.c
+++ b/src/H5Olayout.c
@@ -43,7 +43,7 @@ static herr_t H5O__layout_pre_copy_file(H5F_t *file_src, const void *mesg_src, h
                                         const H5O_copy_t *cpy_info, void *udata);
 static void  *H5O__layout_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst, hbool_t *recompute_size,
                                     unsigned *mesg_flags, H5O_copy_t *cpy_info, void *udata);
-static herr_t H5O__layout_debug(H5F_t *f, const void *_mesg, FILE *stream, int indent, int fwidth);
+static herr_t H5O__layout_debug(H5F_t H5_ATTR_UNUSED *f, const void *_mesg, FILE *stream, int indent, int fwidth);
 
 /* This message derives from H5O message class */
 const H5O_msg_class_t H5O_MSG_LAYOUT[1] = {{
@@ -1242,8 +1242,8 @@ H5O__layout_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst,
     H5D_copy_file_ud_t *udata      = (H5D_copy_file_ud_t *)_udata; /* Dataset copying user data */
     H5O_layout_t       *layout_src = (H5O_layout_t *)mesg_src;
     H5O_layout_t       *layout_dst = NULL;
-    hbool_t             copied     = FALSE; /* Whether the data was copied */
-    void               *ret_value  = NULL;  /* Return value */
+    bool               copied     = false; /* Whether the data was copied */
+    void               *ret_value  = NULL;   /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -1264,18 +1264,29 @@ H5O__layout_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst,
                 if (H5D__compact_copy(file_src, &layout_src->storage.u.compact, file_dst,
                                       &layout_dst->storage.u.compact, udata->src_dtype, cpy_info) < 0)
                     HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy chunked storage")
-                copied = TRUE;
+		copied = true;
             } /* end if */
             break;
 
-        case H5D_CONTIGUOUS:
+        case H5D_CONTIGUOUS: {
+            hsize_t nelmts;  /* Number of elements in dataset's extent */
+            size_t  dt_size; /* Size of dataset's datatype in bytes */
+            /* Sanity check the dataset's info */
+            if (H5D__contig_check(file_src, layout_src, udata->src_space_extent, udata->src_dtype) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "invalid layout / dataspace / datatype info");
+
             /* Compute the size of the contiguous storage for versions of the
              * layout message less than version 3 because versions 1 & 2 would
              * truncate the dimension sizes to 32-bits of information. - QAK 5/26/04
              */
+	    nelmts  = H5S_extent_nelem(udata->src_space_extent);
+            dt_size = H5T_get_size(udata->src_dtype);
             if (layout_src->version < H5O_LAYOUT_VERSION_3)
-                layout_dst->storage.u.contig.size =
-                    H5S_extent_nelem(udata->src_space_extent) * H5T_get_size(udata->src_dtype);
+                layout_dst->storage.u.contig.size = nelmts * dt_size;
+            else
+                /* Sanity check layout storage size */
+                if (layout_dst->storage.u.contig.size != (nelmts * dt_size))
+                    HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "invalid layout storage size ");
 
             if (H5D__contig_is_space_alloc(&layout_src->storage) ||
                 (cpy_info->shared_fo &&
@@ -1284,9 +1295,9 @@ H5O__layout_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst,
                 if (H5D__contig_copy(file_src, &layout_src->storage.u.contig, file_dst,
                                      &layout_dst->storage.u.contig, udata->src_dtype, cpy_info) < 0)
                     HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy contiguous storage")
-                copied = TRUE;
-            } /* end if */
-            break;
+		copied = true;
+	        } /* end if */
+            } break;
 
         case H5D_CHUNKED:
             if (H5D__chunk_is_space_alloc(&layout_src->storage) ||
@@ -1297,7 +1308,7 @@ H5O__layout_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst,
                                     &layout_dst->storage.u.chunk, udata->src_space_extent, udata->src_dtype,
                                     udata->common.src_pline, cpy_info) < 0)
                     HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy chunked storage")
-                copied = TRUE;
+		copied = true;
             } /* end if */
             break;
 
diff --git a/src/H5Opkg.h b/src/H5Opkg.h
index 0115fd5150..50b182d3ca 100644
--- a/src/H5Opkg.h
+++ b/src/H5Opkg.h
@@ -597,8 +597,8 @@ H5_DLL herr_t H5O_condense_header(H5F_t *f, H5O_t *oh);
 H5_DLL herr_t H5O_release_mesg(H5F_t *f, H5O_t *oh, H5O_mesg_t *mesg, hbool_t adj_link);
 
 /* Shared object operators */
-H5_DLL void  *H5O_shared_decode(H5F_t *f, H5O_t *open_oh, unsigned *ioflags, const uint8_t *buf,
-                                const H5O_msg_class_t *type);
+H5_DLL void  *H5O_shared_decode(H5F_t *f, H5O_t *open_oh, unsigned *ioflags, size_t buf_size,
+                                const uint8_t *buf, const H5O_msg_class_t *type);
 H5_DLL herr_t H5O_shared_encode(const H5F_t *f, uint8_t *buf /*out*/, const H5O_shared_t *sh_mesg);
 H5_DLL size_t H5O_shared_size(const H5F_t *f, const H5O_shared_t *sh_mesg);
 H5_DLL herr_t H5O__shared_delete(H5F_t *f, H5O_t *open_oh, const H5O_msg_class_t *mesg_type,
diff --git a/src/H5Oprivate.h b/src/H5Oprivate.h
index 82f08aa810..fe20340f53 100644
--- a/src/H5Oprivate.h
+++ b/src/H5Oprivate.h
@@ -1000,7 +1000,7 @@ H5_DLL herr_t     H5O_loc_free(H5O_loc_t *loc);
 H5_DLL H5O_loc_t *H5O_get_loc(hid_t id);
 
 /* EFL operators */
-H5_DLL hsize_t H5O_efl_total_size(H5O_efl_t *efl);
+H5_DLL herr_t H5O_efl_total_size(const H5O_efl_t *efl, hsize_t *size);
 
 /* Fill value operators */
 H5_DLL herr_t H5O_fill_reset_dyn(H5O_fill_t *fill);
diff --git a/src/H5Osdspace.c b/src/H5Osdspace.c
index c95f11539e..3031c9ce14 100644
--- a/src/H5Osdspace.c
+++ b/src/H5Osdspace.c
@@ -195,9 +195,6 @@ H5O__sdspace_decode(H5F_t *f, H5O_t H5_ATTR_UNUSED *open_oh, unsigned H5_ATTR_UN
             H5F_DECODE_LENGTH(f, p, sdim->size[i]);
 
         if (flags & H5S_VALID_MAX) {
-            if (NULL == (sdim->max = (hsize_t *)H5FL_ARR_MALLOC(hsize_t, (size_t)sdim->rank)))
-                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, NULL, "memory allocation failed")
-
             /*
              * Ensure that decoding doesn't cause reading past buffer's end,
              * due to possible data corruption - check that we have space to
@@ -206,8 +203,16 @@ H5O__sdspace_decode(H5F_t *f, H5O_t H5_ATTR_UNUSED *open_oh, unsigned H5_ATTR_UN
             if (H5_IS_BUFFER_OVERFLOW(p, (sizeof_size * sdim->rank), p_end))
                 HGOTO_ERROR(H5E_OHDR, H5E_OVERFLOW, NULL, "ran off end of input buffer while decoding")
 
-            for (i = 0; i < sdim->rank; i++)
+            /* Max sizes */
+            if (NULL == (sdim->max = (hsize_t *)H5FL_ARR_MALLOC(hsize_t, (size_t)sdim->rank)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, NULL, "memory allocation failed");
+            for (i = 0; i < sdim->rank; i++) {
                 H5F_DECODE_LENGTH(f, p, sdim->max[i]);
+                if (sdim->size[i] > sdim->max[i])
+                    HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL,
+                                "dataspace dim %u size of %llu is greater than maxdim size of %llu", i,
+                                (unsigned long long)sdim->size[i], (unsigned long long)sdim->max[i]);
+            }
         } /* end if */
     }     /* end if */
 
diff --git a/src/H5Oshared.c b/src/H5Oshared.c
index c6f31bcb7d..f09e2766cd 100644
--- a/src/H5Oshared.c
+++ b/src/H5Oshared.c
@@ -295,12 +295,13 @@ done:
  *-------------------------------------------------------------------------
  */
 void *
-H5O_shared_decode(H5F_t *f, H5O_t *open_oh, unsigned *ioflags, const uint8_t *buf,
+H5O_shared_decode(H5F_t *f, H5O_t *open_oh, unsigned *ioflags, size_t buf_size, const uint8_t *buf,
                   const H5O_msg_class_t *type)
 {
-    H5O_shared_t sh_mesg;          /* Shared message info */
-    unsigned     version;          /* Shared message version */
-    void        *ret_value = NULL; /* Return value */
+    const uint8_t *buf_end = buf + buf_size - 1; /* End of the buffer */
+    H5O_shared_t   sh_mesg;                      /* Shared message info */
+    unsigned       version;                      /* Shared message version */
+    void          *ret_value = NULL;             /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -310,6 +311,8 @@ H5O_shared_decode(H5F_t *f, H5O_t *open_oh, unsigned *ioflags, const uint8_t *bu
     HDassert(type);
 
     /* Version */
+    if (H5_IS_BUFFER_OVERFLOW(buf, 1, buf_end))
+        HGOTO_ERROR(H5E_OHDR, H5E_OVERFLOW, NULL, "ran off end of input buffer while decoding");
     version = *buf++;
     if (version < H5O_SHARED_VERSION_1 || version > H5O_SHARED_VERSION_LATEST)
         HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for shared object message")
@@ -317,6 +320,8 @@ H5O_shared_decode(H5F_t *f, H5O_t *open_oh, unsigned *ioflags, const uint8_t *bu
     /* Get the shared information type
      * Flags are unused before version 3.
      */
+    if (H5_IS_BUFFER_OVERFLOW(buf, 1, buf_end))
+        HGOTO_ERROR(H5E_OHDR, H5E_OVERFLOW, NULL, "ran off end of input buffer while decoding");
     if (version >= H5O_SHARED_VERSION_2)
         sh_mesg.type = *buf++;
     else {
@@ -325,8 +330,11 @@ H5O_shared_decode(H5F_t *f, H5O_t *open_oh, unsigned *ioflags, const uint8_t *bu
     } /* end else */
 
     /* Skip reserved bytes (for version 1) */
-    if (version == H5O_SHARED_VERSION_1)
+    if (version == H5O_SHARED_VERSION_1) {
+        if (H5_IS_BUFFER_OVERFLOW(buf, 6, buf_end))
+            HGOTO_ERROR(H5E_OHDR, H5E_OVERFLOW, NULL, "ran off end of input buffer while decoding");
         buf += 6;
+    }
 
     /* Body */
     if (version == H5O_SHARED_VERSION_1) {
@@ -334,7 +342,11 @@ H5O_shared_decode(H5F_t *f, H5O_t *open_oh, unsigned *ioflags, const uint8_t *bu
         sh_mesg.u.loc.index = 0;
 
         /* Decode stored "symbol table entry" into message location */
+        if (H5_IS_BUFFER_OVERFLOW(buf, H5F_SIZEOF_SIZE(f), buf_end))
+            HGOTO_ERROR(H5E_OHDR, H5E_OVERFLOW, NULL, "ran off end of input buffer while decoding");
         buf += H5F_SIZEOF_SIZE(f); /* Skip over local heap address */
+        if (H5_IS_BUFFER_OVERFLOW(buf, H5F_sizeof_addr(f), buf_end))
+            HGOTO_ERROR(H5E_OHDR, H5E_OVERFLOW, NULL, "ran off end of input buffer while decoding");
         H5F_addr_decode(f, &buf, &(sh_mesg.u.loc.oh_addr));
     } /* end if */
     else if (version >= H5O_SHARED_VERSION_2) {
@@ -343,6 +355,8 @@ H5O_shared_decode(H5F_t *f, H5O_t *open_oh, unsigned *ioflags, const uint8_t *bu
          */
         if (sh_mesg.type == H5O_SHARE_TYPE_SOHM) {
             HDassert(version >= H5O_SHARED_VERSION_3);
+            if (H5_IS_BUFFER_OVERFLOW(buf, sizeof(sh_mesg.u.heap_id), buf_end))
+                HGOTO_ERROR(H5E_OHDR, H5E_OVERFLOW, NULL, "ran off end of input buffer while decoding");
             H5MM_memcpy(&sh_mesg.u.heap_id, buf, sizeof(sh_mesg.u.heap_id));
         } /* end if */
         else {
@@ -353,6 +367,8 @@ H5O_shared_decode(H5F_t *f, H5O_t *open_oh, unsigned *ioflags, const uint8_t *bu
                 sh_mesg.type = H5O_SHARE_TYPE_COMMITTED;
 
             sh_mesg.u.loc.index = 0;
+            if (H5_IS_BUFFER_OVERFLOW(buf, H5F_sizeof_addr(f), buf_end))
+                HGOTO_ERROR(H5E_OHDR, H5E_OVERFLOW, NULL, "ran off end of input buffer while decoding");
             H5F_addr_decode(f, &buf, &sh_mesg.u.loc.oh_addr);
         } /* end else */
     }     /* end else if */
diff --git a/src/H5Oshared.h b/src/H5Oshared.h
index 3fb2f76617..df5d0bbb6e 100644
--- a/src/H5Oshared.h
+++ b/src/H5Oshared.h
@@ -64,7 +64,7 @@ H5O_SHARED_DECODE(H5F_t *f, H5O_t *open_oh, unsigned mesg_flags, unsigned *iofla
     /* Check for shared message */
     if (mesg_flags & H5O_MSG_FLAG_SHARED) {
         /* Retrieve native message info indirectly through shared message */
-        if (NULL == (ret_value = H5O_shared_decode(f, open_oh, ioflags, p, H5O_SHARED_TYPE)))
+        if (NULL == (ret_value = H5O_shared_decode(f, open_oh, ioflags, p_size, p, H5O_SHARED_TYPE)))
             HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, NULL, "unable to decode shared message")
 
             /* We currently do not support automatically fixing shared messages */
diff --git a/src/H5Ostab.c b/src/H5Ostab.c
index 58990622ff..fe336fbc6c 100644
--- a/src/H5Ostab.c
+++ b/src/H5Ostab.c
@@ -354,6 +354,7 @@ H5O__stab_post_copy_file(const H5O_loc_t *src_oloc, const void *mesg_src, H5O_lo
 {
     const H5O_stab_t *stab_src = (const H5O_stab_t *)mesg_src;
     H5O_stab_t       *stab_dst = (H5O_stab_t *)mesg_dst;
+    H5HL_t           *heap      = NULL;    /* Pointer to source group's heap */
     H5G_bt_it_cpy_t   udata;               /* B-tree user data */
     herr_t            ret_value = SUCCEED; /* Return value */
 
@@ -370,18 +371,26 @@ H5O__stab_post_copy_file(const H5O_loc_t *src_oloc, const void *mesg_src, H5O_lo
     if (cpy_info->max_depth >= 0 && cpy_info->curr_depth >= cpy_info->max_depth)
         HGOTO_DONE(SUCCEED)
 
+    /* Get the heap for the copy*/
+    if (NULL == (heap = H5HL_protect(src_oloc->file, stab_src->heap_addr, H5AC__READ_ONLY_FLAG)))
+        HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect local heap");
+
     /* Set up B-tree iteration user data */
-    udata.src_oloc      = src_oloc;
-    udata.src_heap_addr = stab_src->heap_addr;
-    udata.dst_file      = dst_oloc->file;
-    udata.dst_stab      = stab_dst;
-    udata.cpy_info      = cpy_info;
+    udata.src_oloc       = src_oloc;
+    udata.src_heap       = heap;
+    udata.src_block_size = H5HL_heap_get_size(heap);
+    udata.dst_file       = dst_oloc->file;
+    udata.dst_stab       = stab_dst;
+    udata.cpy_info       = cpy_info;
 
     /* Iterate over objects in group, copying them */
     if ((H5B_iterate(src_oloc->file, H5B_SNODE, stab_src->btree_addr, H5G__node_copy, &udata)) < 0)
         HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "iteration operator failed")
 
 done:
+    if (heap && H5HL_unprotect(heap) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CANTUNPROTECT, FAIL, "unable to unprotect local heap");
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5O__stab_post_copy_file() */
 
diff --git a/src/H5S.c b/src/H5S.c
index 8dbc9a14fd..180f309325 100644
--- a/src/H5S.c
+++ b/src/H5S.c
@@ -1250,6 +1250,8 @@ H5Sset_extent_simple(hid_t space_id, int rank, const hsize_t dims[/*rank*/], con
     H5TRACE4("e", "iIs*[a1]h*[a1]h", space_id, rank, dims, max);
 
     /* Check args */
+    if (rank > H5S_MAX_RANK)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "dataspace rank too large: %u", rank);
     if (NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "not a dataspace")
     if (rank > 0 && dims == NULL)
@@ -1689,6 +1691,30 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5S_decode() */
 
+/*-------------------------------------------------------------------------
+ * Function:    H5S_get_simple_extent
+ *
+ * Purpose:     Internal function for retrieving the extent for a dataspace object
+ *
+ * Return:      Success:    Pointer to the extent for a dataspace (not copied)
+ *              Failure:    NULL
+ *
+ * Note:        This routine participates in the "Inlining C function pointers"
+ *              pattern, don't call it directly, use the appropriate macro
+ *              defined in H5Sprivate.h.
+ *
+ *-------------------------------------------------------------------------
+ */
+const H5S_extent_t *
+H5S_get_simple_extent(const H5S_t *space)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    assert(space);
+
+    FUNC_LEAVE_NOAPI(&space->extent)
+} /* end H5S_get_simple_extent() */
+
 /*-------------------------------------------------------------------------
  * Function:    H5S_get_simple_extent_type
  *
diff --git a/src/H5Spoint.c b/src/H5Spoint.c
index 1483269324..0e62c8a9e4 100644
--- a/src/H5Spoint.c
+++ b/src/H5Spoint.c
@@ -1290,6 +1290,9 @@ H5S__point_deserialize(H5S_t **space, const uint8_t **p, const size_t p_size, hb
     if (H5_IS_KNOWN_BUFFER_OVERFLOW(skip, pp, sizeof(uint32_t), p_end))
         HGOTO_ERROR(H5E_DATASPACE, H5E_OVERFLOW, FAIL, "buffer overflow while decoding selection rank")
     UINT32DECODE(pp, rank);
+    if (0 == rank || rank > H5S_MAX_RANK)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, "invalid rank (%u) for serialized point selection",
+                    rank);
 
     if (!*space) {
         /* Patch the rank of the allocated dataspace */
@@ -1312,17 +1315,22 @@ H5S__point_deserialize(H5S_t **space, const uint8_t **p, const size_t p_size, hb
 
     UINT32DECODE(pp, num_elem);
 
-    /* Allocate space for the coordinates */
-    if (NULL == (coord = (hsize_t *)H5MM_malloc(num_elem * rank * sizeof(hsize_t))))
-        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate coordinate information")
-
     /* Determine necessary size of buffer for coordinates */
     size_t enc_type_size                 = sizeof(uint32_t);
     size_t coordinate_buffer_requirement = num_elem * rank * enc_type_size;
 
+    /* Check for overflow during multiplication */
+    if (num_elem != (coordinate_buffer_requirement / (rank * enc_type_size)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_OVERFLOW, FAIL, "size of point selection buffer overflowed");
+
+    /* Check for possible buffer overrun */
     if (H5_IS_KNOWN_BUFFER_OVERFLOW(skip, pp, coordinate_buffer_requirement, p_end))
         HGOTO_ERROR(H5E_DATASPACE, H5E_OVERFLOW, FAIL, "buffer overflow while decoding selection coordinates")
 
+    /* Allocate space for the coordinates */
+    if (NULL == (coord = (hsize_t *)H5MM_malloc(num_elem * rank * sizeof(hsize_t))))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate coordinate information");
+
     /* Retrieve the coordinates from the buffer */
     for (tcoord = coord, i = 0; i < num_elem; i++)
         for (j = 0; j < (unsigned)rank; j++, tcoord++)
diff --git a/src/H5Sprivate.h b/src/H5Sprivate.h
index f3f821aad4..b388b5e7e7 100644
--- a/src/H5Sprivate.h
+++ b/src/H5Sprivate.h
@@ -161,6 +161,7 @@ typedef struct H5S_sel_iter_op_t {
 
 /* If the module using this macro is allowed access to the private variables, access them directly */
 #ifdef H5S_MODULE
+#define H5S_GET_EXTENT(S)                       (&(S)->extent)
 #define H5S_GET_EXTENT_TYPE(S)                  ((S)->extent.type)
 #define H5S_GET_EXTENT_NDIMS(S)                 ((S)->extent.rank)
 #define H5S_GET_EXTENT_NPOINTS(S)               ((S)->extent.nelem)
@@ -188,6 +189,7 @@ typedef struct H5S_sel_iter_op_t {
     ((*(ITER)->type->iter_get_seq_list)(ITER, MAXSEQ, MAXBYTES, NSEQ, NBYTES, OFF, LEN))
 #define H5S_SELECT_ITER_RELEASE(ITER) ((*(ITER)->type->iter_release)(ITER))
 #else /* H5S_MODULE */
+#define H5S_GET_EXTENT(S)                       (H5S_get_simple_extent(S))
 #define H5S_GET_EXTENT_TYPE(S)                  (H5S_get_simple_extent_type(S))
 #define H5S_GET_EXTENT_NDIMS(S)                 (H5S_get_simple_extent_ndims(S))
 #define H5S_GET_EXTENT_NPOINTS(S)               (H5S_get_simple_extent_npoints(S))
@@ -231,13 +233,15 @@ struct H5O_loc_t;
 typedef struct H5S_t H5S_t;
 
 /* Operations on dataspaces */
-H5_DLL H5S_t      *H5S_copy(const H5S_t *src, hbool_t share_selection, hbool_t copy_max);
-H5_DLL herr_t      H5S_close(H5S_t *ds);
-H5_DLL H5S_class_t H5S_get_simple_extent_type(const H5S_t *ds);
-H5_DLL hssize_t    H5S_get_simple_extent_npoints(const H5S_t *ds);
-H5_DLL hsize_t     H5S_get_npoints_max(const H5S_t *ds);
-H5_DLL hbool_t     H5S_has_extent(const H5S_t *ds);
-H5_DLL int         H5S_get_simple_extent_ndims(const H5S_t *ds);
+H5_DLL herr_t              H5S_init(void);
+H5_DLL H5S_t              *H5S_copy(const H5S_t *src, bool share_selection, bool copy_max);
+H5_DLL herr_t              H5S_close(H5S_t *ds);
+H5_DLL const H5S_extent_t *H5S_get_simple_extent(const H5S_t *ds);
+H5_DLL H5S_class_t         H5S_get_simple_extent_type(const H5S_t *ds);
+H5_DLL hssize_t            H5S_get_simple_extent_npoints(const H5S_t *ds);
+H5_DLL hsize_t             H5S_get_npoints_max(const H5S_t *ds);
+H5_DLL bool                H5S_has_extent(const H5S_t *ds);
+H5_DLL int                 H5S_get_simple_extent_ndims(const H5S_t *ds);
 H5_DLL int    H5S_get_simple_extent_dims(const H5S_t *ds, hsize_t dims[] /*out*/, hsize_t max_dims[] /*out*/);
 H5_DLL herr_t H5S_write(H5F_t *f, struct H5O_t *oh, unsigned update_flags, H5S_t *ds);
 H5_DLL herr_t H5S_append(H5F_t *f, struct H5O_t *oh, H5S_t *ds);
diff --git a/src/H5T.c b/src/H5T.c
index 9bc8e8bbbd..58eb030c2b 100644
--- a/src/H5T.c
+++ b/src/H5T.c
@@ -4854,12 +4854,12 @@ H5T__path_find_real(const H5T_t *src, const H5T_t *dst, const char *name, H5T_co
      * Make sure the first entry in the table is the no-op conversion path.
      */
     if (0 == H5T_g.npaths) {
-        if (NULL == (H5T_g.path = (H5T_path_t **)H5MM_malloc(128 * sizeof(H5T_path_t *))))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL,
+        if (NULL == (H5T_g.path = (H5T_path_t **)H5MM_calloc(128 * sizeof(H5T_path_t *))))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, NULL,
                         "memory allocation failed for type conversion path table")
         H5T_g.apaths = 128;
         if (NULL == (H5T_g.path[0] = H5FL_CALLOC(H5T_path_t)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for no-op conversion path")
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, NULL, "memory allocation failed for no-op conversion path")
         HDsnprintf(H5T_g.path[0]->name, sizeof(H5T_g.path[0]->name), "no-op");
         H5T_g.path[0]->conv.is_app     = FALSE;
         H5T_g.path[0]->conv.u.lib_func = H5T__conv_noop;
@@ -5122,6 +5122,75 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5T__path_find_real() */
 
+/*-------------------------------------------------------------------------
+ * Function:    H5T__path_table_search
+ *
+ * Purpose:     Searches the global datatype conversion path table for a
+ *              conversion path between two datatypes.
+ *
+ *              Sets `idx` to be the index of the last table entry compared
+ *              (which will be the index of the matching conversion path on
+ *              success). If no matching path is found, the value for `idx`
+ *              will be the index into the path table where a new path
+ *              entry with source and destination datatypes matching src
+ *              and dst should be inserted. In this case, the caller should
+ *              be sure to increment the index value by 1 if the value of
+ *              the last comparison is > 0.
+ *
+ *              If `last_cmp` is non-NULL, the value of the last comparison
+ *              (-1, 0, or 1) is returned through it.
+ *
+ * Return:    Success:    true (conversion path found, index in *idx)
+ *            Failure:    false (no conversion path between types)
+ *
+ *-------------------------------------------------------------------------
+ */
+static bool
+H5T__path_table_search(const H5T_t *src, const H5T_t *dst, int *idx, int *last_cmp)
+{
+    int  lt, rt, md;        /* Left, middle, and right edges */
+    int  cmp;               /* Comparison result  */
+    bool ret_value = false; /* Return value */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity check */
+    assert(0 != H5T_g.npaths);
+    assert(src);
+    assert(src->shared);
+    assert(dst);
+    assert(dst->shared);
+    assert(idx);
+
+    /* Find the conversion path in the table, using a binary search */
+    /* NOTE: Doesn't match against entry 0, which is the no-op path */
+    lt = md = 1;
+    rt      = H5T_g.npaths;
+    cmp     = -1;
+
+    while (cmp && lt < rt) {
+        md = (lt + rt) / 2;
+        assert(H5T_g.path[md]);
+        cmp = H5T_cmp(src, H5T_g.path[md]->src, false);
+        if (0 == cmp)
+            cmp = H5T_cmp(dst, H5T_g.path[md]->dst, false);
+        if (cmp < 0)
+            rt = md;
+        else if (cmp > 0)
+            lt = md + 1;
+        else
+            /* Match found */
+            ret_value = true;
+    }
+
+    /* Set middle index & comparison values */
+    *idx = md;
+    if (last_cmp)
+        *last_cmp = cmp;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__path_table_search() */
+
 /*-------------------------------------------------------------------------
  * Function:  H5T_path_noop
  *
@@ -5146,6 +5215,47 @@ H5T_path_noop(const H5T_path_t *p)
     FUNC_LEAVE_NOAPI(p->is_noop || (p->is_hard && 0 == H5T_cmp(p->src, p->dst, FALSE)))
 } /* end H5T_path_noop() */
 
+/*-------------------------------------------------------------------------                                                                                                                 
+ * Function:    H5T_noop_conv                                                                                                                                                               
+ *                                                                                                                                                                                          
+ * Purpose:     Check if a conversion between two dataypes will be a no-op                                                                                                                  
+ *                                                                                                                                                                                          
+ * Return:      true / false (can't fail)                                                                                                                                                   
+ *                                                                                                                                                                                          
+ *-------------------------------------------------------------------------                                                                                                                 
+ */
+bool
+H5T_noop_conv(const H5T_t *src, const H5T_t *dst)
+{
+    bool ret_value = false; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    assert(src);
+    assert(src->shared);
+    assert(dst);
+    assert(dst->shared);
+
+    /* Check the conversion path.  If source and destination types are equal                                                                                                                
+     * then its a no-op conversion, as long as neither type has a "force conversion"                                                                                                        
+     * flag.  Otherwise search over the conversion table entries.                                                                                                                           
+     */
+    if (src->shared->force_conv == false && dst->shared->force_conv == false &&
+        0 == H5T_cmp(src, dst, true)) {
+        ret_value = true;
+    } /* end if */
+    else {
+        int idx = 0; /* Matching entry */
+
+	/* Search the table of conversion paths */
+        if (H5T__path_table_search(src, dst, &idx, NULL))
+            ret_value = H5T_path_noop(H5T_g.path[idx]);
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T_noop_conv() */
+
 /*-------------------------------------------------------------------------
  * Function:  H5T_path_compound_subset
  *
@@ -6068,6 +6178,7 @@ H5T_patch_vlen_file(H5T_t *dt, H5F_t *file)
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5T_patch_vlen_file() */
 
+
 /*-------------------------------------------------------------------------
  * Function:    H5T_is_numeric_with_unusual_unused_bits
  *
@@ -6092,7 +6203,14 @@ H5T_is_numeric_with_unusual_unused_bits(const H5T_t *dt)
     assert(dt->shared);
 
     /* Is the correct type? */
-    if (H5T_INTEGER == dt->shared->type || H5T_FLOAT == dt->shared->type || H5T_BITFIELD == dt->shared->type)
+    if (H5T_INTEGER == dt->shared->type || H5T_FLOAT == dt->shared->type ||
+        H5T_BITFIELD == dt->shared->type) {
+#if LDBL_MANT_DIG == 106
+        /* This currently won't work for the IBM long double type */
+        if (H5T_FLOAT == dt->shared->type && dt->shared->size == 16 &&
+            (dt->shared->u.atomic.prec == 64 || dt->shared->u.atomic.prec == 128))
+            HGOTO_DONE(false);
+#endif
 
         /* Has unused bits? */
         if (dt->shared->u.atomic.prec < (dt->shared->size * 8)) {
@@ -6103,6 +6221,7 @@ H5T_is_numeric_with_unusual_unused_bits(const H5T_t *dt)
             if (dt->shared->size > 1 && ((dt->shared->size * 8) > surround_bits))
                 HGOTO_DONE(true);
         }
+    }
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
diff --git a/src/H5Tprivate.h b/src/H5Tprivate.h
index 4b29fa3382..4ba401ffc0 100644
--- a/src/H5Tprivate.h
+++ b/src/H5Tprivate.h
@@ -121,6 +121,7 @@ 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);
 H5_DLL hbool_t            H5T_path_noop(const H5T_path_t *p);
+H5_DLL bool               H5T_noop_conv(const H5T_t *src, const H5T_t *dst);
 H5_DLL H5T_bkg_t          H5T_path_bkg(const H5T_path_t *p);
 H5_DLL H5T_subset_info_t *H5T_path_compound_subset(const H5T_path_t *p);
 H5_DLL herr_t   H5T_convert(H5T_path_t *tpath, hid_t src_id, hid_t dst_id, size_t nelmts, size_t buf_stride,
diff --git a/src/H5Znbit.c b/src/H5Znbit.c
index 25d322ea27..692991c4da 100644
--- a/src/H5Znbit.c
+++ b/src/H5Znbit.c
@@ -981,8 +981,10 @@ H5Z__filter_nbit(unsigned flags, size_t cd_nelmts, const unsigned cd_values[], s
             HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "memory allocation failed for nbit decompression")
 
         /* decompress the buffer */
-        if (H5Z__nbit_decompress(outbuf, d_nelmts, (unsigned char *)*buf, cd_values) < 0)
+        if (H5Z__nbit_decompress(outbuf, d_nelmts, (unsigned char *)*buf, cd_values) < 0) {
+            H5MM_xfree(outbuf);
             HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, 0, "can't decompress buffer")
+	}
     } /* end if */
     /* output; compress */
     else {
@@ -1214,7 +1216,7 @@ 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, member_size, used_size = 0, size;
+    unsigned     i, nmembers, member_offset, member_class, member_size, used_size = 0, prev_used_size, size;
     parms_atomic p;
     herr_t       ret_value = SUCCEED; /* Return value */
 
@@ -1228,10 +1230,15 @@ H5Z__nbit_decompress_one_compound(unsigned char *data, size_t data_offset, unsig
         member_class  = parms[(*parms_index)++];
 
         /* Check for overflow */
-        member_size = parms[*parms_index];
+	member_size    = parms[*parms_index];
+        prev_used_size = used_size;
         used_size += member_size;
         if (used_size > size)
-            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "compound member offset overflowed compound size")
+            HGOTO_ERROR(H5E_PLINE, H5E_BADVALUE, FAIL, "compound member size overflowed compound size");
+        if (used_size <= prev_used_size)
+            HGOTO_ERROR(H5E_PLINE, H5E_BADVALUE, FAIL, "compound member size overflowed compound size");
+        if ((member_offset + member_size) > size)
+            HGOTO_ERROR(H5E_PLINE, H5E_BADRANGE, FAIL, "compound member offset overflowed compound size");
         switch (member_class) {
             case H5Z_NBIT_ATOMIC:
                 p.size = member_size;
diff --git a/src/H5err.txt b/src/H5err.txt
index c3c629e524..a15378c199 100644
--- a/src/H5err.txt
+++ b/src/H5err.txt
@@ -198,6 +198,7 @@ MINOR, BTREE, H5E_CANTINSERT, Unable to insert object
 MINOR, BTREE, H5E_CANTLIST, Unable to list node
 MINOR, BTREE, H5E_CANTMODIFY, Unable to modify record
 MINOR, BTREE, H5E_CANTREMOVE, Unable to remove object
+MINOR, BTREE, H5E_CANTFIND, Unable to check for record
 
 # Object header related errors
 MINOR, OHDR, H5E_LINKCOUNT, Bad object header link count
