diff --git a/attributes/maestro-schema.c b/attributes/maestro-schema.c
index d08fe67b7095cf03bfb267215d1e911b40864504..ac87c0d3e79c38504f2614a78575c289afd29493 100644
--- a/attributes/maestro-schema.c
+++ b/attributes/maestro-schema.c
@@ -730,10 +730,12 @@ mstro_attribute_val__compute_size(enum mstro_stp_val_kind kind,
       *val_size = sizeof(double); break;
     case MSTRO_STP_STR:
     case MSTRO_STP_REGEX: 
-      if(string)
+      if(string!=NULL)
         *val_size = strlen(string)+1;
-      else
+      else {
+	assert(val!=NULL);
         *val_size = strlen((char*)val)+1;
+      }
       break;
     case MSTRO_STP_TIMESTAMP:
       *val_size = sizeof(mstro_timestamp);
diff --git a/configure.ac b/configure.ac
index d0243cd30d83fc04733da09bc838fab245f6490c..5e9274d497216637c1f50b96a494a4ff08fef909 100644
--- a/configure.ac
+++ b/configure.ac
@@ -175,7 +175,8 @@ AC_ARG_ENABLE([tsan],
 if test "x$enable_tsan" = "xyes"; then
         BUILD_TSAN=yes
         AX_CHECK_COMPILE_FLAG([-fsanitize=thread -fno-omit-frame-pointer],
-       		[CFLAGS="${CFLAGS} -O1 -g -fsanitize=thread -fno-omit-frame-pointer"],
+       		[CFLAGS="${CFLAGS} -O1 -g -fsanitize=thread -fno-omit-frame-pointer"
+				LDFLAGS="${LDFLAGS} -fsanitize=thread"],
 		AC_MSG_ERROR([compiler does not support -fsanitize=thread flag]))
 else
         BUILD_TSAN=no
@@ -423,7 +424,9 @@ AS_IF([test "x$enable_ofi_pool_manager" = "xyes"], [
    AS_IF([test ! -f $srcdir/deps/libfabric/configure],
          [(cd $srcdir/deps/libfabric; ./autogen.sh)])
    #AX_SUBDIRS_CONFIGURE([deps/libfabric],[[--enable-embedded],[--disable-rxm],[--disable-rxd],[--disable-psm]],[],[],[])
-   AX_SUBDIRS_CONFIGURE([deps/libfabric],[[--enable-embedded],[--disable-rxd],[--disable-shm],[--disable-tcp],[--enable-debug]],[],[],[])
+   dnl Configuring without kdreg to fix issue https://gitlab.com/cerl/maestro/maestro-core/-/issues/117 which relates to https://github.com/ofiwg/libfabric/issues/5313
+   dnl Whether doing so creates a performance problem or not is still to be determined
+   AX_SUBDIRS_CONFIGURE([deps/libfabric],[[--enable-embedded],[--disable-rxd],[--disable-shm],[--disable-tcp],[--with-kdreg=no],[--enable-debug]],[],[],[])
    AC_MSG_NOTICE([================== done preconfiguring private libfabric library build])
   ])
 
diff --git a/include/maestro/attributes.h b/include/maestro/attributes.h
index 0788c5d2b6f124f4d313a6694c2971dda7dcc31f..5a66bafe6027b168b4c24c97da95f6e3327df601 100644
--- a/include/maestro/attributes.h
+++ b/include/maestro/attributes.h
@@ -314,18 +314,20 @@ typedef struct mstro_cdo_ *mstro_cdo;
 /**
  ** @brief Add (*key*, *val*) pair to attribute set of *cdo*
  **
- ** @param[in] 	cdo	A CDO handle
- ** @param[in]	key	Attribute key string
- ** @param[in]  val	Pointer to the value to be set
+ ** @param[in] 	cdo			A CDO handle
+ ** @param[in]	key			Attribute key string
+ ** @param[in]  val			Pointer to the value to be set
+ ** @param[in]	copy_value  Create an internal allocation for the value and
+ **							copy @arg val into it 
  **
- ** BEWARE: The memory pointed to by val must remain valid for the
- ** entire lifetime of the CDO. Stack-allocated variables passed in by
- ** address are a source of ugly to trace bugs.
+ ** BEWARE: If copy_value is set to false, the memory pointed to by val must
+ ** remain valid for the entire lifetime of the CDO. Stack-allocated variables
+ ** passed in by address are a source of ugly to trace bugs.
  **
  ** @returns A status code, ::MSTRO_OK on success.
  **/
 mstro_status
-mstro_cdo_attribute_set(mstro_cdo cdo, const char* key, void* val);
+mstro_cdo_attribute_set(mstro_cdo cdo, const char* key, void* val, bool copy_value);
 
 /**
  ** @brief Retrieve value into *val_p* associated with *key* of *cdo*.
diff --git a/maestro/attributes.c b/maestro/attributes.c
index 8a3250ad128fbd37cab2f289edaf82a01de5ae32..501170a41d27247172d53cbff399ab8567562a55 100644
--- a/maestro/attributes.c
+++ b/maestro/attributes.c
@@ -127,7 +127,7 @@ mstro_cdo_attr_table__destroy(mstro_cdo_attr_table tab)
 }
 
 mstro_status
-mstro_cdo_attribute_set(mstro_cdo cdo, const char* key, void* val)
+mstro_cdo_attribute_set(mstro_cdo cdo, const char* key, void* val, bool copy_value)
 {
   if(cdo==NULL || key==NULL)
     return MSTRO_INVARG;
@@ -163,7 +163,7 @@ mstro_cdo_attribute_set(mstro_cdo cdo, const char* key, void* val)
   mstro_status status
       = mstro_attribute_dict_set(cdo->attributes, fqkey,
                                  MSTRO_CDO_ATTR_VALUE_INVALID, /* we dont help in checking */
-                                 val, false);
+                                 val, copy_value);
   if(tmpfqkey)
     free(tmpfqkey);
   return status;
diff --git a/maestro/cdo.c b/maestro/cdo.c
index 15c2d4990328c3a8ac3b9f27b54c24ba746d8971..4a340c8a7349e6658470ccf3194d4479ca9435a8 100644
--- a/maestro/cdo.c
+++ b/maestro/cdo.c
@@ -452,10 +452,10 @@ mstro_cdo__create_mamba_array(mstro_cdo cdo)
   int64_t* ndims, *patt, *localsz, *elsz;
   size_t* dimsz;
 
-  DEBUG("Sync'ing mamba_array and attributes (CDO `%s`)\n", cdo->name);
-
   s = mstro_cdo_attribute_get(cdo, MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE, NULL, (const void**)&localsz);
 
+  DEBUG("Sync'ing mamba_array (size: %zu) and attributes (CDO `%s`)\n", (size_t)*localsz, cdo->name);
+
   /* fetching minimal set of attributes for custom layout */
   s |= mstro_cdo_attribute_get(cdo, MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE,
                                NULL, (const void**)&elsz);
@@ -528,6 +528,7 @@ mstro_cdo__create_mamba_array(mstro_cdo cdo)
     }
     
     if(me != MMB_OK) {
+      status = MSTRO_FAIL;
       ERR("Failed to create mamba array\n");
       goto BAILOUT;
     }
@@ -746,8 +747,8 @@ mstro_cdo_declaration_seal(mstro_cdo cdo)
       idstr, &cdo->id,
       DEBUG("CDO %s (id %s) now sealed\n",
            cdo->name, idstr););
-  
-  status = MSTRO_OK;
+
+   status = MSTRO_OK;
 
 BAILOUT:
   return status;
@@ -1850,7 +1851,7 @@ mstro_cdo_allocate_data(mstro_cdo cdo)
                                   MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE,
                                   MSTRO_CDO_ATTR_VALUE_pointer, dimsz, true);
     if (s != MSTRO_OK) {
-      ERR("Can't sync mamba array because attribute_set failed\n");
+      ERR("Can't sync mamba array because dict_set failed\n");
       return MSTRO_FAIL;
     }
   } else {
@@ -1874,6 +1875,7 @@ mstro_cdo_allocate_data(mstro_cdo cdo)
     }
     /* now we know a size */
     int64_t size = *(const int64_t*)valp;
+	DEBUG("size (%" PRIi64 ")\n", size);
  
     if(size<0 && cdo->raw_ptr!=NULL) {
       ERR("CDO |%s| has negative local-size but non-NULL raw-ptr, unsupported\n",
@@ -1886,6 +1888,8 @@ mstro_cdo_allocate_data(mstro_cdo cdo)
       ERR("Failed to create mmbArray wrapper for raw-ptr\n");
       return s;
     }
+	DEBUG("size (%" PRIi64 ")\n", size);
+
   }
   
   return MSTRO_OK;
diff --git a/maestro/groups.c b/maestro/groups.c
index 16d4862aa5903f7652d2d8d555690fa7142267fa..6a7f7cdd65437d85217eec66d871351138520aa1 100644
--- a/maestro/groups.c
+++ b/maestro/groups.c
@@ -204,7 +204,7 @@ mstro_group_declare(const char *name, mstro_group* group)
     if(s==MSTRO_OK) {
       bool trueval = true;
       s = mstro_cdo_attribute_set((*group)->group_cdo,
-                                  MSTRO_ATTR_CORE_CDO_ISGROUP, &trueval);
+                                  MSTRO_ATTR_CORE_CDO_ISGROUP, &trueval, true);
       if(s==MSTRO_OK) {
         DEBUG("Declared CDO group |%s|\n", name);
         (*group)->state = MSTRO_GROUP_STATE_DECLARED;
@@ -312,20 +312,21 @@ mstro_group_seal(mstro_group g)
     HASH_ITER(hh, g->members, el, tmp) {
       m->declared_members[i] = malloc(sizeof(Mstro__Pool__UUID));
       /* need to ensure the GID is ready */
-      mstro_status s = mstro_cdo_seal(el->entry);
-      if(s!=MSTRO_OK) {
-        ERR("Failed to seal declared group member: %d\n", s);
-      }
-      if(s!=MSTRO_OK || m->declared_members[i]==NULL) {
-        for(size_t j=i; j>0; j--) {
-          free(m->declared_members[j-1]);
-        };
-        free(m->declared_members);
-        m->declared_members=NULL;
-        goto BAILOUT_FREE;
-        
+      if(!mstro_cdo_state_check(el->entry, MSTRO_CDO_STATE_SEALED)) {
+        mstro_status s = mstro_cdo_seal(el->entry);
+        if(s!=MSTRO_OK) {
+          ERR("Failed to seal declared group member: %d\n", s);
+        }
+        if(s!=MSTRO_OK || m->declared_members[i]==NULL) {
+          for(size_t j=i; j>0; j--) {
+            free(m->declared_members[j-1]);
+          };
+          free(m->declared_members);
+          m->declared_members=NULL;
+          goto BAILOUT_FREE;
+          
+        }
       }
-
       mstro__pool__uuid__init(m->declared_members[i]);
       m->declared_members[i]->qw0 = el->entry->gid.qw[0];
       m->declared_members[i]->qw1 = el->entry->gid.qw[1];
@@ -374,7 +375,7 @@ mstro_group_seal(mstro_group g)
   
   s = mstro_cdo_attribute_set(g->group_cdo,
                               MSTRO_ATTR_CORE_CDO_GROUP_MEMBERS,
-                              blob);
+                              blob, false);
   if(s!=MSTRO_OK) 
     goto BAILOUT_FREE;
 
diff --git a/maestro/pool_client.c b/maestro/pool_client.c
index 87a15d014032296c3db66ad2f5bfbe5eb0c8681b..a2e169e20fac4c28f7447de9c442290a02e02338 100644
--- a/maestro/pool_client.c
+++ b/maestro/pool_client.c
@@ -386,22 +386,28 @@ mstro_pc__handle_initiate_transfer(const Mstro__Pool__InitiateTransfer* init)
   Mstro__Pool__TransferTicket ticket = MSTRO__POOL__TRANSFER_TICKET__INIT;
   ticket.cdoid = &id;
 
-  const int64_t *size;
-  enum mstro_cdo_attr_value_type type;
-  if (! (MSTRO_OK == mstro_cdo_attribute_get(src_cdo,
-                                             MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE,
-                                             &type, (const void**)&size))) {
-    ERR("Couldn't retrieve CDO %s local_size needed for transport\n", src_cdo->name);
+  mstro_status s=MSTRO_UNIMPL;
+  const void *size=NULL;
+  enum mstro_cdo_attr_value_type vt;
+  s = mstro_attribute_dict_get(src_cdo->attributes,
+                               MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE,
+                               &vt, &size, NULL, false);
+  if(s==MSTRO_NOENT && vt==MSTRO_CDO_ATTR_VALUE_INVALID) {
+    ERR("CDO has mamba-array but no local-size\n");
     return MSTRO_FAIL;
   }
-  int64_t realsize = *size;
+  if(s!=MSTRO_OK) {
+    ERR("Failed to retrieve local-size on CDO\n");
+    return MSTRO_FAIL;
+  }
+
+  int64_t realsize = *(int64_t*)size;
   if(realsize==-1) {
     DEBUG("Source CDO empty, doing NULL transfer\n");
     realsize = 0;
   }
-  if (!g_mio_available
-      || (( realsize % getpagesize()) != 0 
-          && init->methods->supported[0] == MSTRO__POOL__TRANSPORT_KIND__MIO)
+  if (   init->methods->supported[0] == MSTRO__POOL__TRANSPORT_KIND__MIO
+      && (!g_mio_available || (realsize % getpagesize()) != 0 )
       ){
     WARN("Not issuing a ticket with MIO. Either not available or CDO size (%zu)"
          " is not a multiple of the page size (%d)."
@@ -433,7 +439,7 @@ mstro_pc__handle_initiate_transfer(const Mstro__Pool__InitiateTransfer* init)
             status, mstro_status_description(status));
         return status;
       }
-      gfs.keep_file = 0; // Arbitrarily rm the transport file on dst
+      gfs.keep_file = 1; // don't arbitrarily rm the transport file on dst
       break;
     case MSTRO__POOL__TRANSFER_TICKET__TICKET_MIO:
       INFO("TICKET CASE MIO\n");
@@ -507,7 +513,7 @@ mstro_pc__handle_initiate_transfer(const Mstro__Pool__InitiateTransfer* init)
   INFO("Issued ticket for CDO %s, and starting execute process\n", src_cdo->name);
   
   //INFO("TransferTicket using path %s\n", ticket.gfs->path);
-  INFO("TransferTicket cdo size %zu\n", ticket.data_size);
+  INFO("TransferTicket cdo size %" PRIi64 "\n", ticket.data_size);
   
   /* Execute transport (non-blocking) */
   status = mstro_transport_execute(src_cdo, &ticket);
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 698b3d4b199d2c7f1aa54917096cd0f30fc58263..e9c51d30a780227fa2412cc8763e3f7702d661a2 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -183,6 +183,11 @@ clean-local-check:
 	-rm -f $(top_builddir)/tests/consumer_CDO\ [0-9]*
 	-rm -f $(top_builddir)/tests/mio-config*.yaml
 	-rm -f $(top_builddir)/tests/m0trace.*
+	-rm -f $(top_builddir)/tests/C-handle\ [0-9]*
+	-rm -f $(top_builddir)/tests/C-name\ [0-9]*
+	-rm -f $(top_builddir)/tests/{Consumer,Producer}-done-CDO
+	-rm -f $(top_builddir)/tests/Test\ group
+	-rm -f $(top_builddir)/tests/cdo[0-9]*
 
 
 .PHONY: all
diff --git a/tests/check_declaration_seal.c b/tests/check_declaration_seal.c
index d6002797ca56e2ab10d39f6e725a2345e997c2b4..8648bf5735c6081dff718dc86d52e6b64bd12169 100644
--- a/tests/check_declaration_seal.c
+++ b/tests/check_declaration_seal.c
@@ -97,12 +97,12 @@ CHEAT_TEST(cdo_declaration_seal_works,
            cheat_assert(!(MSTRO_OK
                         == mstro_cdo_attribute_set(
                             cdo, "maestro.core.cdo.scope.local-size",
-                            &size))); // not an absolute path, not a valid relative path
+                            &size, true))); // not an absolute path, not a valid relative path
 
            cheat_assert(MSTRO_OK
                         == mstro_cdo_attribute_set(
                             cdo, ".maestro.core.cdo.scope.local-size",
-                            &size));
+                            &size, true)); 
 
            cheat_assert(MSTRO_OK == mstro_cdo_declaration_seal(cdo));
 
diff --git a/tests/check_layout.c b/tests/check_layout.c
index e3d4f4190fefa72a2b88e4415d8a81ebf60d2033..3570ff2ac0c3ac7957d2ef37b17d780902f822fa 100644
--- a/tests/check_layout.c
+++ b/tests/check_layout.c
@@ -130,32 +130,32 @@ CHEAT_TEST(layout_attribute_works,
   cheat_assert(MSTRO_OK == mstro_cdo_declare(name, MSTRO_ATTR_DEFAULT, &cdo_src));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src,
                                                    MSTRO_ATTR_CORE_CDO_RAW_PTR,
-                                                   src_data));
+                                                   src_data, false));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src,
                                                    MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE,
-                                                   (void**)&bytes));
+                                                   (void**)&bytes, true));
 
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src, 
-			  MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz));
+			  MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz, true));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src,
-			  MSTRO_ATTR_CORE_CDO_LAYOUT_NDIMS, &ndims));
+			  MSTRO_ATTR_CORE_CDO_LAYOUT_NDIMS, &ndims, true));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src,
-			  MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, dimsz_src));
+			  MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, dimsz_src, false));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src,
-			  MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_src));
+			  MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_src, true));
   cheat_assert(MSTRO_OK == mstro_cdo_declaration_seal(cdo_src));
   cheat_assert(MSTRO_OK == mstro_cdo_offer(cdo_src));
 
   /* Consumer side */
   cheat_assert(MSTRO_OK == mstro_cdo_declare(name, MSTRO_ATTR_DEFAULT, &cdo_dst));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_dst,
-			  MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz));
+			  MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz, true));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_dst,
-			  MSTRO_ATTR_CORE_CDO_LAYOUT_NDIMS, &ndims));
+			  MSTRO_ATTR_CORE_CDO_LAYOUT_NDIMS, &ndims, true));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_dst,
-			  MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, dimsz_dst));
+			  MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, dimsz_dst, false));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_dst,
-			  MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_dst));
+			  MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_dst, true));
   cheat_assert(MSTRO_OK == mstro_cdo_declaration_seal(cdo_dst));
     cheat_assert(MSTRO_OK == mstro_cdo_require(cdo_dst));
 
@@ -167,18 +167,18 @@ CHEAT_TEST(layout_attribute_works,
   cheat_assert(MSTRO_OK == mstro_cdo_declare(name_unpooled, MSTRO_ATTR_DEFAULT, &cdo_unpooled));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled,
                                                    MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE,
-                                                   (void**)&bytes));
+                                                   (void**)&bytes, true));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled,
                                                    MSTRO_ATTR_CORE_CDO_RAW_PTR,
-                                                   unpooled_data));
+                                                   unpooled_data, false));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled,
-			  MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz));
+			  MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz, true));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled,
-			  MSTRO_ATTR_CORE_CDO_LAYOUT_NDIMS, &ndims));
+			  MSTRO_ATTR_CORE_CDO_LAYOUT_NDIMS, &ndims, true));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled,
-			  MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, dimsz_dst));
+			  MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, dimsz_dst, false));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled,
-			  MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_dst));
+			  MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_dst, true));
   cheat_assert(MSTRO_OK == mstro_cdo_declaration_seal(cdo_unpooled));
   /* at this point cdo_unpooled has a mamba array (raw-ptr wrapper) */
   
@@ -200,18 +200,18 @@ CHEAT_TEST(layout_attribute_works,
   cheat_assert(MSTRO_OK == mstro_cdo_declare(name_unpooled, MSTRO_ATTR_DEFAULT, &cdo_unpooled_t));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled_t,
                                                    MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE,
-                                                   (void**)&bytes));
+                                                   (void**)&bytes, true));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled_t,
                                                    MSTRO_ATTR_CORE_CDO_RAW_PTR,
-                                                   unpooled_data_t));
+                                                   unpooled_data_t, false));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled_t, 
-			  MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz)); 
+			  MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz, true)); 
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled_t, 
-			  MSTRO_ATTR_CORE_CDO_LAYOUT_NDIMS, &ndims)); 
+			  MSTRO_ATTR_CORE_CDO_LAYOUT_NDIMS, &ndims, true)); 
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled_t, 
-			  MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, dimsz_src)); 
+			  MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, dimsz_src, false)); 
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled_t, 
-			  MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_src)); 
+			  MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_src, true)); 
   cheat_assert(MSTRO_OK == mstro_cdo_declaration_seal(cdo_unpooled_t));
 
   cheat_assert(MSTRO_OK == mstro_transform_layout(cdo_unpooled, cdo_unpooled_t, 
diff --git a/tests/check_pool_local_rawptr.c b/tests/check_pool_local_rawptr.c
index 24ff530aefd8ebecff4fe83465599e23c7d69381..55ba01edf81f3bbf7444eab08b5b507890222438 100644
--- a/tests/check_pool_local_rawptr.c
+++ b/tests/check_pool_local_rawptr.c
@@ -77,10 +77,10 @@ CHEAT_TEST(cdo_local_pool_works,
 
            cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(src_cdo,
                                                             MSTRO_ATTR_CORE_CDO_RAW_PTR,
-                                                            src_data));
+                                                            src_data, false));
            cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(dst_cdo,
                                                             MSTRO_ATTR_CORE_CDO_RAW_PTR,
-                                                            dst_data));
+                                                            dst_data, false));
            cheat_yield();
            cheat_assert(MSTRO_OK == mstro_cdo_require(dst_cdo));
            cheat_yield();
diff --git a/tests/check_pool_mamba.c b/tests/check_pool_mamba.c
index d543c6d4fa7be15d08316e46f5bc5a5132935dd8..76e959ecdfbc74d303c35739f44049e9d247ba1d 100644
--- a/tests/check_pool_mamba.c
+++ b/tests/check_pool_mamba.c
@@ -63,10 +63,10 @@ CHEAT_TEST(cdo_local_pool_mamba_works,
 // TODO associate (cdo, mmb_array_ptr)
            cheat_assert(MSTRO_OK
                         == mstro_cdo_attribute_set(
-                            cdo, ".maestro.core.cdo.raw-ptr", (void*)buf));
+                            cdo, ".maestro.core.cdo.raw-ptr", (void*)buf, false));
            cheat_assert(MSTRO_OK
                         == mstro_cdo_attribute_set(
-                            cdo, ".maestro.core.cdo.scope.local-size", &size));
+                            cdo, ".maestro.core.cdo.scope.local-size", &size, true));
            
            mmbArray *mamba_ptr=NULL;
            /* mamba array not automatically available */
diff --git a/tests/check_transport_gfs.c b/tests/check_transport_gfs.c
index 749a03415b7de2c3596240b5b1c03850fe4875e7..05e651307c9f482b65c9d59ec8f5840ce54595d5 100644
--- a/tests/check_transport_gfs.c
+++ b/tests/check_transport_gfs.c
@@ -87,10 +87,10 @@ CHEAT_TEST(transport_gfs_works,
   cheat_assert(MSTRO_OK == mstro_cdo_declare(name, MSTRO_ATTR_DEFAULT, &cdo_src));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src,
                                                    MSTRO_ATTR_CORE_CDO_RAW_PTR,
-                                                   src_data));
+                                                   src_data, false));
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src,
                                                    MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE,
-                                                   (void**)&bytes));
+                                                   (void**)&bytes, true));
   cheat_yield();
   
   enum mstro_cdo_attr_value_type ttype;
@@ -141,7 +141,7 @@ CHEAT_TEST(transport_gfs_works,
 
   cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_dst,
                                                    MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE,
-                                                   (void**)&bytes));
+                                                   (void**)&bytes, true));
   cheat_assert(MSTRO_OK == mstro_cdo_declaration_seal(cdo_dst));
 
   cheat_assert(MSTRO_OK == mstro_transport_gfs_dst_execute(cdo_dst, &ticket)); 
diff --git a/tests/check_transport_mio.c b/tests/check_transport_mio.c
index a2e8a0a187da9cc750ceb891bab4bee0bddbb3f7..f2eb2e065639efb06aea6d09bab708bfe5d6d08f 100644
--- a/tests/check_transport_mio.c
+++ b/tests/check_transport_mio.c
@@ -89,13 +89,13 @@ CHEAT_DECLARE (
                cheat_assert(MSTRO_OK == mstro_cdo_declare(name, MSTRO_ATTR_DEFAULT, &cdo_src));
                cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src,
                                                                 MSTRO_ATTR_CORE_CDO_RAW_PTR,
-                                                                src_data));
+                                                                src_data, false));
                cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src,
                                                                 ".maestro.core.cdo.scope.local-size",
-                                                                &bytes));
+                                                                &bytes, true));
                cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src,
                                                                 ".maestro.core.cdo.layout.pre-pad",
-                                                                &pad));
+                                                                &pad, true));
 
                const int64_t* tval;
 
diff --git a/tests/demo_mvp_d3_2.c b/tests/demo_mvp_d3_2.c
index fa324de78108876c79bda5aab810270351dfd1fe..0855944df6759324aa0314465b09192a4558d073 100644
--- a/tests/demo_mvp_d3_2.c
+++ b/tests/demo_mvp_d3_2.c
@@ -237,7 +237,7 @@ wait_for_announcement(struct cdo_announcement *announcement)
   }
   s = mstro_cdo_attribute_set(announcement_cdo,
                               MSTRO_ATTR_CORE_CDO_RAW_PTR,
-                              announcement);
+                              announcement, false);
   if(s!=MSTRO_OK) {
     ERR("Failed to set raw-ptr attribute on announcement CDO\n");
     abort();
@@ -286,7 +286,7 @@ do_announce(struct cdo_announcement *announcement, mstro_cdo *result)
   }
   s = mstro_cdo_attribute_set(announcement_cdo,
                               MSTRO_ATTR_CORE_CDO_RAW_PTR,
-                              announcement);
+                              announcement, false);
 
   if(s!=MSTRO_OK) {
     ERR("Failed to set raw-ptr attribute on  announcement CDO\n");
@@ -550,10 +550,10 @@ archiver_thread_fun(void *closure)
       }
       s = mstro_cdo_attribute_set(incoming[i],
                                   MSTRO_ATTR_CORE_CDO_RAW_PTR,
-                                  incoming_buffers[i]);
+                                  incoming_buffers[i], false);
       s |= mstro_cdo_attribute_set(incoming[i],
                                    MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE,
-                                   &announcement->cdo_size);
+                                   &announcement->cdo_size, true);
       //      INFO("archiver cdo %d incoming buffer %p\n", i, incoming_buffers[i]);
 
       if(s!=MSTRO_OK) {
@@ -671,10 +671,10 @@ producer_thread_fun(void *closure)
 
       s = mstro_cdo_attribute_set(outgoing[i],
                                   MSTRO_ATTR_CORE_CDO_RAW_PTR,
-                                  outgoing_buffers[i]);
+                                  outgoing_buffers[i], false);
       s |= mstro_cdo_attribute_set(outgoing[i],
                                    MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE,
-                                   &announcement->cdo_size);
+                                   &announcement->cdo_size, true);
 
       if(s!=MSTRO_OK) {
         ERR("Failed to add outgoing buffer to CDO %s\n",
@@ -803,10 +803,10 @@ consumer_thread_fun(void *closure)
       }
       s = mstro_cdo_attribute_set(incoming[i],
                                   MSTRO_ATTR_CORE_CDO_RAW_PTR,
-                                  incoming_buffers[i]);
+                                  incoming_buffers[i], false);
       s |= mstro_cdo_attribute_set(incoming[i],
                                    MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE,
-                                   &announcement->cdo_size);
+                                   &announcement->cdo_size, true);
       //      INFO("consumer cdo %d incoming buffer %p\n", i, incoming_buffers[i]);
 
       if(s!=MSTRO_OK) {
diff --git a/tests/simple_interlock_client.c b/tests/simple_interlock_client.c
index c71f47a64a6b97c969e1795fb7a923d7aae7ac03..5b4e4fde9a66581505adde34535c116bd54f8e95 100644
--- a/tests/simple_interlock_client.c
+++ b/tests/simple_interlock_client.c
@@ -194,11 +194,11 @@ CHEAT_DECLARE(
             cheat_assert(MSTRO_OK==mstro_cdo_attribute_set(
                 e->cdo,
                 MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE,
-                &s->size));
+                &s->size, true));
             cheat_assert(MSTRO_OK==mstro_cdo_attribute_set(
                 e->cdo,
                 MSTRO_ATTR_CORE_CDO_RAW_PTR,
-                e->buf));
+                e->buf, false));
             fprintf(stderr, "declared %s, handle %x\n",
                     e->name, e->cdo);
             break;            
diff --git a/transport/gfs.c b/transport/gfs.c
index a8844e5d345b9fc50130e45281a3c97888f74e87..c3b12490ba3e9d800654b5902b664bc273ab8f70 100644
--- a/transport/gfs.c
+++ b/transport/gfs.c
@@ -82,10 +82,14 @@ mstro_transport_gfs_src_execute(mstro_cdo src, Mstro__Pool__TransferTicket* tick
 	    return MSTRO_FAIL;
 	}
 
-	if (fwrite(dl.data, sizeof(char), dl.len/sizeof(char), f) != dl.len) {
-		ERR("Partial write on %s (buf: %p) for GFS transport (errno: %d -- %s)\n",
+RETRY_GFS_TRANSPORT_WRITE: ;
+    size_t bytes_written = fwrite(dl.data, sizeof(char), dl.len, f);
+	if (bytes_written != dl.len) {
+      if (errno == EAGAIN)
+	    goto RETRY_GFS_TRANSPORT_WRITE;
+	  ERR("Partial write on %s (buf: %p) for GFS transport (errno: %d -- %s)\n",
                     path, dl.data, errno, strerror(errno));
-		return MSTRO_FAIL;
+	  return MSTRO_FAIL;
 	}
 
 	if (fclose(f) != 0) {
@@ -113,10 +117,10 @@ mstro_transport_gfs_dst_execute(mstro_cdo dst,
   INFO("Executing gfs transport dst side for CDO %s\n", dst->name);
   
   mstro_status status;
-  int64_t len = ticket->data_size;
+  size_t len = (size_t)ticket->data_size;
   char* data;
 
-  DEBUG("Incoming CDO, size %" PRIi64 "\n", len);
+  DEBUG("Incoming CDO, size %zu\n", len);
 
   status = mstro_transport_get_dst_buffer(dst, (void*)&data);
   if(status!=MSTRO_OK) {
@@ -140,10 +144,13 @@ mstro_transport_gfs_dst_execute(mstro_cdo dst,
         path, errno, strerror(errno));
     return MSTRO_FAIL;
   }
-
-  if (fread(data, sizeof(char), len, f) != (size_t)len) {
-    ERR("Partial read on %s for GFS transport (errno: %d -- %s)\n",
-        path, errno, strerror(errno));
+RETRY_GFS_TRANSPORT_READ: ;
+  size_t bytes_read = fread(data, sizeof(char), len, f);
+  if (bytes_read != (size_t)len) {
+    if (errno == EAGAIN)
+	  goto RETRY_GFS_TRANSPORT_READ;
+    ERR("Partial read (%d out of %d bytes) on %s for GFS transport (errno: %d -- %s)\n",
+        bytes_read, len, path, errno, strerror(errno));
     return MSTRO_FAIL;
   }
 
diff --git a/transport/transport.c b/transport/transport.c
index 4c3f6d73c038e50792a953809daa591e908582ca..0690af7edff5ead202d06172de6cb67b7c0c930f 100644
--- a/transport/transport.c
+++ b/transport/transport.c
@@ -371,9 +371,32 @@ mstro_transport_execute(
   if (cdo->state & MSTRO_CDO_STATE_OFFERED) {
     /* we are called on the source side of transport */
     {
-      /* FIXME: should check this for robustness: */
-      DEBUG("Not checking that SRC cdo has expected size (%" PRIi64 ")\n",
-            ticket->data_size);
+	  /* let's check ticket size matches local CDO size */
+       enum mstro_cdo_attr_value_type type;
+       const void *sizep=NULL;
+       int64_t src_size;
+       mstro_status s = mstro_attribute_dict_get(cdo->attributes,
+                                            MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE,
+                                            &type, &sizep, NULL, false);
+       if(s==MSTRO_OK) {
+         src_size=*(int64_t*)sizep;
+       } else if(s==MSTRO_NOENT && type==MSTRO_CDO_ATTR_VALUE_INVALID) {
+	     ERR("Attribute not found or value invalid\n");
+         src_size=-1;
+       } else {
+         ERR("Failed to look up %s (%d: %s)\n",
+             MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE, s, mstro_status_description(s));
+         return MSTRO_FAIL;
+       }
+
+       if (ticket->data_size == 0) {
+         DEBUG("0-transport\n");
+	   }
+       else if (src_size != ticket->data_size) {
+         ERR("SRC cdo has a size (%" PRIi64 ") that doesn't match ticket-specified size (%" PRIi64 ")\n",
+            src_size, ticket->data_size);
+			return MSTRO_FAIL;
+       }
     }
     mstro_status (*f)(mstro_cdo src, Mstro__Pool__TransferTicket *t)
         = g_transport_registry[ticket->method].src_func;