diff --git a/CMakeLists.txt b/CMakeLists.txt
index 05993bf744095920ea251a6b776c119aaf8a45da..e8353b4167288c93210cb05b98e52039dd787656 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
+cmake_minimum_required(VERSION 3.19)
 project(CATS C)
 enable_language(C)
-cmake_minimum_required(VERSION 3.19)
 set(C_STANDARD 17)
 include(CTest)
 MESSAGE("Using compiler: ${CMAKE_C_COMPILER_ID}")
@@ -67,7 +67,8 @@ add_definitions("-DCATS_GIT_VERSION=${CATS_GIT_VERSION}")
 MESSAGE("GIT commit hash: ${CATS_GIT_VERSION}")
 
 add_definitions("-DCOMPILER_VERSION='${CMAKE_C_COMPILER_ID} ${CMAKE_C_COMPILER_VERSION}'")
-
+include_directories("libbdc")
+add_subdirectory(libbdc/)
 include_directories("src")
 include_directories("src/cats")
 add_subdirectory(src/)
diff --git a/libbdc/CMakeLists.txt b/libbdc/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4ae0edc6c57bfea0d607ec91c7daa91119af14c4
--- /dev/null
+++ b/libbdc/CMakeLists.txt
@@ -0,0 +1,41 @@
+cmake_minimum_required(VERSION 3.19)
+project(LIBBDC C)
+enable_language(C)
+set(C_STANDARD 17)
+
+
+if ("${CMAKE_C_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
+    add_link_options(-Bsymbolic -fno-semantic-interposition)
+    add_compile_options(-std=gnu11
+                        -Wall
+                        -Werror
+                        -O3
+                        -g
+                        -D_GNU_SOURCE
+                        -DHAVE_INLINE
+                        -DGSL_C99_INLINE
+                        -Wno-unused-function
+                        -DGSL_DISABLE_DEPRECATED)
+endif ()
+
+if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
+    add_compile_options(-Wno-stringop-truncation -Wno-stringop-overflow)
+elseif ("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
+    # nothing yet
+elseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "Intel")
+    # nothing yet
+elseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
+    add_compile_options("/std:c17")
+else ()
+    MESSAGE("Unknown compiler: ${CMAKE_C_COMPILER_ID}")
+endif ()
+
+add_subdirectory(bdc_memory)
+
+add_library(bdc STATIC "")
+
+set_target_properties(bdc PROPERTIES LINKER_LANGUAGE C)
+set_property(TARGET bdc PROPERTY POSITION_INDEPENDENT_CODE ON)
+target_link_libraries(bdc
+                      bdc_memory)
+
diff --git a/libbdc/bdc_memory/CMakeLists.txt b/libbdc/bdc_memory/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..38e9e22e39bbd8fa009790e642080632130b5398
--- /dev/null
+++ b/libbdc/bdc_memory/CMakeLists.txt
@@ -0,0 +1,13 @@
+add_library(bdc_memory STATIC "")
+
+target_sources(bdc_memory
+               PRIVATE
+               bdc_memory.c
+               raw_arrays.c
+               arrays.c
+               PUBLIC
+               bdc_memory.h
+               )
+
+
+set_property(TARGET bdc_memory PROPERTY POSITION_INDEPENDENT_CODE ON)
\ No newline at end of file
diff --git a/src/memory/arrays.c b/libbdc/bdc_memory/arrays.c
similarity index 72%
rename from src/memory/arrays.c
rename to libbdc/bdc_memory/arrays.c
index c08bc0e51d95196997fb96fd4cb6433166bbd4f1..a26c51fbb6b91c46e474d3ea75a8affad14de7ee 100644
--- a/src/memory/arrays.c
+++ b/libbdc/bdc_memory/arrays.c
@@ -19,36 +19,40 @@
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 //
 
-#include "raw_arrays.h"
-#include <malloc.h>
-#include "cats_memory.h"
 #include <assert.h>
-#include "arrays.h"
+#include <malloc.h>
+#include <stdlib.h>
+#include <stdint.h>
 
+#include "bdc_memory.h"
 
-struct cats_2d_array_float *new_2d_array_float(struct cats_dimension dimension)
+
+__attribute__((unused)) struct cats_2d_array_float *new_2d_array_float(struct array_dimension *dimension)
 {
+        assert(dimension != NULL);
         struct cats_2d_array_float *result = malloc_or_die(sizeof(struct cats_2d_array_float));
         result->data = new_raw_2d_array_from_dimension(dimension, sizeof(float));
-        result->dimension = dimension;
+        result->dimension = *dimension;
         return result;
 }
 
 
-struct cats_2d_array_char *new_2d_array_char(struct cats_dimension dimension)
+struct cats_2d_array_char *new_2d_array_char(const struct array_dimension *dimension)
 {
+        assert(dimension != NULL);
         struct cats_2d_array_char *result = malloc_or_die(sizeof(struct cats_2d_array_char));
         result->data = new_raw_2d_array_from_dimension(dimension, sizeof(char));
-        result->dimension = dimension;
+        result->dimension = *dimension;
         return result;
 }
 
 
-struct cats_2d_array_double *new_2d_array_double(struct cats_dimension dimension)
+struct cats_2d_array_double *new_2d_array_double(const struct array_dimension *dimension)
 {
+        assert(dimension != NULL);
         struct cats_2d_array_double *result = malloc_or_die(sizeof(struct cats_2d_array_double));
         result->data = new_raw_2d_array_from_dimension(dimension, sizeof(double));
-        result->dimension = dimension;
+        result->dimension = *dimension;
         return result;
 }
 
@@ -92,7 +96,14 @@ void cleanup_2d_array_double(struct cats_2d_array_double **grid)
 }
 
 
-void *new_raw_2d_array_from_dimension(struct cats_dimension dimension, size_t member_size)
+void *new_raw_2d_array_from_dimension(const struct array_dimension *dimension, size_t member_size)
 {
-        return new_raw_2d_array(dimension.rows, dimension.cols, member_size);
+        if (dimension->cols <= 0 || dimension->rows <= 0) {
+                fprintf(stderr,
+                        "%s: invalid dimensions of %d rows %d cols",
+                        __func__, dimension->rows, dimension->cols);
+                exit(EXIT_FAILURE);
+        }
+
+        return new_raw_2d_array(dimension->rows, dimension->cols, member_size);
 }
\ No newline at end of file
diff --git a/src/memory/cats_memory.c b/libbdc/bdc_memory/bdc_memory.c
similarity index 92%
rename from src/memory/cats_memory.c
rename to libbdc/bdc_memory/bdc_memory.c
index f9ec1b067ead9e95ba48df1bd2b9209d7456dee4..f8ab25b694eb35a51b962d16014532023cd10e1a 100644
--- a/src/memory/cats_memory.c
+++ b/libbdc/bdc_memory/bdc_memory.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-3.0-or-later
 //
-// cats_memory.c
+// bdc_memory.c
 //
 // Copyright (C) 2011-2024, University of Vienna and Vienna Institute for Nature Conservation & Analyses, Andreas Gattringer.
 //
@@ -22,7 +22,7 @@
 #include <stddef.h>
 #include <stdlib.h>
 #include <stdio.h>
-#include "cats_memory.h"
+#include "bdc_memory.h"
 
 // we do not use logging functions here --
 // if there is a memory allocation error, keep everything simple and terminate.
@@ -50,17 +50,21 @@ void *malloc_or_die_trace(size_t size, const char *func)
 
 void *realloc_or_die(void *ptr, size_t size)
 {
-        ptr = realloc(ptr, size);
+        void *new = realloc(ptr, size); // NULL if realloc failure, so we don't overwrite the old address
+
+        if (new == NULL) {
+                fprintf(stderr, "%s: error re-allocating %zu bytes. Quitting\n", __func__, size);
+                printf("%s: error re-allocating %zu bytes. Quitting\n", __func__, size); // allowed printf
+                abort();
+                // exit(EXIT_FAILURE);
+        }
+
+        ptr = new;
 
         if (size > 1000 * 1000 * 1000) {
                 fprintf(stderr, "Allocation of %zu bytes\n", size);
                 fflush(stderr);
         }
-        if (ptr == NULL) {
-                fprintf(stderr, "%s: error re-allocating %zu bytes. Quitting\n", __func__, size);
-                printf("%s: error re-allocating %zu bytes. Quitting\n", __func__, size); // allowed printf
-                exit(EXIT_FAILURE);
-        }
 
         return ptr;
 }
diff --git a/src/memory/raw_arrays.h b/libbdc/bdc_memory/bdc_memory.h
similarity index 54%
rename from src/memory/raw_arrays.h
rename to libbdc/bdc_memory/bdc_memory.h
index 2a4ca215ce1fb5b2a91d3534ca3603e729ffd7c4..015638d20f5abd06311ebc4d3ed1ecf7fe7ea7f5 100644
--- a/src/memory/raw_arrays.h
+++ b/libbdc/bdc_memory/bdc_memory.h
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-3.0-or-later
 //
-// raw_arrays.h
+// bdc_memory.h
 //
 // Copyright (C) 2011-2024, University of Vienna and Vienna Institute for Nature Conservation & Analyses, Andreas Gattringer.
 //
@@ -19,11 +19,66 @@
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 //
 
-#ifndef CATS_RAW_ARRAYS_H
-#define CATS_RAW_ARRAYS_H
+#ifndef bdc_memory_H
+#define bdc_memory_H
 
+#include <stddef.h> // for size_t
+#include <stdbool.h>
 #include <stdint.h>
-#include <stddef.h>
+
+void *malloc_or_die_trace(size_t size, const char *func);
+
+void *realloc_or_die(void *ptr, size_t size);
+
+void *malloc_or_die(size_t size);
+
+void *calloc_or_die(size_t count, size_t size);
+
+
+struct array_dimension {
+        int32_t rows;
+        int32_t cols;
+};
+
+struct cats_2d_array_float {
+        float **data;
+        struct array_dimension dimension;
+};
+
+struct cats_2d_array_char {
+        char **data;
+        struct array_dimension dimension;
+};
+
+struct cats_2d_array_double {
+        double **data;
+        struct array_dimension dimension;
+};
+
+struct cats_2d_array_char *new_2d_array_char(const struct array_dimension *dimension);
+
+struct cats_2d_array_double *new_2d_array_double(const struct array_dimension *dimension);
+
+__attribute__((unused)) struct cats_2d_array_float *new_2d_array_float(struct array_dimension *dimension);
+
+void cleanup_2d_array_char(struct cats_2d_array_char **grid);
+
+void cleanup_2d_array_float(struct cats_2d_array_float **grid);
+
+void cleanup_2d_array_double(struct cats_2d_array_double **grid);
+
+#define free_cats_grid(PTR_TO_GRID) _Generic((PTR_TO_GRID), \
+ struct cats_2d_array_float **:        cleanup_2d_array_float, \
+ struct cats_2d_array_double **:       cleanup_2d_array_double, \
+ struct cats_2d_array_char **:         cleanup_2d_array_char \
+ )(PTR_TO_GRID)
+
+bool array_dimension_valid(const struct array_dimension *dimension);
+
+__attribute__((unused)) bool array_dimensions_match(const struct array_dimension *d1, const struct array_dimension *d2);
+
+void *new_raw_2d_array_from_dimension(const struct array_dimension *dimension, size_t member_size);
+
 
 void cleanup_raw_2d_double_array(double ***data, int64_t rows);
 
@@ -60,4 +115,4 @@ void *new_raw_2d_array(size_t rows, size_t cols, size_t size);
 
 void *new_raw_1d_array(size_t count, size_t size);
 
-#endif // CATS_RAW_ARRAYS_H
\ No newline at end of file
+#endif //bdc_memory_H
diff --git a/src/memory/raw_arrays.c b/libbdc/bdc_memory/raw_arrays.c
similarity index 93%
rename from src/memory/raw_arrays.c
rename to libbdc/bdc_memory/raw_arrays.c
index 93eca60d6b1de75bcbd5b19eabe4812ff7b363a7..6a19a296ab5b7dba305b97190f5234794bb15bec 100644
--- a/src/memory/raw_arrays.c
+++ b/libbdc/bdc_memory/raw_arrays.c
@@ -19,20 +19,16 @@
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 //
 
-#include <assert.h>
 #include <stddef.h>
 #include <stdlib.h>
-#include <stdio.h>
-#include <inttypes.h>
-#include "raw_arrays.h"
-#include "cats_memory.h"
+#include "bdc_memory.h"
 
 
 void *new_raw_2d_array(size_t rows, size_t cols, size_t size)
 {
-        void **grid = calloc_or_die(rows, sizeof(void *));
+        void **grid = calloc_or_die(rows, sizeof(void *)); // FIXME DANGER
 
-        for (cats_dt_coord row = 0; row < rows; row++) {
+        for (size_t row = 0; row < rows; row++) {
                 grid[row] = calloc_or_die(cols, size);
                 if (grid[row] == NULL) exit(EXIT_FAILURE); // should never happen, we would exit in calloc_or_die
         }
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 2bf1b6ad8c63fa00570e3adfeff8cf18fcb32a36..e371925d2de98e1b230a331d037562cc079a6055 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,5 +1,4 @@
 add_subdirectory(logging)
-add_subdirectory(memory)
 add_subdirectory(cats)
 add_subdirectory(cats_time)
 add_subdirectory(cats_strings)
diff --git a/src/cats/CMakeLists.txt b/src/cats/CMakeLists.txt
index 00239ae79b9860e9a72cbc61f3233041b377a531..8b22d87d8b45477472fe06f06ea15ddfeddcd79f 100644
--- a/src/cats/CMakeLists.txt
+++ b/src/cats/CMakeLists.txt
@@ -321,15 +321,15 @@ set(CATS_SOURCES_MPI
     )
 
 add_executable(cats cats.c)
-target_link_libraries(libcats cats_logging cats_memory cats_strings cats_ini cats_csv)
-target_link_libraries(cats libcats cats_logging cats_memory cats_strings cats_ini cats_csv)
+target_link_libraries(libcats cats_logging bdc cats_strings cats_ini cats_csv)
+target_link_libraries(cats libcats cats_logging bdc cats_strings cats_ini cats_csv)
 
 
 if (MSVC)
     # target_include_directories(cats PRIVATE ${GDAL_INCLUDE_DIRS})
     # target_link_libraries(cats cats_logging cats_memory cats_strings cats_ini cats_csv  ${GDAL_LIBRARIES})
 else ()
-    target_link_libraries(cats cats_logging cats_memory cats_strings cats_ini cats_csv)
+    target_link_libraries(cats cats_logging bdc cats_strings cats_ini cats_csv)
 
 endif ()
 
@@ -337,7 +337,7 @@ if (MPI_FOUND)
 
 
     add_executable(cats-mpi cats.c ${CATS_SOURCES_MPI})
-    target_link_libraries(cats-mpi ${MPI_C_LIBRARIES} cats_logging cats_memory cats_strings cats_ini cats_csv libcats)
+    target_link_libraries(cats-mpi ${MPI_C_LIBRARIES} cats_logging bdc_memory cats_strings cats_ini cats_csv libcats)
 
 
     target_compile_options(cats-mpi PRIVATE -DUSEMPI)
diff --git a/src/cats/actions/setup_actions.c b/src/cats/actions/setup_actions.c
index 2868263b5fc71cecd377b7a7731a4630a730c13c..e3a1539c9cd1e45246f03c3c12a57cdc5b0e260e 100644
--- a/src/cats/actions/setup_actions.c
+++ b/src/cats/actions/setup_actions.c
@@ -26,12 +26,11 @@
 #include "configuration/configuration.h"
 
 #include "actions/setup_actions.h"
-#include "logging.h"
 #include "actions/cats_actions.h"
 #include "actions/process_inter_period_survival.h"
 #include "cats_strings/cats_strings.h"
 #include "dispersal/dispersal.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 
 
 void list_actions(const struct cats_configuration *conf)
diff --git a/src/cats/configuration/configuration.c b/src/cats/configuration/configuration.c
index 99560cc2c870cf5720a211e4e18666819b09d12b..9044c293aab151ffa74d9a5712af485b1df9bbf5 100644
--- a/src/cats/configuration/configuration.c
+++ b/src/cats/configuration/configuration.c
@@ -31,7 +31,7 @@
 #include <stdio.h>
 #include <errno.h>
 
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 #include <cats_ini/cats_ini.h>
 
 #include "configuration.h"
diff --git a/src/cats/configuration/load_configuration_environments.c b/src/cats/configuration/load_configuration_environments.c
index a49a67f078c8df3f82bff052eee6948ec2204376..08f0f70ff73125cee770102111959888435992ca 100644
--- a/src/cats/configuration/load_configuration_environments.c
+++ b/src/cats/configuration/load_configuration_environments.c
@@ -44,13 +44,15 @@ enum environment_variable_type get_environment_variable_type_from_string(const c
 
 void add_environment_variable_from_conf(struct cats_configuration *conf, struct cats_ini *ini, char *environment_section)
 {
-        struct cats_dimension *dimension = &conf->geometry.dimension;
+        struct array_dimension *dimension = &conf->geometry.dimension;
         char *name = remove_0th_token(environment_section, ":");
 
         if (conf->command_line_options.no_input_rasters_required) {
                 struct cats_environment *set = add_environment(conf, name, ENVIRONMENT_TYPE_SUITABILITY, NULL);
-                struct cats_environment_variable *env = add_environment_to_registry(&conf->environment_registry, "suitability", ENV_VAR_SUITABILITY,
-                                                                                    0, 0, "None",
+                struct cats_environment_variable *env = add_environment_to_registry(&conf->environment_registry,
+                                                                                    "suitability", ENV_VAR_SUITABILITY,
+                                                                                    "None", 0,
+                                                                                    0,
                                                                                     dimension);
                 add_to_environment(set, env);
                 return;
@@ -89,7 +91,8 @@ void add_environment_variable_from_conf(struct cats_configuration *conf, struct
         enum environment_variable_type type = get_environment_variable_type_from_string(type_name);
 
         struct cats_environment_variable *env = add_environment_to_registry(&conf->environment_registry, name, type,
-                                                                            interpolation, reload, filename_pattern,
+                                                                            filename_pattern, reload,
+                                                                            interpolation,
                                                                             dimension);
 
 
diff --git a/src/cats/configuration/load_configuration_helper.c b/src/cats/configuration/load_configuration_helper.c
index cc6e42237f13ff3bbecf798e5aea13d07a587ef6..2e9375712b0aae95a2e40057c6f957a48ec965ff 100644
--- a/src/cats/configuration/load_configuration_helper.c
+++ b/src/cats/configuration/load_configuration_helper.c
@@ -22,10 +22,9 @@
 #include <assert.h>
 #include <string.h>
 #include "cats_global.h"
-#include <memory/raw_arrays.h>
+#include "bdc_memory/bdc_memory.h"
 #include "actions/setup.h"
 #include "load_configuration_helper.h"
-#include <memory/cats_memory.h>
 #include "dispersal/dispersal.h"
 #include "data/species_parameters.h"
 
diff --git a/src/cats/configuration/load_configuration_species_params.c b/src/cats/configuration/load_configuration_species_params.c
index e2504e8c6595c2c6e296832e29625dbd82f59bf1..a7418dde57b2746150b0e7dbf16f2dd21bbe6807 100644
--- a/src/cats/configuration/load_configuration_species_params.c
+++ b/src/cats/configuration/load_configuration_species_params.c
@@ -28,7 +28,7 @@
 #include <string.h>
 #include <math.h>
 
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 #include <cats_ini/cats_ini.h>
 #include <logging/logging.h>
 
diff --git a/src/cats/data/cats_datatypes.h b/src/cats/data/cats_datatypes.h
index e912a70c562a229e34f61ee9dcef1ddccae209a7..d2bba5466e47223b70793c29c3c30a8da695e390 100644
--- a/src/cats/data/cats_datatypes.h
+++ b/src/cats/data/cats_datatypes.h
@@ -49,11 +49,6 @@ typedef int32_t cats_dt_coord;             ///< data type for coordinates (grid
 #define CATS_MAX_COORD INT32_MAX
 
 
-/// @brief Struct for grid dimensions (number of rows and columns)
-struct cats_dimension {
-        cats_dt_coord rows;
-        cats_dt_coord cols;
-};
 
 /// @brief Struct for grid coordinates (row and column)
 struct cats_coordinates {
diff --git a/src/cats/data/cats_global.c b/src/cats/data/cats_global.c
index d2179bad9ae8bc190d10c15d37281ef86100ca83..d3a574978bda439c226640c80d2ed34b690a8f0b 100644
--- a/src/cats/data/cats_global.c
+++ b/src/cats/data/cats_global.c
@@ -23,7 +23,7 @@
 #include "cats_global.h"
 #include "misc/misc.h"
 #include "defaults.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include <logging/logging.h>
 #include <stdlib.h>
 
diff --git a/src/cats/data/cats_grid.h b/src/cats/data/cats_grid.h
index 131fbf9caa069d3bdff645013af706eb04a34637..043bc208ac3366c670228254c6d8ccb7510d95bb 100644
--- a/src/cats/data/cats_grid.h
+++ b/src/cats/data/cats_grid.h
@@ -27,6 +27,7 @@
 #include "data/cats_datatypes.h"
 #include "stats/statistics.h"
 #include "defaults.h"
+#include "bdc_memory/bdc_memory.h"
 
 struct cats_configuration;
 struct module_grid_data {
@@ -43,7 +44,7 @@ struct cats_grid {
 
 
         /** @name spatial information **/
-        const struct cats_dimension dimension;
+        const struct array_dimension dimension;
 
 
         struct cats_environment *suitability; /**  @name hybrid mode only: suitability information **/
diff --git a/src/cats/data/simulation_geometry.c b/src/cats/data/simulation_geometry.c
index 75dee4b96af134b36538038702c65298358687fc..ed9e0b14fe8659c2876789622156f3cdd0ef6555 100644
--- a/src/cats/data/simulation_geometry.c
+++ b/src/cats/data/simulation_geometry.c
@@ -46,7 +46,7 @@ void init_simulation_geometry(struct simulation_geometry *geo)
 }
 
 
-void check_raster_dimensions(struct cats_dimension to_check, struct cats_dimension reference)
+void check_raster_dimensions(struct array_dimension to_check, struct array_dimension reference)
 {
         if (to_check.cols != reference.cols || to_check.rows != reference.rows) {
                 log_message(LOG_ERROR, "GDAL gdal_raster dimensions do not match expected dimensions: "
diff --git a/src/cats/data/simulation_geometry.h b/src/cats/data/simulation_geometry.h
index 57de1025dbdf1e291f21620e885b4bbcd01d145d..be25d3c7d751d7603c1c6b955e1b1c4d9727fc17 100644
--- a/src/cats/data/simulation_geometry.h
+++ b/src/cats/data/simulation_geometry.h
@@ -22,13 +22,13 @@
 
 #ifndef CATS_SIMULATION_GEOMETRY_H
 #define CATS_SIMULATION_GEOMETRY_H
-
+#include "bdc_memory/bdc_memory.h"
 #include "cats_datatypes.h"
 
 struct simulation_geometry {
         bool gdal_registered;
-        struct cats_dimension dimension;
-        struct cats_dimension dimension_orig;
+        struct array_dimension dimension;
+        struct array_dimension dimension_orig;
         cats_dt_coord row_offset;
         cats_dt_coord col_offset;
         double origin_x;
diff --git a/src/cats/debug/debug.c b/src/cats/debug/debug.c
index c2d6ed8046441a56f3e4bad195a4ac3803de7fe0..ebe381a57c45c402db821cb9d3a75fa58db646f9 100644
--- a/src/cats/debug/debug.c
+++ b/src/cats/debug/debug.c
@@ -20,10 +20,8 @@
 //
 
 #include "cats_global.h"
-#include <stdint.h>
 #include <stdarg.h>
-#include <memory/raw_arrays.h>
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 #include "debug/debug.h"
 #include "threading/threading-helpers.h"
 #include <cats_strings/cats_strings.h>
diff --git a/src/cats/debug/debug_vital_rates.c b/src/cats/debug/debug_vital_rates.c
index 7219c57d52007f0733bf8a941f89bbfd346f5f8c..ca9da40274bbe54f90f692b0b6daea0a60d91f7e 100644
--- a/src/cats/debug/debug_vital_rates.c
+++ b/src/cats/debug/debug_vital_rates.c
@@ -22,7 +22,7 @@
 
 #include "debug_vital_rates.h"
 #include "data/species_parameters.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "inline_carrying_capacity.h"
 #include "grids/grid_setup.h"
 #include "paths/directory_helper.h"
diff --git a/src/cats/dispersal/dispersal.c b/src/cats/dispersal/dispersal.c
index 92adefee7b7f13c00b45bdb3d58f1734fc3a8e5e..3f0aeaf2d272debe8513a2ccb036f6f3b700431e 100644
--- a/src/cats/dispersal/dispersal.c
+++ b/src/cats/dispersal/dispersal.c
@@ -47,7 +47,7 @@
 #include "mpi/mpi_cats.h"
 #endif
 
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "inline_overlays.h"
 
 // ANSATZPUNKTE
diff --git a/src/cats/dispersal/dispersal_helper.c b/src/cats/dispersal/dispersal_helper.c
index 45d2fb669c1e7286545a9417607cf71d16e5389a..df26f0cfe80cc53c33b0f70672e69be8d4a92b2d 100644
--- a/src/cats/dispersal/dispersal_helper.c
+++ b/src/cats/dispersal/dispersal_helper.c
@@ -26,8 +26,7 @@
 #include "dispersal.h"
 #include "misc/cats_random.h"
 #include "threading/threading-helpers.h"
-#include "memory/cats_memory.h"
-#include "memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
 
 
 cats_dt_rates get_average_local_dispersal(const struct cats_dispersal *dispersal, const struct cats_configuration *conf)
diff --git a/src/cats/environment/environment.c b/src/cats/environment/environment.c
index 833be2cfc18bf501116b367303376db06ab3206b..353a79783c1cd82b153359f0680f06f7ff19be5e 100644
--- a/src/cats/environment/environment.c
+++ b/src/cats/environment/environment.c
@@ -152,7 +152,7 @@ load_environment_raster(struct cats_configuration *conf, struct cats_environment
         raster->interpolation_type = type;
         raster->environment_type = environment_type;
         if (raster->values == NULL) {
-                raster->values = new_raw_2d_array_from_dimension(conf->geometry.dimension, sizeof(cats_dt_environment));
+                raster->values = new_raw_2d_array_from_dimension(&conf->geometry.dimension, sizeof(cats_dt_environment));
 
         }
         struct raster_load_wrapper wrapper = {.geometry = &conf->geometry, .target_environment = raster->values,
diff --git a/src/cats/environment/environment_rasters.c b/src/cats/environment/environment_rasters.c
index 1c44aca4b6d471c06c9008657b4887ae3affb3cf..b5e8016f0661c5636eac8d8eb4c76c02f80488f0 100644
--- a/src/cats/environment/environment_rasters.c
+++ b/src/cats/environment/environment_rasters.c
@@ -50,7 +50,7 @@ void create_raster_if_needed(struct cats_configuration *conf, struct cats_enviro
 
         log_message(LOG_INFO, "\tinitializing empty grid for <%s>", get_raster_type_name_specific(raster));
         log_message(LOG_DEBUG, "%s: ALLOCATING NEW GRID NOW", __func__);
-        raster->values = new_raw_2d_array_from_dimension(conf->geometry.dimension, sizeof(cats_dt_environment));
+        raster->values = new_raw_2d_array_from_dimension(&conf->geometry.dimension, sizeof(cats_dt_environment));
         raster->dimension.rows = conf->geometry.dimension.rows;
         raster->dimension.cols = conf->geometry.dimension.cols;
 
diff --git a/src/cats/environment/environment_rasters.h b/src/cats/environment/environment_rasters.h
index 6e38f42b8509bf17c365090f7aace73d1e50ee7f..6cb05c5ae5a39913dc4187f56f11bcbf92e4de2a 100644
--- a/src/cats/environment/environment_rasters.h
+++ b/src/cats/environment/environment_rasters.h
@@ -23,6 +23,7 @@
 #define CATS_ENVIRONMENT_RASTERS_H
 
 #include "data/cats_datatypes.h"
+#include "bdc_memory/bdc_memory.h"
 
 struct cats_configuration;
 
@@ -55,7 +56,7 @@ enum environment_type {
 
 struct cats_environment_raster {
         cats_dt_environment **values;     //!< the values as 2D-grid
-        struct cats_dimension dimension;
+        struct array_dimension dimension;
         enum interpolation_type interpolation_type;            //!< are we the start, end or current set of values?
         enum environment_variable_type environment_type;
         int year;                         //!< temporal information: which year is loaded in \ref cats_suitability.values? INT_MIN for unknown or not loaded
diff --git a/src/cats/environment/environment_registry.c b/src/cats/environment/environment_registry.c
index e7898d6ce7c13a32335cde0fc70ebb38ade287e2..fa1f606830009413903de358d4d29dedf73d1a14 100644
--- a/src/cats/environment/environment_registry.c
+++ b/src/cats/environment/environment_registry.c
@@ -24,7 +24,7 @@
 #include <string.h>
 #include <limits.h>
 #include "environment/environment_structures.h"
-#include "memory/arrays.h"
+#include "bdc_memory/bdc_memory.h"
 #include <logging/logging.h>
 
 void reset_environment_registry(struct cats_environment_registry *reg)
@@ -45,9 +45,8 @@ char *get_suitability_name_from_species(const char *name)
 
 struct cats_environment_variable *
 add_environment_to_registry(struct cats_environment_registry *registry, const char *name,
-                            enum environment_variable_type type,
-                            int32_t interpolation, int32_t reload_interval,
-                            const char *file_name_pattern, const struct cats_dimension *dimension)
+                            enum environment_variable_type type, const char *file_name_pattern, int32_t reload_interval,
+                            int32_t interpolation, const struct array_dimension *dimension)
 {
         if (registry->name == NULL) {
                 log_message(LOG_ERROR, "%s: name variable is NULL!", __func__);
@@ -117,7 +116,7 @@ add_environment_to_registry(struct cats_environment_registry *registry, const ch
         env_var->current.quiet = false;
         env_var->start.quiet = false;
         env_var->end.quiet = false;
-        cats_dt_environment **tmp = new_raw_2d_array_from_dimension(*dimension, sizeof(cats_dt_environment));
+        cats_dt_environment **tmp = new_raw_2d_array_from_dimension(dimension, sizeof(cats_dt_environment));
         env_var->current.values = tmp;
         env_var->end.values = NULL;
         env_var->start.values = NULL;
diff --git a/src/cats/environment/environment_registry.h b/src/cats/environment/environment_registry.h
index 6735356875615a8bf298ffb6e545b9270656f540..1d4680f2160cc46b354b6d2dd67ebf41671ad086 100644
--- a/src/cats/environment/environment_registry.h
+++ b/src/cats/environment/environment_registry.h
@@ -35,9 +35,8 @@ char *get_suitability_name_from_species(const char *name);
 
 struct cats_environment_variable *
 add_environment_to_registry(struct cats_environment_registry *registry, const char *name,
-                            enum environment_variable_type type,
-                            int32_t interpolation, int32_t reload_interval, const char *file_name_pattern,
-                            const struct cats_dimension *dimension);
+                            enum environment_variable_type type, const char *file_name_pattern, int32_t reload_interval,
+                            int32_t interpolation, const struct array_dimension *dimension);
 
 struct cats_environment_variable *get_environment_from_registry(struct cats_environment_registry *reg, char *name);
 
diff --git a/src/cats/environment/environment_set.c b/src/cats/environment/environment_set.c
index f62b1f908f96362ed408507a70f646bb25605fa3..7e5f6b0662ebd9f4e8fb14169b6220304fc7ca51 100644
--- a/src/cats/environment/environment_set.c
+++ b/src/cats/environment/environment_set.c
@@ -25,7 +25,7 @@
 #include "configuration/configuration.h"
 #include "environment/environment.h"
 #include "environment_set.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "environment/glm.h"
 #include "configuration/print_configuration.h"
 
diff --git a/src/cats/environment/load_environment.c b/src/cats/environment/load_environment.c
index 3fa2f6ef0e4a89c350a551e9c4ac56595ce8160a..c1324c5583a68fa3d4859be34a9db7bab54c862b 100644
--- a/src/cats/environment/load_environment.c
+++ b/src/cats/environment/load_environment.c
@@ -37,8 +37,8 @@
 #include "logging.h"
 #include "environment.h"
 #include "misc/cats_maths_inline.h"
-#include "../../memory/arrays.h"
-#include "../../memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
+
 #include "grids/gdal_save.h"
 #include "inline.h"
 #include "paths/paths.h"
@@ -146,7 +146,7 @@ load_environment_if_needed(struct cats_configuration *conf, struct cats_environm
                             "%s: loading interpolated %s %s for year %d (interpolated between %d and %d)",
                             short_name, name, environment->pattern, time, start, end);
                 load_environment_interpolated(conf, environment, start, end, time);
-       
+
         }
 
 }
@@ -154,7 +154,7 @@ load_environment_if_needed(struct cats_configuration *conf, struct cats_environm
 
 void save_glm(struct cats_configuration *conf, const struct cats_environment *env, int32_t time)
 {
-        double **values = new_raw_2d_array_from_dimension(conf->geometry.dimension, sizeof(double));
+        double **values = new_raw_2d_array_from_dimension(&conf->geometry.dimension, sizeof(double));
         struct cats_vital_rate rate_info = {0};
         rate_info.environment_set = (struct cats_environment *) env;
         rate_info.density = NO_DENSITY_DEP;
diff --git a/src/cats/grids/cats_grid.c b/src/cats/grids/cats_grid.c
index 04f9b4dedc6f4ed68230b77b53cf69893bbc0357..9665728c33dee67cfa59c6909ff9b2d944d3d439 100644
--- a/src/cats/grids/cats_grid.c
+++ b/src/cats/grids/cats_grid.c
@@ -42,7 +42,7 @@
 #include "stats/grid_stats.h"
 #include "gdal_load.h"
 #include "grid_setup.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "misc/cats_random.h"
 
 #ifdef USEMPI
@@ -142,7 +142,7 @@ create_and_initialize_grid(struct cats_configuration *conf, const int32_t id, st
 }
 
 
-void initialize_grid(struct cats_grid *grid, struct cats_configuration *conf, struct cats_dimension dimension, int id)
+void initialize_grid(struct cats_grid *grid, struct cats_configuration *conf, struct array_dimension dimension, int id)
 {
         assert(conf != NULL);
         assert(grid != NULL);
@@ -217,7 +217,7 @@ void initialize_grid(struct cats_grid *grid, struct cats_configuration *conf, st
 }
 
 
-int64_t raster_cell_count(struct cats_dimension raster)
+int64_t raster_cell_count(struct array_dimension raster)
 {
         assert(raster.rows >= 0);
         assert(raster.cols >= 0);
@@ -350,7 +350,7 @@ void initialize_grid_stats(struct cats_grid *grid, struct cats_configuration *co
 {
         assert(grid != NULL);
         init_statistics(&grid->stats, &conf->stats_registry);
-        grid->stats.has_been_populated = (char **) new_raw_2d_array_from_dimension(grid->dimension, sizeof(char));
+        grid->stats.has_been_populated = (char **) new_raw_2d_array_from_dimension(&grid->dimension, sizeof(char));
 
         char *filename = get_grid_stat_filename(grid, conf);
 
diff --git a/src/cats/grids/cats_grid.h b/src/cats/grids/cats_grid.h
index 4a6ff2ee10ee83a6bc6adbcce969ee31008c66d2..2fc345994a9ae60907f6f4e04d405413bf3c9cb9 100644
--- a/src/cats/grids/cats_grid.h
+++ b/src/cats/grids/cats_grid.h
@@ -25,9 +25,9 @@
 #include "data/cats_grid.h"
 #include "configuration/configuration.h"
 
-int64_t raster_cell_count(struct cats_dimension raster);
+int64_t raster_cell_count(struct array_dimension raster);
 
-void initialize_grid(struct cats_grid *grid, struct cats_configuration *conf, struct cats_dimension dimension, int id);
+void initialize_grid(struct cats_grid *grid, struct cats_configuration *conf, struct array_dimension dimension, int id);
 
 
 void cleanup_grid(struct cats_grid *grid);
@@ -41,5 +41,5 @@ void cleanup_array_of_grids(struct cats_grid ***grid, int grid_count);
 
 void do_all_grids(struct cats_grid **grids, struct cats_configuration *conf, grid_function function);
 
-void check_raster_dimensions(struct cats_dimension to_check, struct cats_dimension reference);
+void check_raster_dimensions(struct array_dimension to_check, struct array_dimension reference);
 
diff --git a/src/cats/grids/gdal_helper.c b/src/cats/grids/gdal_helper.c
index 7173136b04698a9499190cc200b8f24fdbf0ea89..403df5601e4fe85ec1911094ce27f14dc515e69d 100644
--- a/src/cats/grids/gdal_helper.c
+++ b/src/cats/grids/gdal_helper.c
@@ -207,7 +207,7 @@ void get_projection_from_file(struct simulation_geometry *geometry, const char *
 
 
 GDALDatasetH
-create_gdal_dataset(const struct simulation_geometry *geometry, const char *filename, struct cats_dimension dimension,
+create_gdal_dataset(const struct simulation_geometry *geometry, const char *filename, struct array_dimension dimension,
                     int bands,
                     GDALDataType datatype, const struct cats_configuration *conf)
 {
@@ -240,7 +240,7 @@ create_gdal_dataset(const struct simulation_geometry *geometry, const char *file
 
 
 void set_gdal_dataset_geo_info(GDALDatasetH dataset, const struct simulation_geometry *geometry,
-                               const struct cats_dimension *offset)
+                               const struct array_dimension *offset)
 {
         assert(geometry != NULL);
         assert(dataset != NULL);
diff --git a/src/cats/grids/gdal_helper.h b/src/cats/grids/gdal_helper.h
index a8f4cf5ea2b283131e3ab80ea86cc1f8469d7cc9..f18faedbac69ac83a4445a8799aa9e13c7c63ab0 100644
--- a/src/cats/grids/gdal_helper.h
+++ b/src/cats/grids/gdal_helper.h
@@ -46,13 +46,13 @@ void set_gdal_dataset_metadata(GDALDatasetH dataset, const char *name, const cha
 void set_gdal_band_metadata(GDALRasterBandH band, GDALColorInterp colorint, const char *description);
 
 void set_gdal_dataset_geo_info(GDALDatasetH dataset, const struct simulation_geometry *geometry,
-                               const struct cats_dimension *offset);
+                               const struct array_dimension *offset);
 
 void gdal_destroy(void);
 
 void load_global_geometry(struct simulation_geometry *geometry, const char *filename);
 
 GDALDatasetH
-create_gdal_dataset(const struct simulation_geometry *geometry, const char *filename, struct cats_dimension dimension,
+create_gdal_dataset(const struct simulation_geometry *geometry, const char *filename, struct array_dimension dimension,
                     int bands,
                     GDALDataType datatype, const struct cats_configuration *conf);
diff --git a/src/cats/grids/gdal_load.c b/src/cats/grids/gdal_load.c
index c52e27aa5fb795c75635fba5c0f14d86130f8990..78b6d82552eb2da06a67e4a123d0393cc1614c58 100644
--- a/src/cats/grids/gdal_load.c
+++ b/src/cats/grids/gdal_load.c
@@ -221,8 +221,8 @@ get_double_values_from_gdal(struct simulation_geometry *geometry, const char *fi
 
         cats_dt_coord rows = GDALGetRasterYSize(dataset);
         cats_dt_coord cols = GDALGetRasterXSize(dataset);
-        struct cats_dimension dim = {.rows = rows, .cols=cols};
-        struct cats_2d_array_double *raster = new_2d_array_double(dim);
+        struct array_dimension dim = {.rows = rows, .cols=cols};
+        struct cats_2d_array_double *raster = new_2d_array_double(&dim);
 
 
         if (raster->dimension.cols <= 0 || raster->dimension.rows <= 0) {
diff --git a/src/cats/grids/gdal_load.h b/src/cats/grids/gdal_load.h
index b53119198d717eac3a8e8b079a1d556541c79ce1..6f51eacc9d5716c2638cb7d69edea19ed0063e6b 100644
--- a/src/cats/grids/gdal_load.h
+++ b/src/cats/grids/gdal_load.h
@@ -25,7 +25,7 @@
 #include "data/cats_datatypes.h"
 #include "configuration/configuration.h"
 #include "grid_wrapper.h"
-#include <memory/arrays.h>
+#include "bdc_memory/bdc_memory.h"
 #include "data/simulation_geometry.h"
 
 enum RASTER_LOAD_TYPE {
diff --git a/src/cats/grids/gdal_save.c b/src/cats/grids/gdal_save.c
index 26e395df1fe9fb8af811cf07ff1d3590f8248128..847f30a3f42c4b5ec46ef2954956ce807a206358 100644
--- a/src/cats/grids/gdal_save.c
+++ b/src/cats/grids/gdal_save.c
@@ -26,12 +26,12 @@
 #include "gdal_save.h"
 #include "data/cats_grid.h"
 #include "configuration/configuration.h"
-#include "memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
 #include "logging.h"
 #include "paths/paths.h"
 #include "gdal_load.h"
 #include "gdal_helper.h"
-#include "memory/arrays.h"
+
 #include "paths/output_paths.h"
 #include "inline.h"
 #include "inline_vital_rates.h"
@@ -124,7 +124,7 @@ void *save_dispersed_seeds_to_gdal(struct cats_grid *grid, struct cats_configura
 
         char *filename = get_current_dispersed_seeds_filename(grid, conf);
 
-        double **seeds = new_raw_2d_array_from_dimension(grid->dimension,
+        double **seeds = new_raw_2d_array_from_dimension(&grid->dimension,
                                                          sizeof(double));
         const int32_t rows = grid->dimension.rows;
         const int32_t cols = grid->dimension.cols;
@@ -163,7 +163,7 @@ void *save_seeds_to_gdal(struct cats_grid *grid, struct cats_configuration *conf
         for (int i = 0; i < seed_persistence; i++) {
                 char *filename = get_current_seeds_filename(grid, conf, i);
 
-                int32_t **seeds = new_raw_2d_array_from_dimension(grid->dimension,
+                int32_t **seeds = new_raw_2d_array_from_dimension(&grid->dimension,
                                                                   sizeof(int32_t)); //new_int32t_grid(grid->rows, grid->cols);
                 const int32_t rows = grid->dimension.rows;
                 const int32_t cols = grid->dimension.cols;
@@ -226,7 +226,7 @@ void *save_juveniles_to_gdal(struct cats_grid *grid, struct cats_configuration *
                                 }
                         }
                 }
-                struct cats_dimension dim = {.rows = rows, .cols = cols};
+                struct array_dimension dim = {.rows = rows, .cols = cols};
                 struct grid_wrapper data = gridwrapper(juvs, dim);
                 save_grid_to_gdal(&data, GDT_Int32, conf, filename, conf->param[id].species_name);
                 free(filename);
diff --git a/src/cats/grids/grid_converters.c b/src/cats/grids/grid_converters.c
index b6c40f25254cdc96055b216410ac0319191a60b2..e65ad0058fa9f11e5f845f67d2ee895847ad87c3 100644
--- a/src/cats/grids/grid_converters.c
+++ b/src/cats/grids/grid_converters.c
@@ -24,7 +24,7 @@
 
 #include "data/cats_grid.h"
 #include "configuration/configuration.h"
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 
 #include "logging.h"
 #include "actions/cats_actions.h"
@@ -36,7 +36,7 @@
 cats_dt_environment **convert_double_to_environment(const struct cats_2d_array_double *in_grid)
 {
         log_message(LOG_DEBUG, "%s: ALLOCATING NEW GRID NOW", __func__);
-        cats_dt_environment **array = new_raw_2d_array_from_dimension(in_grid->dimension, sizeof(cats_dt_environment));
+        cats_dt_environment **array = new_raw_2d_array_from_dimension(&in_grid->dimension, sizeof(cats_dt_environment));
         const cats_dt_coord rows = in_grid->dimension.rows;
         const cats_dt_coord cols = in_grid->dimension.cols;
         for (int32_t r = 0; r < rows; r++) {
diff --git a/src/cats/grids/grid_converters.h b/src/cats/grids/grid_converters.h
index a070da1772a00ce74a4ccfbfa6a695aafb3cac69..526985a22c9ba04f8d42ca17a5f94be787ae8000 100644
--- a/src/cats/grids/grid_converters.h
+++ b/src/cats/grids/grid_converters.h
@@ -21,7 +21,7 @@
 
 #pragma once
 
-#include <memory/arrays.h>
+#include "bdc_memory/bdc_memory.h"
 
 cats_dt_environment **convert_double_to_environment(const struct cats_2d_array_double *in_grid);
 
diff --git a/src/cats/grids/grid_setup.c b/src/cats/grids/grid_setup.c
index 63d74fc311bf5974a12b88f60a3045b11a3220af..365cff4377e259ed219a26c0d37ccc1d326213fc 100644
--- a/src/cats/grids/grid_setup.c
+++ b/src/cats/grids/grid_setup.c
@@ -24,7 +24,7 @@
 #include "grid_setup.h"
 
 #include "logging.h"
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 
 
 void setup_grid_seed_structures(const struct cats_configuration *conf, struct cats_grid *const grid, int grid_id)
@@ -44,9 +44,9 @@ void setup_grid_seed_structures(const struct cats_configuration *conf, struct ca
                 exit(EXIT_FAILURE);
         }
 
-        grid->dispersed_seeds = (cats_dt_seeds **) new_raw_2d_array_from_dimension(grid->dimension,
+        grid->dispersed_seeds = (cats_dt_seeds **) new_raw_2d_array_from_dimension(&grid->dimension,
                                                                                    sizeof(cats_dt_seeds));
-        grid->seeds_produced = (cats_dt_seeds **) new_raw_2d_array_from_dimension(grid->dimension,
+        grid->seeds_produced = (cats_dt_seeds **) new_raw_2d_array_from_dimension(&grid->dimension,
                                                                                   sizeof(cats_dt_seeds));
         grid->seed_bank = calloc_or_die(rows, sizeof(cats_dt_seeds **));
 
diff --git a/src/cats/grids/grid_wrapper.c b/src/cats/grids/grid_wrapper.c
index 2fd585ab433dedc7cf0d3b87aa9ce37e2d361ac1..ab06ac180fbaadfa13faac16096c0de1ee3bd387 100644
--- a/src/cats/grids/grid_wrapper.c
+++ b/src/cats/grids/grid_wrapper.c
@@ -25,7 +25,7 @@
 #include "grid_wrapper.h"
 
 
-struct grid_wrapper gridwrapper_from_int32t(int32_t **data, struct cats_dimension dimension)
+struct grid_wrapper gridwrapper_from_int32t(int32_t **data, struct array_dimension dimension)
 {
         struct grid_wrapper result = {0};
         result.data_int32 = data;
@@ -37,7 +37,7 @@ struct grid_wrapper gridwrapper_from_int32t(int32_t **data, struct cats_dimensio
 }
 
 
-struct grid_wrapper gridwrapper_from_double(double **data, struct cats_dimension dimension)
+struct grid_wrapper gridwrapper_from_double(double **data, struct array_dimension dimension)
 {
         struct grid_wrapper result = {0};
         result.data_double = data;
@@ -49,7 +49,7 @@ struct grid_wrapper gridwrapper_from_double(double **data, struct cats_dimension
 }
 
 
-struct grid_wrapper gridwrapper_from_float(float **data, struct cats_dimension dimension)
+struct grid_wrapper gridwrapper_from_float(float **data, struct array_dimension dimension)
 {
         struct grid_wrapper result = {0};
         result.offset.cols = 0;
@@ -64,7 +64,7 @@ struct grid_wrapper gridwrapper_from_float(float **data, struct cats_dimension d
 }
 
 
-struct grid_wrapper gridwrapper_from_env(cats_dt_environment **data, struct cats_dimension dimension)
+struct grid_wrapper gridwrapper_from_env(cats_dt_environment **data, struct array_dimension dimension)
 {
         struct grid_wrapper result = {0};
         result.data_float = data;
@@ -77,7 +77,7 @@ struct grid_wrapper gridwrapper_from_env(cats_dt_environment **data, struct cats
 }
 
 
-struct grid_wrapper gridwrapper_1d(void *data, GDALDataType dt, struct cats_dimension dimension)
+struct grid_wrapper gridwrapper_1d(void *data, GDALDataType dt, struct array_dimension dimension)
 {
         struct grid_wrapper result = {0};
         result.nodata = -9999;
diff --git a/src/cats/grids/grid_wrapper.h b/src/cats/grids/grid_wrapper.h
index 0bde4522cfcc9920247bdf106d5134613f1c8178..3668443ac6395cc5b8a4cc374a27b772a72f0d67 100644
--- a/src/cats/grids/grid_wrapper.h
+++ b/src/cats/grids/grid_wrapper.h
@@ -39,8 +39,8 @@ struct grid_wrapper {
         char *data_char_1d;
         double *data_double_1d;
 
-        struct cats_dimension dimension;
-        struct cats_dimension offset;
+        struct array_dimension dimension;
+        struct array_dimension offset;
 
         GDALDataType dt;
 
@@ -49,13 +49,13 @@ struct grid_wrapper {
 };
 
 
-struct grid_wrapper gridwrapper_from_float(float **data, struct cats_dimension dimension);
+struct grid_wrapper gridwrapper_from_float(float **data, struct array_dimension dimension);
 
-struct grid_wrapper gridwrapper_from_int32t(int32_t **data, struct cats_dimension dimension);
+struct grid_wrapper gridwrapper_from_int32t(int32_t **data, struct array_dimension dimension);
 
-struct grid_wrapper gridwrapper_from_double(double **data, struct cats_dimension dimension);
+struct grid_wrapper gridwrapper_from_double(double **data, struct array_dimension dimension);
 
-struct grid_wrapper gridwrapper_1d(void *data, GDALDataType dt, struct cats_dimension dimension);
+struct grid_wrapper gridwrapper_1d(void *data, GDALDataType dt, struct array_dimension dimension);
 
 #define gridwrapper(DATA, DIMENSION) _Generic((DATA), \
  int32_t **:        gridwrapper_from_int32t, \
diff --git a/src/cats/inline.h b/src/cats/inline.h
index 1c29c2829d10113bcdb9b49ebe295c2d4786cd3c..dd1e76fd38ff240a8d5a3ca5d81e1882f8dbf83e 100644
--- a/src/cats/inline.h
+++ b/src/cats/inline.h
@@ -35,7 +35,7 @@
 #include "logging.h"
 #include "overlays/overlays.h"
 #include "misc/cats_maths_inline.h"
-#include "memory/arrays.h"
+#include "bdc_memory/bdc_memory.h"
 
 #include "inline_carrying_capacity.h"
 #include "inline_population.h"
diff --git a/src/cats/inline_population.h b/src/cats/inline_population.h
index 7c1ba19c66dc7405fdbce7138308cfd32e1f54d2..20937d8d3b768e025fd73c42f91a824d3b5ba9ab 100644
--- a/src/cats/inline_population.h
+++ b/src/cats/inline_population.h
@@ -259,7 +259,7 @@ get_population_all_classes_ts(const struct cats_grid **grids, cats_dt_coord row,
 #include "defaults.h"
 #include "environment/glm.h"
 #include "cats_global.h"
-#include "../memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
 #include "plants/plant_rates.h"
 #include "data/cats_grid.h"
 #include "configuration/configuration.h"
@@ -268,7 +268,6 @@ get_population_all_classes_ts(const struct cats_grid **grids, cats_dt_coord row,
 #include "logging.h"
 #include "overlays/overlays.h"
 #include "misc/cats_maths_inline.h"
-#include "memory/arrays.h"
 #include "inline_vital_rates.h"
 #include "inline_overlays.h"
 #include "inline_carrying_capacity.h"
diff --git a/src/cats/lambda/eigen_power.c b/src/cats/lambda/eigen_power.c
index 7fc8adda42856653bc2921dd5f5f45aac94cd564..9768dde6b80831189367609af7db1eee8a83f6ce 100644
--- a/src/cats/lambda/eigen_power.c
+++ b/src/cats/lambda/eigen_power.c
@@ -23,8 +23,7 @@
 #include <stdbool.h>
 #include <stdlib.h>
 #include "eigen_power.h"
-#include "logging/logging.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 
 
 static double *ep_empty_vec(int N)
diff --git a/src/cats/lambda/lambda-grid.c b/src/cats/lambda/lambda-grid.c
index 7cde1c31f9c71caa4b2da0051da18710236397af..42ea357d0dbc5dbf63eb2a5ba7bcc7d42d47d96d 100644
--- a/src/cats/lambda/lambda-grid.c
+++ b/src/cats/lambda/lambda-grid.c
@@ -25,7 +25,7 @@
 #include "inline.h"
 #include "grids/gdal_save.h"
 #include "environment/environment_set.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "lambda.h"
 #include "inline_vital_rates.h"
 #include "inline_overlays.h"
@@ -127,7 +127,7 @@ void save_lambda_grid(struct cats_configuration *conf, struct cats_grid *grid, b
         cats_dt_coord cols = conf->geometry.dimension.cols;
 
 
-        double **lambdas = new_raw_2d_array_from_dimension(grid->dimension,
+        double **lambdas = new_raw_2d_array_from_dimension(&grid->dimension,
                                                            sizeof(double));
         log_message(LOG_IMPORTANT, "Calculating lambda grid");
         cats_dt_rates max_cc = get_vital_rate_maximum(&grid->param.carrying_capacity);
diff --git a/src/cats/lambda/leslie_matrix.c b/src/cats/lambda/leslie_matrix.c
index 2128d84b4b7906c1debc360b49381c144a77838c..e1a858201b7a2c4c927c5d514f6cf04775b04911 100644
--- a/src/cats/lambda/leslie_matrix.c
+++ b/src/cats/lambda/leslie_matrix.c
@@ -23,7 +23,7 @@
 #include <stdio.h>
 #include "dispersal/dispersal.h"
 #include "leslie_matrix.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "logging/logging.h"
 #include "configuration/configuration.h"
 #include "inline.h"
diff --git a/src/cats/lambda/matrix_helpers.c b/src/cats/lambda/matrix_helpers.c
index 9c653b68838cbc029f45dfc097a6d750e4160ccd..c054e992f0a9c06fb3b675d4f1f0ce60360e22d1 100644
--- a/src/cats/lambda/matrix_helpers.c
+++ b/src/cats/lambda/matrix_helpers.c
@@ -21,9 +21,8 @@
 //
 
 #include <assert.h>
-#include <stdio.h>
 #include <logging/logging.h>
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 #include "cats_global.h"
 
 
diff --git a/src/cats/misc/cats_maths.c b/src/cats/misc/cats_maths.c
index fc65edffcfec8f05792005aa263de82671b1b8ee..e932b4eb48f86e56c4480afc32032c44d353e1cb 100644
--- a/src/cats/misc/cats_maths.c
+++ b/src/cats/misc/cats_maths.c
@@ -23,8 +23,7 @@
 #include <assert.h>
 
 #include "cats_maths.h"
-#include "../../memory/cats_memory.h"
-#include "../../memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
 #include "logging.h"
 
 
diff --git a/src/cats/misc/debug.c b/src/cats/misc/debug.c
index b6d8d73f44d5437a29e4446bb81d37ee371cf946..f86e57bcf73aae439cb3d99d0265bdff5a830d02 100644
--- a/src/cats/misc/debug.c
+++ b/src/cats/misc/debug.c
@@ -23,7 +23,7 @@
 #include "data/cats_grid.h"
 #include "misc.h"
 #include "inline.h"
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 
 
 void
diff --git a/src/cats/misc/output.c b/src/cats/misc/output.c
index 48919cadd44fa9b9bbb9d7922541b7ab60418c38..df52926a4040efd5f1bf14066c597ca0c357c904 100644
--- a/src/cats/misc/output.c
+++ b/src/cats/misc/output.c
@@ -32,7 +32,7 @@
 
 
 void
-save_1d_grid(double *src, struct cats_dimension dimension, char *filename, struct cats_configuration *conf)
+save_1d_grid(double *src, struct array_dimension dimension, char *filename, struct cats_configuration *conf)
 {
 
         struct grid_wrapper data = gridwrapper_1d(src, GDT_Float64, dimension);
@@ -40,8 +40,8 @@ save_1d_grid(double *src, struct cats_dimension dimension, char *filename, struc
 }
 
 
-void save_2d_grid(float **src, struct cats_dimension dimension, char *filename, struct cats_configuration *conf,
-                  struct cats_dimension *offset)
+void save_2d_grid(float **src, struct array_dimension dimension, char *filename, struct cats_configuration *conf,
+                  struct array_dimension *offset)
 {
         struct grid_wrapper data = gridwrapper(src, dimension);
         if (offset != NULL) {
diff --git a/src/cats/misc/output.h b/src/cats/misc/output.h
index bf39bbcf3b385d7a03bc724f23cdd749335d38e5..b484d4651bad1fd45d7639f3f478ffc463c095e7 100644
--- a/src/cats/misc/output.h
+++ b/src/cats/misc/output.h
@@ -28,10 +28,10 @@
 
 
 void
-save_1d_grid(double *src, struct cats_dimension dimension, char *filename, struct cats_configuration *conf);
+save_1d_grid(double *src, struct array_dimension dimension, char *filename, struct cats_configuration *conf);
 
-void save_2d_grid(float **src, struct cats_dimension dimension, char *filename, struct cats_configuration *conf,
-                  struct cats_dimension *offset);
+void save_2d_grid(float **src, struct array_dimension dimension, char *filename, struct cats_configuration *conf,
+                  struct array_dimension *offset);
 
 
 #endif
\ No newline at end of file
diff --git a/src/cats/modules/module_header.h b/src/cats/modules/module_header.h
index 7de3891be5df4d93c348209c13728c47c59ad0ed..9f6f2c52db2973b8db72aaef652525a0ebbc908d 100644
--- a/src/cats/modules/module_header.h
+++ b/src/cats/modules/module_header.h
@@ -28,7 +28,7 @@
 #include <assert.h>
 #include "logging.h"
 #include "data/cats_grid.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 
 extern int CATS_MODULE_ID_INTERNAL;
 extern void *CATS_MODULE_DATA_INTERNAL;
diff --git a/src/cats/mpi/mpi_cats.c b/src/cats/mpi/mpi_cats.c
index 92b983df65935e6bc7c45676f2d5f20de3d48543..81dd18393f9714dcde439dbfa1aad1a369272932 100644
--- a/src/cats/mpi/mpi_cats.c
+++ b/src/cats/mpi/mpi_cats.c
@@ -31,11 +31,10 @@
 #include "configuration/configuration.h"
 #include "misc/misc.h"
 #include "misc/output.h"
-#include "memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
 #include "paths/paths.h"
 #include "grids/gdal_load.h"
 #include "mpi_cats.h"
-#include "memory/cats_memory.h"
 #include "mpi/mpi_grid_helpers.h"
 
 
diff --git a/src/cats/mpi/mpi_debug.c b/src/cats/mpi/mpi_debug.c
index 86fc215052a170e5ef4b9bf81947583b600943ca..1570c2c220b55aaf1aeb217d04b3a96c51279dea 100644
--- a/src/cats/mpi/mpi_debug.c
+++ b/src/cats/mpi/mpi_debug.c
@@ -61,7 +61,7 @@ char *dispersed_seeds_mpi_local_filename(const struct cats_configuration *conf)
 void mpi_save_locally_dispersed_seeds(struct cats_configuration *conf, struct cats_grid *grid)
 {
         char *filename = dispersed_seeds_mpi_local_filename(conf);
-        struct cats_dimension offset = {0};
+        struct array_dimension offset = {0};
         offset.cols = 0;
         int radius = 0;
 
@@ -72,7 +72,7 @@ void mpi_save_locally_dispersed_seeds(struct cats_configuration *conf, struct ca
         log_message(LOG_RAW, "rank %d, rows %d cols %d, rows before %d, rows after %d, row offset %d\n\n", conf->mpi.world_rank,
                grid->dimension.rows,
                grid->dimension.cols, rows_before, rows_after, conf->geometry.row_offset);
-        struct cats_dimension dimension;
+        struct array_dimension dimension;
         dimension.cols = grid->dimension.cols;
         dimension.rows = grid->dimension.rows + rows_before + rows_after;
         save_2d_grid(grid->seeds_0_all, dimension, filename, conf, &offset);
diff --git a/src/cats/mpi/mpi_grid_helpers.c b/src/cats/mpi/mpi_grid_helpers.c
index fdb04b339cf13d4b8737fc1987836e6a3ed40a00..f30cad2af1359f17aaa5f8f2e4ba918e8e1afc82 100644
--- a/src/cats/mpi/mpi_grid_helpers.c
+++ b/src/cats/mpi/mpi_grid_helpers.c
@@ -25,8 +25,7 @@
 #include "logging.h"
 #include "configuration/configuration.h"
 #include "mpi_grid_helpers.h"
-#include "memory/raw_arrays.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "grids/cats_grid.h"
 
 #ifdef USEMPI
diff --git a/src/cats/mpi/mpi_save.c b/src/cats/mpi/mpi_save.c
index a32da0ba30ad480ae837c9b42729c705742c922c..23f638b8416a61dfcadcd491214526e317d752fa 100644
--- a/src/cats/mpi/mpi_save.c
+++ b/src/cats/mpi/mpi_save.c
@@ -22,15 +22,13 @@
 #include <assert.h>
 #include "paths/paths.h"
 #include "cats_global.h"
-#include "memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
 #include "grids/cats_grid.h"
 #include "data/cats_grid.h"
 #include "mpi_save.h"
 #include "mpi_seeds.h"
-#include "logging.h"
 #include "grids/gdal_load.h"
 #include "grids/gdal_save.h"
-#include "memory/cats_memory.h"
 #include "mpi/mpi_grid_helpers.h"
 #include "paths/output_paths.h"
 
diff --git a/src/cats/mpi/mpi_scalefactor.c b/src/cats/mpi/mpi_scalefactor.c
index 19b93a6387e2c10b0908cf85c305241ae70eacb7..17c6eaee0cc4bff07085d71911a1147f7221b252 100644
--- a/src/cats/mpi/mpi_scalefactor.c
+++ b/src/cats/mpi/mpi_scalefactor.c
@@ -20,11 +20,11 @@
 //
 
 #include "mpi_scalefactor.h"
-#include <memory/raw_arrays.h>
+#include "bdc_memory/bdc_memory.h"
 #include "logging.h"
 #include "vital_rates/hybrid_functions.h"
 #include "data/cats_grid.h"
-#include <memory/cats_memory.h>
+
 
 
 #ifdef USEMPI
diff --git a/src/cats/mpi/mpi_seeds.c b/src/cats/mpi/mpi_seeds.c
index 77a1dd4473aae8ad9a890d41a016fe46946cf5f6..c818d578996e93d253bc9f1273feacc96dd952ca 100644
--- a/src/cats/mpi/mpi_seeds.c
+++ b/src/cats/mpi/mpi_seeds.c
@@ -22,10 +22,8 @@
 #include <assert.h>
 #include "data/cats_grid.h"
 #include "configuration/configuration.h"
-#include "logging.h"
-#include "grids/cats_grid.h"
 #include "mpi_grid_helpers.h"
-#include "memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
 #include "mpi_seeds.h"
 
 
diff --git a/src/cats/mpi/mpi_stats.c b/src/cats/mpi/mpi_stats.c
index 5e2fde5bf64948143b8099c7fae2bf002ec5aa89..c5eff7b5f01937493322b7041b65f016b8c14284 100644
--- a/src/cats/mpi/mpi_stats.c
+++ b/src/cats/mpi/mpi_stats.c
@@ -24,15 +24,11 @@
 #ifdef USEMPI
 
 #include <string.h>
-#include <assert.h>
 #include "data/cats_grid.h"
 #include "configuration/configuration.h"
-#include "misc/misc.h"
 #include "stats/grid_stats.h"
-#include "logging.h"
-#include "memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
 #include "mpi/mpi_stats.h"
-#include "memory/cats_memory.h"
 
 
 void collect_and_write_plant_stats_mpi(struct cats_configuration *conf, struct cats_grid *grid)
diff --git a/src/cats/overlays/overlay_exclusion.c b/src/cats/overlays/overlay_exclusion.c
index 37f082343f5ecbc10016a4316e21ce7a00554666..3b2e78417a524934d3d9cbad2e8946b6000b4185 100644
--- a/src/cats/overlays/overlay_exclusion.c
+++ b/src/cats/overlays/overlay_exclusion.c
@@ -27,7 +27,7 @@
 
 #include "logging.h"
 #include "grids/cats_grid.h"
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 #include "populations/population.h"
 #include "plants/plant_structures.h"
 #include "inline_overlays.h"
@@ -100,7 +100,7 @@ void destroy_excluded_cells_all_grids(const struct cats_configuration *conf, str
 
 struct cats_2d_array_char *translate_exclusion(const struct cats_2d_array_double *data, int64_t *excluded_count)
 {
-        struct cats_2d_array_char *result = new_2d_array_char(data->dimension);
+        struct cats_2d_array_char *result = new_2d_array_char(&data->dimension);
 
         const cats_dt_coord rows = data->dimension.rows;
         const cats_dt_coord cols = data->dimension.cols;
diff --git a/src/cats/overlays/overlay_exclusion.h b/src/cats/overlays/overlay_exclusion.h
index 5bc74a8d40841017343ffd24c907a5218a181e40..ed0eeb3af70a7bce0443f9ffb95f28c97fe0c02c 100644
--- a/src/cats/overlays/overlay_exclusion.h
+++ b/src/cats/overlays/overlay_exclusion.h
@@ -22,8 +22,8 @@
 #ifndef CATS_OVERLAY_EXCLUSION_H
 #define CATS_OVERLAY_EXCLUSION_H
 
-#include "../../memory/raw_arrays.h"
-#include "../../memory/arrays.h"
+#include "bdc_memory/bdc_memory.h"
+
 
 struct cats_2d_array_char *translate_exclusion(const struct cats_2d_array_double *data, int64_t *excluded_count);
 
diff --git a/src/cats/overlays/overlay_habitat_type_cc.c b/src/cats/overlays/overlay_habitat_type_cc.c
index 83ab768cab536eda83af44cc2720b0f92534f54d..cba3f82c576bfd00689f72b8e9cd9400b2acb3a4 100644
--- a/src/cats/overlays/overlay_habitat_type_cc.c
+++ b/src/cats/overlays/overlay_habitat_type_cc.c
@@ -27,7 +27,8 @@
 #include "overlay_habitat_type_cc.h"
 #include "cats_csv/cats_csv.h"
 #include "logging.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
+#include "data/cats_datatypes.h"
 
 
 void cleanup_habitat_layer_cc_aux(void **data)
@@ -115,7 +116,7 @@ struct cats_2d_array_double *translate_habitat(const struct cats_2d_array_double
 {
         assert(aux != NULL);
         struct habitat_layer_cc_aux *habitat_info = aux;
-        struct cats_2d_array_double *result = new_2d_array_double(data->dimension);
+        struct cats_2d_array_double *result = new_2d_array_double(&data->dimension);
 
         const cats_dt_coord rows = data->dimension.rows;
         const cats_dt_coord cols = data->dimension.cols;
diff --git a/src/cats/overlays/overlay_habitat_type_cc.h b/src/cats/overlays/overlay_habitat_type_cc.h
index 5148928e6372cf1b788d758a0e4d08e537ea3a66..fa07f3a90885fb64cc64a8c30431ce07256ab4eb 100644
--- a/src/cats/overlays/overlay_habitat_type_cc.h
+++ b/src/cats/overlays/overlay_habitat_type_cc.h
@@ -23,7 +23,7 @@
 #define CATS_OVERLAY_HABITAT_TYPE_CC_H
 
 #include <stdint.h>
-#include "../../memory/arrays.h"
+#include "bdc_memory/bdc_memory.h"
 
 #define MAX_HABITAT_TYPE_CODES 1024
 
diff --git a/src/cats/overlays/overlay_resources.c b/src/cats/overlays/overlay_resources.c
index acfef34fe5d7720de19af36fd39c89d01a1ecae7..131bdea63fc355709d109269a1ab968f20579746 100644
--- a/src/cats/overlays/overlay_resources.c
+++ b/src/cats/overlays/overlay_resources.c
@@ -22,12 +22,13 @@
 #include <assert.h>
 #include <math.h>
 #include "overlay_resources.h"
-#include "memory/arrays.h"
+#include "bdc_memory/bdc_memory.h"
+#include "data/cats_datatypes.h"
 
 
 struct cats_2d_array_double *translate_resources(const struct cats_2d_array_double *data)
 {
-        struct cats_2d_array_double *result = new_2d_array_double(data->dimension);
+        struct cats_2d_array_double *result = new_2d_array_double(&data->dimension);
 
         const cats_dt_coord rows = data->dimension.rows;
         const cats_dt_coord cols = data->dimension.cols;
diff --git a/src/cats/overlays/overlays.h b/src/cats/overlays/overlays.h
index b26e51522832a691d81bd53ad6c40b2140c64a87..75e5b9d6c8c6baebef988172d92f0aefe6e33d52 100644
--- a/src/cats/overlays/overlays.h
+++ b/src/cats/overlays/overlays.h
@@ -25,7 +25,7 @@
 #include <stdbool.h>
 #include <stdint.h>
 #include "data/cats_datatypes.h"
-#include "../../memory/arrays.h"
+#include "bdc_memory/bdc_memory.h"
 
 struct cats_configuration;
 struct cats_grid;
diff --git a/src/cats/performance/timer.c b/src/cats/performance/timer.c
index 22329f600e0629924e169a482b0e93658d3c988e..0ba6758d477058fab98cb0e1a694db6c516a2f44 100644
--- a/src/cats/performance/timer.c
+++ b/src/cats/performance/timer.c
@@ -25,12 +25,11 @@
 #include <stdint.h>
 
 #include "timer.h"
-#include "logging.h"
 #include "misc/misc.h"
 #include "temporal/phase_names.h"
 #include "temporal/years.h"
 #include "performance_stats.h"
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 
 
 struct timeval *time_difference(struct timeval *start, struct timeval *end)
diff --git a/src/cats/plants/plant_structures.c b/src/cats/plants/plant_structures.c
index ed45e5d562c3379712dc986c22166260bf7baeee..d9e54cc7484e9fe11136ca2e667524e1a17e6b57 100644
--- a/src/cats/plants/plant_structures.c
+++ b/src/cats/plants/plant_structures.c
@@ -27,7 +27,7 @@
 #include "seeds.h"
 #include "inline_population.h"
 #include "populations/population.h"
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 
 
 void destroy_plant_cell(struct cats_grid *grid, const cats_dt_coord row, const cats_dt_coord col)
diff --git a/src/cats/plants/population_stats.c b/src/cats/plants/population_stats.c
index a7471eaab743f8c4a3564fc04dc867f0cb43fb28..a68064e60c1f6365717070d26c5b1b2e37eedbab 100644
--- a/src/cats/plants/population_stats.c
+++ b/src/cats/plants/population_stats.c
@@ -19,12 +19,12 @@
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 //
 
-#include "../../memory/raw_arrays.h"
+
 #include "population_stats.h"
 #include "configuration/configuration.h"
 #include "data/cats_grid.h"
 
-#include "logging.h"
+
 
 
 void print_populated_cell_change_carrying_capacity(struct cats_configuration *conf, struct cats_grid **parent)
diff --git a/src/cats/populations/plant_juveniles.c b/src/cats/populations/plant_juveniles.c
index bd00998df84c99eceed79da56f3322a8f9080270..2573d9bd2faa9a45748a8cb9ac595aadf4ffa1e1 100644
--- a/src/cats/populations/plant_juveniles.c
+++ b/src/cats/populations/plant_juveniles.c
@@ -23,10 +23,9 @@
 #include <assert.h>
 
 #include "plant_juveniles.h"
-#include "data/cats_datatypes.h"
 #include "data/cats_grid.h"
 #include "inline_vital_rates.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 
 
 void setup_plant_juvenile_weights(struct cats_species_param *param)
diff --git a/src/cats/stats/global_stats.c b/src/cats/stats/global_stats.c
index a9addfe572edd1f980cf7a9eea3820b584ed931e..a412a8250249b7e44b8a0f4dd089875b85669f04 100644
--- a/src/cats/stats/global_stats.c
+++ b/src/cats/stats/global_stats.c
@@ -25,12 +25,11 @@
 #include "configuration/configuration.h"
 #include "misc/misc.h"
 
-#include "logging.h"
 #include "paths/paths.h"
 #include "stats/global_stats.h"
 #include "stats/grid_stats.h"
 #include "paths/output_paths.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 
 #ifdef USEMPI
 #include "mpi/mpi_stats.h"
diff --git a/src/cats/stats/grid_stats.c b/src/cats/stats/grid_stats.c
index 5438917e1a748a7127b707b4e11b71465a974ba0..a3555061074a0fed0d737df2e8015e57f49257db 100644
--- a/src/cats/stats/grid_stats.c
+++ b/src/cats/stats/grid_stats.c
@@ -25,9 +25,7 @@
 #include <assert.h>
 #include "data/cats_grid.h"
 #include "configuration/configuration.h"
-#include "misc/misc.h"
 #include "grid_stats.h"
-#include "logging.h"
 #include "paths/paths.h"
 #include "temporal/phase_names.h"
 #include "temporal/years.h"
@@ -36,13 +34,9 @@
 #include "mpi/mpi_stats.h"
 #endif
 
-#include "inline.h"
-#include "memory/arrays.h"
-#include "paths/output_paths.h"
-#include "memory/cats_memory.h"
-#include "inline_overlays.h"
-#include "inline_population.h"
-#include "populations/population.h"
+
+#include "bdc_memory/bdc_memory.h"
+
 
 
 struct string_array *add_stats_header_overlay(struct string_array *x, struct cats_configuration *conf, bool header)
diff --git a/src/cats/stats/indices.c b/src/cats/stats/indices.c
index 5f5623ad04f6e1d6c0b4edaf5d3dc53d60c51e95..7f35aef594b9914fcaa5eb816223ac4b8b816ff6 100644
--- a/src/cats/stats/indices.c
+++ b/src/cats/stats/indices.c
@@ -32,12 +32,12 @@
 #include "configuration/configuration.h"
 #include "populations/carrying_capacity.h"
 #include "actions/cats_actions.h"
-#include "logging.h"
+
 #include "indices.h"
-#include "inline.h"
-#include "memory/cats_memory.h"
+
+#include "bdc_memory/bdc_memory.h"
 #include "inline_overlays.h"
-#include "inline_carrying_capacity.h"
+
 #include "inline_population.h"
 #include "populations/population.h"
 
diff --git a/src/cats/stats/statistics.c b/src/cats/stats/statistics.c
index e397798ae4a933b773a3a90eb58fe17c173fb668..c1ed496cbcd5deeafe2bfc58b0744db5231f40d5 100644
--- a/src/cats/stats/statistics.c
+++ b/src/cats/stats/statistics.c
@@ -24,7 +24,7 @@
 #include <stdlib.h>
 #include "statistics.h"
 #include "cats_strings/cats_strings.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "configuration/configuration.h"
 
 
diff --git a/src/cats/stats/write_stats.c b/src/cats/stats/write_stats.c
index 9700929d3861ffcc0f1185c5153e01ca586d29bb..c99e118d56edbdf118cf3e482bcb0fa7320c8a0b 100644
--- a/src/cats/stats/write_stats.c
+++ b/src/cats/stats/write_stats.c
@@ -20,14 +20,14 @@
 //
 
 #include <stdlib.h>
-#include <memory/raw_arrays.h>
+#include "bdc_memory/bdc_memory.h"
 #include <string.h>
-#include <assert.h>
+
 #include "configuration/configuration.h"
-#include "logging.h"
+
 #include "data/cats_grid.h"
 #include "grid_stats.h"
-#include "defaults.h"
+
 #include "metadata.h"
 
 
diff --git a/src/cats/temporal/timeformat.c b/src/cats/temporal/timeformat.c
index 36fb2936531626acdfcfa050f802163e719db306..5120e20ae50e1e17da5fcf078f17f5e0a9f2e3d2 100644
--- a/src/cats/temporal/timeformat.c
+++ b/src/cats/temporal/timeformat.c
@@ -23,7 +23,7 @@
 
 #include "timeformat.h"
 #include "configuration/configuration.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "simulation_time.h"
 
 
diff --git a/src/cats/threading/block_tasks.c b/src/cats/threading/block_tasks.c
index b245ffd30a4dfa7b7a0289dcb23a4c4958bddaf1..cf08e6023cfc67e12527a92fd2f9967b0db35b92 100644
--- a/src/cats/threading/block_tasks.c
+++ b/src/cats/threading/block_tasks.c
@@ -22,8 +22,8 @@
 #include "cats_global.h"
 
 #include <stdint.h>
-#include <memory/arrays.h>
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
+
 
 #include "threading/threading-helpers.h"
 #include "threading.h"
@@ -100,9 +100,9 @@ void setup_block_tasks(struct cats_thread_controller *t, int32_t rows, int32_t c
                             (t->grid->dimension.cols % t->task_size_cols != 0);
 
 
-        struct cats_dimension dim = {.rows = grid_rows, .cols = grid_cols};
+        struct array_dimension dim = {.rows = grid_rows, .cols = grid_cols};
 
-        t->task_grid = new_2d_array_char(dim);
+        t->task_grid = new_2d_array_char(&dim);
         t->tasks_remaining = t->task_grid->dimension.rows * t->task_grid->dimension.cols;
 
         t->task_getter = block_task_getter;
diff --git a/src/cats/threading/dispersal_tasks.c b/src/cats/threading/dispersal_tasks.c
index 9c2fc45a5f2a33e3d15785f03c01a0bf9d87e5a7..a825f9f0f403c4bf5bcb372f765e980102c3e7d9 100644
--- a/src/cats/threading/dispersal_tasks.c
+++ b/src/cats/threading/dispersal_tasks.c
@@ -19,12 +19,10 @@
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 //
 
-#include <memory/arrays.h>
+#include "bdc_memory/bdc_memory.h"
 #include "threading/threading-helpers.h"
 #include "threading/threading.h"
 #include "misc/cats_maths_inline.h"
-
-#include <memory/cats_memory.h>
 #include "cats_global.h"
 #include <stdint.h>
 #include "dispersal_tasks.h"
@@ -102,20 +100,20 @@ struct thread_task dispersal_task_getter(struct cats_thread_controller *tc, int3
 }
 
 
-struct cats_dimension get_dispersal_area_dimensions(const struct cats_configuration *conf, const struct cats_grid *grid)
+struct array_dimension get_dispersal_area_dimensions(const struct cats_configuration *conf, const struct cats_grid *grid)
 {
         int32_t id = grid->id;
         int32_t max_radius = get_dispersal_radius(conf, id);
         int32_t min_dimension = min_int32t(grid->dimension.cols, grid->dimension.rows);
         max_radius = max_int32t(max_radius, min_dimension / 32);
-        struct cats_dimension result = {.rows = max_radius, .cols = max_radius};
+        struct array_dimension result = {.rows = max_radius, .cols = max_radius};
         return result;
 }
 
 
 void setup_dispersal_tasks(struct cats_thread_controller *t)
 {
-        struct cats_dimension dispersal_area_dimensions = get_dispersal_area_dimensions(t->conf, t->grid);
+        struct array_dimension dispersal_area_dimensions = get_dispersal_area_dimensions(t->conf, t->grid);
 
         t->task_size_rows = dispersal_area_dimensions.rows;
         t->task_size_cols = dispersal_area_dimensions.cols;
@@ -129,8 +127,8 @@ void setup_dispersal_tasks(struct cats_thread_controller *t)
         t->tasks_remaining = grid_rows * grid_cols;
         t->task_getter = dispersal_task_getter;
 
-        struct cats_dimension dim = {.rows = grid_rows, .cols = grid_cols};
-        t->task_grid = new_2d_array_char(dim);
+        struct array_dimension dim = {.rows = grid_rows, .cols = grid_cols};
+        t->task_grid = new_2d_array_char(&dim);
         //t->task_grid = new_2d_array(t->task_grid_rows, t->task_grid_cols, sizeof(char));
         for (int32_t r = 0; r < t->task_grid->dimension.rows; r++) {
                 for (int32_t c = 0; c < t->task_grid->dimension.cols; c++) {
diff --git a/src/cats/threading/threading-helpers.c b/src/cats/threading/threading-helpers.c
index b5e1837b2bf0efb82151069e04cc03370a2c4b2b..0877f6b54d05e7716d0752321462248a68be6850 100644
--- a/src/cats/threading/threading-helpers.c
+++ b/src/cats/threading/threading-helpers.c
@@ -20,15 +20,13 @@
 //
 
 #include <assert.h>
-#include "data/cats_datatypes.h"
 #include "threading-helpers.h"
 #include "logging.h"
 #include "threading.h"
 #include "misc/cats_maths_inline.h"
 #include "misc/cats_random.h"
 #include "stats/grid_stats.h"
-#include "data/error.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 
 void create_custom_stats_for_thread(struct statistics *thread_stats, struct statistics *grid_stats)
 {
diff --git a/src/cats/threading/threading.c b/src/cats/threading/threading.c
index 9b89dbbac96a230a9be2752567c885455b30b575..008df959f6327f38e29f1591e95051d683c23ae3 100644
--- a/src/cats/threading/threading.c
+++ b/src/cats/threading/threading.c
@@ -19,9 +19,9 @@
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 //
 
-#include <stdint.h>
+
 #include "cats_global.h"
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 
 #include "block_tasks.h"
 #include "misc/misc.h"
diff --git a/src/cats_csv/CMakeLists.txt b/src/cats_csv/CMakeLists.txt
index e3674eb38a1cc3d884a5c35552174340926c625b..d3afbbe76e17a53b45f8fd9363045c61138fb5d6 100644
--- a/src/cats_csv/CMakeLists.txt
+++ b/src/cats_csv/CMakeLists.txt
@@ -13,4 +13,4 @@ target_sources(cats_csv
 
 
 set_property(TARGET cats_csv PROPERTY POSITION_INDEPENDENT_CODE ON)
-target_link_libraries(cats_logging cats_memory cats_strings)
\ No newline at end of file
+target_link_libraries(cats_logging bdc cats_strings)
\ No newline at end of file
diff --git a/src/cats_csv/cats_csv.c b/src/cats_csv/cats_csv.c
index 45a9bf1e3f0cf9aa1e987ce8ba2aa002308e2a4b..db8cf5940b54461a97ad6fe45a81bbeec08925db 100644
--- a/src/cats_csv/cats_csv.c
+++ b/src/cats_csv/cats_csv.c
@@ -27,7 +27,7 @@
 
 #include "cats_csv.h"
 #include <logging/logging.h>
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 
 
 struct cats_csv *csv_new(char *header_line, int32_t expected_fields)
diff --git a/src/cats_ini/CMakeLists.txt b/src/cats_ini/CMakeLists.txt
index 8d8eea0b62259c67f1ccc3bf3d8ccf17a023dab7..8b03aec39edbde74a99e212b9b403c7e09033d1e 100644
--- a/src/cats_ini/CMakeLists.txt
+++ b/src/cats_ini/CMakeLists.txt
@@ -18,4 +18,4 @@ target_sources(cats_ini
 
 
 set_property(TARGET cats_ini PROPERTY POSITION_INDEPENDENT_CODE ON)
-target_link_libraries(cats_logging cats_memory cats_strings)
+target_link_libraries(cats_logging cats_strings bdc)
diff --git a/src/cats_strings/cats_strings.c b/src/cats_strings/cats_strings.c
index cc3ebb7422ee4afc2f8811fb141aa192e4c868bf..4843f1b104b68ebf2937b421383ce1208db3d059 100644
--- a/src/cats_strings/cats_strings.c
+++ b/src/cats_strings/cats_strings.c
@@ -25,7 +25,7 @@
 #include <string.h>
 #include "cats_strings.h"
 #include <logging/logging.h>
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 #include <assert.h>
 
 
diff --git a/src/cats_strings/string_helpers.c b/src/cats_strings/string_helpers.c
index 34f52390bf289d2e916a140211f233a1c8ec03a3..eb6553fa7543bd54b55214b74d4e7504debddf74 100644
--- a/src/cats_strings/string_helpers.c
+++ b/src/cats_strings/string_helpers.c
@@ -25,7 +25,7 @@
 #include <string.h>
 #include <ctype.h>
 #include <logging/logging.h>
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 
 
 bool string_is_emptyish(const char *string)
diff --git a/src/cats_windows.h b/src/cats_windows.h
index 9c285244e1303f65f619d4c7baad112db372b826..a9f88680118d62d9371dcc7cc80544eb9d4ab347 100644
--- a/src/cats_windows.h
+++ b/src/cats_windows.h
@@ -38,7 +38,7 @@
 #define F_OK 0
 
 #include <string.h>
-#include <memory/cats_memory.h>
+#include <bdc_memory/bdc_memory.h>
 
 static inline char *strndup(const char *s, size_t n)
 {
diff --git a/src/logging/logging.c b/src/logging/logging.c
index 38172c85813ac723a136631498d46d23e77e55fc..601a5e0e2daa2c0d2d0add8a25d473093baeccd4 100644
--- a/src/logging/logging.c
+++ b/src/logging/logging.c
@@ -26,7 +26,7 @@
 #include <stdarg.h>
 #include <stdlib.h>
 #include "logging.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "cats_time/cats_time.h"
 #include "misc/misc.h"
 
diff --git a/src/memory/CMakeLists.txt b/src/memory/CMakeLists.txt
deleted file mode 100644
index 2d42f3f2a73b0e2b022e6a91b080eafed7b5afd2..0000000000000000000000000000000000000000
--- a/src/memory/CMakeLists.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-add_library(cats_memory STATIC "" ../cats_defs.h ../cats_windows.h)
-
-target_sources(cats_memory
-               PRIVATE
-               cats_memory.c
-               raw_arrays.c
-               arrays.c
-               PUBLIC
-               cats_memory.h
-               raw_arrays.h
-               arrays.h
-               )
-
-#target_include_directories(cats_memory PUBLIC "..")
-set_property(TARGET cats_memory PROPERTY POSITION_INDEPENDENT_CODE ON)
\ No newline at end of file
diff --git a/src/memory/arrays.h b/src/memory/arrays.h
deleted file mode 100644
index 3e6b70c84cbe8817fc80f91292542e0f2121f65c..0000000000000000000000000000000000000000
--- a/src/memory/arrays.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0-or-later
-//
-// arrays.h
-//
-// Copyright (C) 2011-2024, University of Vienna and Vienna Institute for Nature Conservation & Analyses, Andreas Gattringer.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 3 of the License, or (at
-// your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-//
-
-#ifndef CATS_ARRAYS_H
-#define CATS_ARRAYS_H
-
-#include "data/cats_datatypes.h"
-#include "raw_arrays.h"
-
-struct cats_2d_array_float {
-        float **data;
-        struct cats_dimension dimension;
-};
-
-struct cats_2d_array_char {
-        char **data;
-        struct cats_dimension dimension;
-};
-
-struct cats_2d_array_double {
-        double **data;
-        struct cats_dimension dimension;
-};
-
-struct cats_2d_array_char *new_2d_array_char(struct cats_dimension dimension);
-
-struct cats_2d_array_double *new_2d_array_double(struct cats_dimension dimension);
-
-struct cats_2d_array_float *new_2d_array_float(struct cats_dimension dimension);
-
-void cleanup_2d_array_char(struct cats_2d_array_char **grid);
-
-void cleanup_2d_array_float(struct cats_2d_array_float **grid);
-
-void cleanup_2d_array_double(struct cats_2d_array_double **grid);
-
-#define free_cats_grid(PTR_TO_GRID) _Generic((PTR_TO_GRID), \
- struct cats_2d_array_float **:        cleanup_2d_array_float, \
- struct cats_2d_array_double **:       cleanup_2d_array_double, \
- struct cats_2d_array_char **:         cleanup_2d_array_char \
- )(PTR_TO_GRID)
-
-
-void *new_raw_2d_array_from_dimension(struct cats_dimension dimension, size_t member_size);
-
-#endif //CATS_ARRAYS_H
diff --git a/src/memory/cats_memory.h b/src/memory/cats_memory.h
deleted file mode 100644
index dbe7ce980796b049263101e786f0bb741ae61d7f..0000000000000000000000000000000000000000
--- a/src/memory/cats_memory.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0-or-later
-//
-// cats_memory.h
-//
-// Copyright (C) 2011-2024, University of Vienna and Vienna Institute for Nature Conservation & Analyses, Andreas Gattringer.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 3 of the License, or (at
-// your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-//
-
-#ifndef CATS_CATS_MEMORY_H
-#define CATS_CATS_MEMORY_H
-
-#include <stddef.h>
-
-void *malloc_or_die_trace(size_t size, const char *func);
-
-void *realloc_or_die(void *ptr, size_t size);
-
-void *malloc_or_die(size_t size);
-
-void *calloc_or_die(size_t count, size_t size);
-
-#include <stddef.h>
-#include "data/cats_datatypes.h"
-
-#endif //CATS_CATS_MEMORY_H
diff --git a/src/modules/butterflies/butterflies_main.c b/src/modules/butterflies/butterflies_main.c
index 35712a7368323843feb3d19d0ce1f371c87e5991..e8e0b29088f4b9c5d9c516ef879ec9a6eca33e91 100644
--- a/src/modules/butterflies/butterflies_main.c
+++ b/src/modules/butterflies/butterflies_main.c
@@ -63,13 +63,13 @@ void *butterfly_grid_init(__attribute__((unused)) struct cats_configuration *con
 
         struct grid_data_butterflies *data = malloc_or_die(sizeof(struct grid_data_butterflies));
         log_message(LOG_INFO, "allocating data for generations");
-        data->generations = new_raw_2d_array_from_dimension(grid->dimension, sizeof(float));
-        data->info_layer = new_raw_2d_array_from_dimension(grid->dimension, sizeof(int32_t));
+        data->generations = new_raw_2d_array_from_dimension(&grid->dimension, sizeof(float));
+        data->info_layer = new_raw_2d_array_from_dimension(&grid->dimension, sizeof(int32_t));
         log_message(LOG_INFO, "done allocating data for generations");
         data->generation_current = 0;
 
         //struct conf_data_butterflies *conf_data = CATS_MODULE_DATA;
-        data->eggs = new_raw_2d_array_from_dimension(grid->dimension, sizeof(float));
+        data->eggs = new_raw_2d_array_from_dimension(&grid->dimension, sizeof(float));
 
         if (grid->param.parametrization != PARAM_HYBRID) {
                 log_message(LOG_ERROR, "%s only works with hybrid parametrisation mode", module_name);
diff --git a/src/modules/cats_test_module/register_module.c b/src/modules/cats_test_module/register_module.c
index a4f47fa4b46e446f140a202d786b376ff7ccc1ee..828975212a933f953f6f2047334037fa810c70bc 100644
--- a/src/modules/cats_test_module/register_module.c
+++ b/src/modules/cats_test_module/register_module.c
@@ -21,7 +21,7 @@
 
 #include "configuration/configuration.h"
 #include "cats_global.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "modules/load_module.h"
 #include "modules/module_header.h"
 #include "second_file.h"
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index 7e0e75d7ae128f6f61f44b537fe62e65e62fc0d1..237b15de3e760cd8c2182d7e35745afd44b8f878 100644
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -9,5 +9,5 @@ add_executable(vital_rate_test vital_rate_test.c)
 add_executable(csv_test csv_test.c )
 configure_file("test.csv" "test.csv")
 
-target_link_libraries(vital_rate_test cmocka cats_logging cats_memory cats_strings cats_ini cats_csv libcats)
-target_link_libraries(csv_test cmocka cats_strings cats_csv cats_strings cats_logging cats_memory)
+target_link_libraries(vital_rate_test cmocka cats_logging bdc cats_strings cats_ini cats_csv libcats)
+target_link_libraries(csv_test cmocka cats_strings cats_csv cats_strings cats_logging bdc)
diff --git a/src/tests/csv_test.c b/src/tests/csv_test.c
index 74ec635c57a71c0a72ae922cc48fbcfe90698b92..1375ec10c656e6a942ef1817fd61ebe621e0469f 100644
--- a/src/tests/csv_test.c
+++ b/src/tests/csv_test.c
@@ -23,11 +23,10 @@
 #include <setjmp.h>
 #include <cmocka.h>
 #include <stdio.h>
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "cats_strings/cats_strings.h"
 #include "cats_csv/cats_csv.h"
-#include <unistd.h>
-#include <limits.h>
+
 
 struct csv_test {
         FILE *csv_file;
diff --git a/src/tests/vital_rate_test.c b/src/tests/vital_rate_test.c
index 1a0defec956c2817b38fd980156e98e751d25084..1c6f98d205bf5a9ebcaec98dc9fc60f6c2a15619 100644
--- a/src/tests/vital_rate_test.c
+++ b/src/tests/vital_rate_test.c
@@ -24,7 +24,7 @@
 #include "inline_vital_rates.h"
 #include "vital_rates/setup_rates.h"
 #include "debug/debug_vital_rates.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include <stddef.h>
 #include <stdarg.h>
 #include <setjmp.h>