diff --git a/include/mg_procedure.h b/include/mg_procedure.h
index 2c1ef6746..fa2eecb4c 100644
--- a/include/mg_procedure.h
+++ b/include/mg_procedure.h
@@ -23,12 +23,15 @@ extern "C" {
 /// before.
 ///@{
 
+/// Provides memory managament access and state.
+struct mgp_memory;
+
 /// Allocate a block of memory with given size in bytes.
 /// Unlike malloc, this function is not thread-safe.
 /// `size_in_bytes` must be greater than 0.
 /// The returned pointer must be freed with mgp_free.
 /// NULL is returned if unable to serve the requested allocation.
-void *mgp_alloc(size_t size_in_bytes);
+void *mgp_alloc(struct mgp_memory *memory, size_t size_in_bytes);
 
 /// Allocate an aligned block of memory with given size in bytes.
 /// Unlike malloc and aligned_alloc, this function is not thread-safe.
@@ -36,14 +39,15 @@ void *mgp_alloc(size_t size_in_bytes);
 /// `alignment` must be a power of 2 value.
 /// The returned pointer must be freed with mgp_free.
 /// NULL is returned if unable to serve the requested allocation.
-void *mgp_aligned_alloc(size_t size_in_bytes, size_t alignment);
+void *mgp_aligned_alloc(struct mgp_memory *memory, size_t size_in_bytes,
+                        size_t alignment);
 
 /// Deallocate an allocation from mgp_alloc or mgp_aligned_alloc.
 /// Unlike free, this function is not thread-safe.
 /// If `ptr` is NULL, this function does nothing.
 /// The behavior is undefined if `ptr` is not a value returned from a prior
-/// mgp_alloc or mgp_aligned_alloc call.
-void mgp_free(void *ptr);
+/// mgp_alloc or mgp_aligned_alloc call with the corresponding `memory`.
+void mgp_free(struct mgp_memory *memory, void *ptr);
 ///@}
 
 /// @name Operations on mgp_value
@@ -94,28 +98,29 @@ void mgp_value_destroy(struct mgp_value *val);
 /// Construct a value representing `null` in openCypher.
 /// You need to free the instance through mgp_value_destroy.
 /// NULL is returned if unable to allocate a mgp_value.
-struct mgp_value *mgp_value_make_null();
+struct mgp_value *mgp_value_make_null(struct mgp_memory *memory);
 
 /// Construct a boolean value.
 /// Non-zero values represent `true`, while zero represents `false`.
 /// You need to free the instance through mgp_value_destroy.
 /// NULL is returned if unable to allocate a mgp_value.
-struct mgp_value *mgp_value_make_bool(int val);
+struct mgp_value *mgp_value_make_bool(int val, struct mgp_memory *memory);
 
 /// Construct an integer value.
 /// You need to free the instance through mgp_value_destroy.
 /// NULL is returned if unable to allocate a mgp_value.
-struct mgp_value *mgp_value_make_int(int64_t val);
+struct mgp_value *mgp_value_make_int(int64_t val, struct mgp_memory *memory);
 
 /// Construct a double floating point value.
 /// You need to free the instance through mgp_value_destroy.
 /// NULL is returned if unable to allocate a mgp_value.
-struct mgp_value *mgp_value_make_double(double val);
+struct mgp_value *mgp_value_make_double(double val, struct mgp_memory *memory);
 
 /// Construct a character string value from a NULL terminated string.
 /// You need to free the instance through mgp_value_destroy.
 /// NULL is returned if unable to allocate a mgp_value.
-struct mgp_value *mgp_value_make_string(const char *val);
+struct mgp_value *mgp_value_make_string(const char *val,
+                                        struct mgp_memory *memory);
 
 /// Create a mgp_value storing a mgp_list.
 /// You need to free the instance through mgp_value_destroy. The ownership of
@@ -233,7 +238,8 @@ const struct mgp_path *mgp_value_get_path(const struct mgp_value *val);
 /// of mgp_value, but it will not contain any elements. Therefore,
 /// mgp_list_size will return 0.
 /// NULL is returned if unable to allocate a new list.
-struct mgp_list *mgp_list_make_empty(size_t capacity);
+struct mgp_list *mgp_list_make_empty(size_t capacity,
+                                     struct mgp_memory *memory);
 
 /// Free the memory used by the given mgp_list and contained elements.
 void mgp_list_destroy(struct mgp_list *list);
@@ -270,7 +276,7 @@ const struct mgp_value *mgp_list_at(const struct mgp_list *list, size_t index);
 /// Create an empty map of character strings to mgp_value instances.
 /// You need to free the created instance with mgp_map_destroy.
 /// NULL is returned if unable to allocate a new map.
-struct mgp_map *mgp_map_make_empty();
+struct mgp_map *mgp_map_make_empty(struct mgp_memory *memory);
 
 /// Free the memory used by the given mgp_map and contained items.
 void mgp_map_destroy(struct mgp_map *map);
@@ -308,7 +314,8 @@ struct mgp_map_items_iterator;
 /// The returned mgp_map_items_iterator needs to be deallocated with
 /// mgp_map_items_iterator_destroy.
 /// NULL is returned if unable to allocate a new iterator.
-struct mgp_map_items_iterator *mgp_map_iter_items(const struct mgp_map *map);
+struct mgp_map_items_iterator *mgp_map_iter_items(const struct mgp_map *map,
+                                                  struct mgp_memory *memory);
 
 /// Deallocate memory used by mgp_map_items_iterator.
 void mgp_map_items_iterator_destroy(struct mgp_map_items_iterator *it);
@@ -334,7 +341,8 @@ const struct mgp_map_item *mgp_map_items_iterator_next(
 /// Create a path with the copy of the given starting vertex.
 /// You need to free the created instance with mgp_path_destroy.
 /// NULL is returned if unable to allocate a path.
-struct mgp_path *mgp_path_make_with_start(const struct mgp_vertex *vertex);
+struct mgp_path *mgp_path_make_with_start(const struct mgp_vertex *vertex,
+                                          struct mgp_memory *memory);
 
 /// Free the memory used by the given mgp_path and contained vertices and edges.
 void mgp_path_destroy(struct mgp_path *path);
@@ -445,7 +453,8 @@ void mgp_edges_iterator_destroy(struct mgp_edges_iterator *it);
 /// Copy a mgp_vertex.
 /// Returned pointer must be freed with mgp_vertex_destroy.
 /// NULL is returned if unable to allocate a mgp_vertex.
-struct mgp_vertex *mgp_vertex_copy(const struct mgp_vertex *v);
+struct mgp_vertex *mgp_vertex_copy(const struct mgp_vertex *v,
+                                   struct mgp_memory *memory);
 
 /// Free the memory used by a mgp_vertex.
 void mgp_vertex_destroy(struct mgp_vertex *v);
@@ -471,27 +480,29 @@ int mgp_vertex_has_label_named(const struct mgp_vertex *v,
 /// Returned value must be freed with mgp_value_destroy.
 /// NULL is returned if unable to allocate a mgp_value.
 struct mgp_value *mgp_vertex_get_property(const struct mgp_vertex *v,
-                                          const char *property_name);
+                                          const char *property_name,
+                                          struct mgp_memory *memory);
 
 /// Start iterating over properties stored in the given vertex.
 /// The returned mgp_properties_iterator needs to be deallocated with
 /// mgp_properties_iterator_destroy.
 /// NULL is returned if unable to allocate a new iterator.
 struct mgp_properties_iterator *mgp_vertex_iter_properties(
-    const struct mgp_vertex *v);
+    const struct mgp_vertex *v, struct mgp_memory *memory);
 
 /// Start iterating over inbound edges of the given vertex.
 /// The returned mgp_edges_iterator needs to be deallocated with
 /// mgp_edges_iterator_destroy.
 /// NULL is returned if unable to allocate a new iterator.
-struct mgp_edges_iterator *mgp_vertex_iter_in_edges(const struct mgp_vertex *v);
+struct mgp_edges_iterator *mgp_vertex_iter_in_edges(const struct mgp_vertex *v,
+                                                    struct mgp_memory *memory);
 
 /// Start iterating over outbound edges of the given vertex.
 /// The returned mgp_edges_iterator needs to be deallocated with
 /// mgp_edges_iterator_destroy.
 /// NULL is returned if unable to allocate a new iterator.
-struct mgp_edges_iterator *mgp_vertex_iter_out_edges(
-    const struct mgp_vertex *v);
+struct mgp_edges_iterator *mgp_vertex_iter_out_edges(const struct mgp_vertex *v,
+                                                     struct mgp_memory *memory);
 
 /// Get the current edge pointed to by the iterator.
 /// When the mgp_edges_iterator_next is invoked, the previous
@@ -509,7 +520,8 @@ const struct mgp_edge *mgp_edges_iterator_next(struct mgp_edges_iterator *it);
 /// Copy a mgp_edge.
 /// Returned pointer must be freed with mgp_edge_destroy.
 /// NULL is returned if unable to allocate a mgp_edge.
-struct mgp_edge *mgp_edge_copy(const struct mgp_edge *e);
+struct mgp_edge *mgp_edge_copy(const struct mgp_edge *e,
+                               struct mgp_memory *memory);
 
 /// Free the memory used by a mgp_edge.
 void mgp_edge_destroy(struct mgp_edge *e);
@@ -527,14 +539,15 @@ const struct mgp_vertex *mgp_edge_get_to(const struct mgp_edge *e);
 /// Returned value must be freed with mgp_value_destroy.
 /// NULL is returned if unable to allocate a mgp_value.
 struct mgp_value *mgp_edge_get_property(const struct mgp_edge *e,
-                                        const char *property_name);
+                                        const char *property_name,
+                                        struct mgp_memory *memory);
 
 /// Start iterating over properties stored in the given edge.
 /// The returned mgp_properties_iterator needs to be deallocated with
 /// mgp_properties_iterator_destroy.
 /// NULL is returned if unable to allocate a new iterator.
 struct mgp_properties_iterator *mgp_edge_iter_properties(
-    const struct mgp_edge *e);
+    const struct mgp_edge *e, struct mgp_memory *memory);
 
 /// State of the graph database.
 struct mgp_graph;
@@ -550,7 +563,7 @@ void mgp_vertices_iterator_destroy(struct mgp_vertices_iterator *it);
 /// mgp_vertices_iterator_destroy.
 /// NULL is returned if unable to allocate a new iterator.
 struct mgp_vertices_iterator *mgp_graph_iter_vertices(
-    const struct mgp_graph *g);
+    const struct mgp_graph *g, struct mgp_memory *memory);
 
 /// Get the current vertex pointed to by the iterator.
 /// When the mgp_vertices_iterator_next is invoked, the previous