diff --git a/include/maestro/core.h b/include/maestro/core.h
index aaf0c9148ceb9188b4dbb14ded4e5b63e64889b7..5a64354e19c7edc39c868fedbf19579596589bc8 100644
--- a/include/maestro/core.h
+++ b/include/maestro/core.h
@@ -103,10 +103,6 @@ extern "C" {
    **/
   #define PRIappid PRIu64
 
-  /**
-   ** The maximum number of characters in a schema list path.
-   **/
-  #define MAX_PATH_LENGTH 1024
 
   /**@} (end of group MSTRO_Core) */
 
diff --git a/maestro/core.c b/maestro/core.c
index 7146b0224b13742fe1c21cc6cbe66ae5979aafa0..5f8a951b4e618c1c74f808456cf544ba70510031 100644
--- a/maestro/core.c
+++ b/maestro/core.c
@@ -226,8 +226,12 @@ mstro_status mstro_core_init__setup_schemata(void)
    // start reading user-defined schemas and merge them.
    char *end_list_token;
    char *end_path_token;
-   char schema_full_path[MAX_PATH_LENGTH];
-   char env_schema_path_plus_default[MAX_PATH_LENGTH];
+   char *schema_full_path;
+   char *env_schema_path_plus_default;
+
+   // the lenght of all paths =  length of paths exported by user + separator + default path "."
+   int path_len = strlen(env_schema_path) + 2 + 2;
+   env_schema_path_plus_default = (char *) malloc(path_len*sizeof(char));
 
    /* get the first schema */
    schema_list_token = strtok_r(env_schema_list, SCHEMA_LIST_SEP, &end_list_token);
@@ -241,7 +245,7 @@ mstro_status mstro_core_init__setup_schemata(void)
       DEBUG("looking for schema_list_token: %s \n", schema_list_token);
 
       // creating list of paths to visit. i.e. current directory "." + user defined paths
-      snprintf(env_schema_path_plus_default, MAX_PATH_LENGTH, "%s%s%s", ".", SCHEMA_PATH_SEP, env_schema_path);
+      snprintf(env_schema_path_plus_default, path_len, "%s%s%s", ".", SCHEMA_PATH_SEP, env_schema_path);
       DEBUG("list of paths for schemas: %s\n", env_schema_path_plus_default);
       /* get the first path */
       schema_path_token = strtok_r(env_schema_path_plus_default, SCHEMA_PATH_SEP, &end_path_token);
@@ -250,16 +254,22 @@ mstro_status mstro_core_init__setup_schemata(void)
       /* walk through other paths */
       while( schema_path_token != NULL )
       {
-        // forming the full path
-        snprintf(schema_full_path, MAX_PATH_LENGTH, "%s%s%s", schema_path_token, "/", schema_list_token);
+        // forming the full path:          path token + / + list name + '\0'
+        int schema_full_path_len = strlen(schema_path_token) + 2 + strlen(schema_list_token) + 2;
+        schema_full_path = (char *) malloc(sizeof(char)*schema_full_path_len);
+        snprintf(schema_full_path, schema_full_path_len, "%s%s%s", schema_path_token, "/", schema_list_token);
         DEBUG("Parsing user-defined schema from %s\n", schema_full_path);
         status=mstro_schema_parse_from_file(schema_full_path, &user_schema);
 
         if(status==MSTRO_OK) {
           DEBUG("user-defined schema is read from %s\n", schema_full_path);
+          free(schema_full_path);
+          schema_full_path = NULL;
           break; // no need to try other paths
         }
 
+        free(schema_full_path);
+        schema_full_path = NULL;
         // read the next path
           schema_path_token = strtok_r(NULL, SCHEMA_PATH_SEP, &end_path_token);
 
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 8beb8d0608c58da39e00a75edea32c8a8f3700df..698b3d4b199d2c7f1aa54917096cd0f30fc58263 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -76,16 +76,16 @@ TESTS = check_version check_init check_uuid \
 	check_pm_declare.sh \
 	check_pm_interlock.sh \
 	check_subscribe.sh \
-	check_pm_declare_group.sh 
+	check_pm_declare_group.sh
 
 
 XFAIL_TESTS = \
-	check_subscribe_local 
+	check_subscribe_local
 
 # too expensive, actually more of a benchmark:
-#	check_pool_local_multi 
+#	check_pool_local_multi
 # broken for now:
-# 	check_mempool 
+# 	check_mempool
 
 check_PROGRAMS = check_version check_init check_uuid \
 		 coverage check_memlock \
@@ -117,13 +117,13 @@ check_PROGRAMS = check_version check_init check_uuid \
 		 simple_injector \
 		 simple_archiver \
 		 simple_telemetry_listener \
-		 check_events 
+		 check_events
 
 
 if WITH_MIO
 AM_CPPFLAGS += $(TEST_INCLUDES) -I$(top_srcdir)/deps/mio/src -D_REENTRANT -D_GNU_SOURCE -DM0_INTERNAL= -DM0_EXTERN=extern -Wno-attributes
 check_PROGRAMS += check_transport_mio
-TESTS += check_transport_mio 
+TESTS += check_transport_mio
 endif
 
 CLIENT1_OPS="DECLARE cdo1 1025\
@@ -155,9 +155,9 @@ INJECTOR_OPS="\
 
 
 
-simple_interlock_client_1_SOURCES = simple_interlock_client.c 
+simple_interlock_client_1_SOURCES = simple_interlock_client.c
 simple_interlock_client_1_CPPFLAGS = $(AM_CPPFLAGS) -DCLIENT_ARGS=$(CLIENT1_OPS)
-simple_interlock_client_2_SOURCES = simple_interlock_client.c 
+simple_interlock_client_2_SOURCES = simple_interlock_client.c
 simple_interlock_client_2_CPPFLAGS = $(AM_CPPFLAGS) -DCLIENT_ARGS=$(CLIENT2_OPS)
 simple_injector_SOURCES = simple_interlock_client.c
 simple_injector_CPPFLAGS = $(AM_CPPFLAGS) -DCLIENT_ARGS=$(INJECTOR_OPS)
@@ -165,14 +165,16 @@ simple_injector_CPPFLAGS = $(AM_CPPFLAGS) -DCLIENT_ARGS=$(INJECTOR_OPS)
 simple_group_injector_SOURCES = simple_group_client.c
 simple_group_injector_CPPFLAGS = $(AM_CPPFLAGS) -DINJECT_GROUP_MEMBERS=1
 
-#check_mempool 
+#check_mempool
 check_SCRIPTS = run_demo.sh \
 		check_pm_declare.sh \
 		check_pm_declare_group.sh \
 		check_pm_interlock.sh \
 		check_subscribe.sh
 
-EXTRA_DIST = $(check_SCRIPTS) generate-mio-config.sh demo_mvp_d3_2_config.yaml run_demo.sh
+user_defined_test_schemas = benchmark_attributes.yaml test_attributes.yaml
+
+EXTRA_DIST = $(check_SCRIPTS) $(user_defined_test_schemas) generate-mio-config.sh demo_mvp_d3_2_config.yaml run_demo.sh
 
 clean-local: clean-local-check
 .PHONY: clean-local-check
diff --git a/attributes/benchmark_attributes.yaml b/tests/benchmark_attributes.yaml
similarity index 100%
rename from attributes/benchmark_attributes.yaml
rename to tests/benchmark_attributes.yaml
diff --git a/tests/check_declaration_seal.c b/tests/check_declaration_seal.c
index f829166178d35422b07ab0bcbcf447dbf846928f..d6002797ca56e2ab10d39f6e725a2345e997c2b4 100644
--- a/tests/check_declaration_seal.c
+++ b/tests/check_declaration_seal.c
@@ -39,6 +39,15 @@
 #define __BASE_FILE__ __FILE__
 #endif
 
+#ifdef  TOPSRCDIR
+#define STRINGIFY(x) #x
+#define TOSTRING(x) STRINGIFY(x)
+
+#define SRC_PATH TOSTRING(TOPSRCDIR) "/tests"
+#else
+#define SRC_PATH "."
+#endif
+
 #include "cheat.h"
 
 #include "maestro.h"
@@ -138,6 +147,7 @@ CHEAT_TEST(cdo_declaration_seal_works,
 CHEAT_TEST(user_defined_schemas_works,
 
            setenv("MSTRO_SCHEMA_LIST","test_attributes.yaml", 1);
+           setenv("MSTRO_SCHEMA_PATH",SRC_PATH, 1);
 
            cheat_assert(MSTRO_OK == mstro_init("Tests","DECLARE",0));
 
@@ -158,16 +168,15 @@ CHEAT_TEST(user_defined_schemas_works,
 
 CHEAT_TEST(user_defined_schemas_doesnot_exist,
 
-           setenv("MSTRO_SCHEMA_LIST", "bechmark_attributes.yaml", 1);
+           setenv("MSTRO_SCHEMA_LIST", "user_attributes.yaml", 1);
            cheat_assert(MSTRO_OK != mstro_init("Tests","DECLARE",0));
            cheat_assert(MSTRO_FAIL == mstro_finalize());
 
           )
 
 CHEAT_TEST(user_defined_schemas_paths,
-
             setenv("MSTRO_SCHEMA_LIST","benchmark_attributes.yaml;test_attributes.yaml",1);
-            setenv("MSTRO_SCHEMA_PATH","../attributes/", 1);
+            setenv("MSTRO_SCHEMA_PATH",SRC_PATH, 1);
 
             cheat_assert(MSTRO_OK == mstro_init("Tests","DECLARE",0));
             mstro_cdo cdo;
diff --git a/tests/demo_mvp_d3_2.c b/tests/demo_mvp_d3_2.c
index 95082a69e222054b950c07c59874a1aed003c9c8..fa324de78108876c79bda5aab810270351dfd1fe 100644
--- a/tests/demo_mvp_d3_2.c
+++ b/tests/demo_mvp_d3_2.c
@@ -208,7 +208,7 @@ static const cyaml_config_t config = {
 int
 mvp_config_parse(mvp_config* handle, const char* filename)
 {
-  if (handle == NULL) return MSTRO_INVARG; 
+  if (handle == NULL) return MSTRO_INVARG;
 
   cyaml_err_t err;
   err = cyaml_load_file(filename, &config,
@@ -255,7 +255,7 @@ wait_for_announcement(struct cdo_announcement *announcement)
     ERR("Failed to require announcement CDO\n");
     abort();
   }
-  
+
   s = mstro_cdo_demand(announcement_cdo);
   if(s!=MSTRO_OK) {
     ERR("Failed to withdraw announcement CDO\n");
@@ -450,7 +450,7 @@ archiver_flush_to_disk(const char *name, mmbArray *a)
     abort();
   }
 
-  size_t nt; 
+  size_t nt;
   stat = mmb_tile_iterator_count(it, &nt);
   if(stat != MMB_OK) {
     ERR("Failed to get tile iterator count\n");
@@ -721,8 +721,8 @@ mvp_checksum(const char* name, void* rawptr, uint64_t size)
   unsigned char x;
   uint64_t i;
 
-  for (i=0,x=0;i<size; i++) 
-    x ^= ((unsigned char*)rawptr)[i]; 
+  for (i=0,x=0;i<size; i++)
+    x ^= ((unsigned char*)rawptr)[i];
 
   INFO("Checksum for cdo \"%s\": %d\n", name, x);
 }
@@ -731,7 +731,7 @@ void
 consumer_flush_to_disk(const char *name, void *a, uint64_t size)
 {
   char file_name [256];
-  sprintf(file_name, "consumer_%s", name); 
+  sprintf(file_name, "consumer_%s", name);
 
   FILE *dst = fopen((const char*)file_name, "w");
   if(dst==NULL) {
@@ -769,7 +769,7 @@ consumer_thread_fun(void *closure)
   mstro_status s;
   size_t my_idx = * (size_t*)closure;
   INFO("Consumer %zu starting\n", my_idx);
-  
+
   struct cdo_announcement *announcement
       = malloc(sizeof(struct cdo_announcement));
   if(announcement==NULL) {
@@ -826,7 +826,7 @@ consumer_thread_fun(void *closure)
 
   /* send ACK that we're ready */
   mstro_cdo ready_cdo;
-  
+
   INFO("Declaring Consumer %zu ready\n", my_idx);
   declare_consumer_ready(my_idx,&ready_cdo);
 
@@ -853,14 +853,14 @@ consumer_thread_fun(void *closure)
       /* query the size */
       s = mstro_cdo_attribute_get(incoming[i],
                                   MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE,
-                                  &type, (const void**)&size); 
+                                  &type, (const void**)&size);
       if(s!=MSTRO_OK) {
         ERR("Failed to extract local size from CDO %s for archiving\n",
             announcement->cdo_names[i]);
         abort();
       }
 
-      /* do some work */ 
+      /* do some work */
       mvp_checksum(announcement->cdo_names[i], rawptr, *size);
 
       /* write-out */
@@ -878,7 +878,7 @@ consumer_thread_fun(void *closure)
   }
 
   /* demand data and process */
-  
+
 
   cdo_sem_post_cleanup(ready_cdo);
   free(announcement);
@@ -893,7 +893,15 @@ consumer_thread_fun(void *closure)
 #define DEFAULT_CDO_SIZE      1024
 #define DEFAULT_CDO_COUNT     42
 
+#ifdef  TOPSRCDIR
+#define STRINGIFY(x) #x
+#define TOSTRING(x) STRINGIFY(x)
+
+#define CONFIG_FILE_PATH TOSTRING(TOPSRCDIR) "/tests/demo_mvp_d3_2_config.yaml"
+#else
 #define CONFIG_FILE_PATH "./demo_mvp_d3_2_config.yaml"
+#endif
+
 
 /*
  * main thread:
@@ -933,7 +941,7 @@ int main(int argc, char **argv)
       WARN("Command line arguments ignored\n");
       /* fallthrough: */
     case 1:
-      
+
       err = mvp_config_parse(&config_handle, CONFIG_FILE_PATH);
       if (err != 0) {
         WARN("Failed to parse a config file. Using default config.\n");
@@ -949,12 +957,12 @@ int main(int argc, char **argv)
         announcement.num_archivers = config_handle->num_archivers;
         announcement.cdo_size = config_handle->cdo_size;
         announcement.num_entries = config_handle->cdo_count;
-      }  
+      }
 
       break;
   }
   assert(announcement.num_entries<=CDO_COUNT_MAX);
-  
+
   pthread_t producers[announcement.num_producers];
   pthread_t consumers[announcement.num_consumers];
   pthread_t archivers[announcement.num_archivers];
@@ -1035,7 +1043,7 @@ int main(int argc, char **argv)
   for(size_t i=0; i<announcement.num_archivers; i++) {
     pthread_join(archivers[i], NULL);
   }
-  
+
   /* withdraw announcement */
   withdraw_announcement(announcement_cdo);
 
@@ -1050,11 +1058,11 @@ int main(int argc, char **argv)
           announcement.num_producers,
           announcement.num_consumers,
           announcement.num_archivers);
-          
+
 
 
 BAILOUT:
   if(config_handle) free(config_handle);
-  
+
   return s;
 }