diff --git a/_main.c b/_main.c
deleted file mode 100644
index 9f584fe03ae65a54f038697f87e7abcb108fd8c2..0000000000000000000000000000000000000000
--- a/_main.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <assert.h>
-// Warning : stdbool
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "bptree.h"
-#include "sorted_array.h"
-
-int main() {
-    BPTreeNode *root = bptree_init(2);
-    int keys_length = 40;
-    uint64_t keys[] = {8, 12, 11, 47, 22, 95, 86, 40, 33, 78, 28, 5, 75, 88, 21, 56, 82, 51, 93, 66, 48, 70, 57, 65, 35, 4, 60, 41, 49, 55, 68, 72, 23, 31, 30, 42, 18, 87, 24, 58};
-    array_print(keys_length, keys);
-
-    for (int i = 0; i < keys_length; i++) {
-        bptree_insert(root, keys[i], keys[i] * 1000);
-    }
-
-    bptree_print(root, 0);
-
-    for (int i = 0; i < keys_length; i++) {
-        uint64_t data;
-        bool found = bptree_search(root, keys[i], &data);
-
-        assert(found == true);
-        assert(data == keys[i] * 1000);
-    }
-
-    bptree_destroy(&root);
-    return EXIT_SUCCESS;
-}
diff --git a/src/Array.c b/src/Array.c
index 3c57e189891baa75e7a42403d8ebbde8b7f2bf26..2aae12b5623b209e071e45929e0c4e8dc6561b27 100644
--- a/src/Array.c
+++ b/src/Array.c
@@ -5,7 +5,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-int _lower_bound(IntegerArray *array, uint64_t item) {
+int lower_bound(IntegerArray *array, uint64_t item) {
     int low = 0;
     int high = array->size - 1;
 
@@ -38,10 +38,10 @@ void IntegerArray_destroy(IntegerArray **array) {
 }
 
 int IntegerArray_insert_sorted(IntegerArray *array, uint64_t item) {
-    int index = _lower_bound(array, item);
+    int index = lower_bound(array, item);
 
     for (int i = array->size - 1; i >= index; i--) {
-        array[i + 1] = array[i];
+        array->items[i + 1] = array->items[i];
     }
 
     array->items[index] = item;
@@ -51,7 +51,7 @@ int IntegerArray_insert_sorted(IntegerArray *array, uint64_t item) {
 
 void IntegerArray_insert_at_index(IntegerArray *array, int index, uint64_t item) {
     for (int i = array->size - 1; i >= index; i--) {
-        array[i + 1] = array[i];
+        array->items[i + 1] = array->items[i];
     }
 
     array->items[index] = item;
@@ -63,7 +63,7 @@ void IntegerArray_append(IntegerArray *array, uint64_t item) {
     array->size++;
 }
 
-static int _IntegerArray_find_index(IntegerArray *array, uint64_t item) {
+static int IntegerArray_find_index(IntegerArray *array, uint64_t item) {
     int low = 0;
     int high = array->size - 1;
 
@@ -83,7 +83,7 @@ static int _IntegerArray_find_index(IntegerArray *array, uint64_t item) {
 }
 
 bool IntegerArray_binary_search(IntegerArray *array, uint64_t item, int *index) {
-    *index = _IntegerArray_find_index(array, item);
+    *index = IntegerArray_find_index(array, item);
     return *index != -1;
 }
 
@@ -116,7 +116,7 @@ void BPTreeNodeArray_destroy(BPTreeNodeArray **array) {
 
 void BPTreeNodeArray_insert_at_index(BPTreeNodeArray *array, int index, BPTreeNode *item) {
     for (int i = array->size - 1; i >= index; i--) {
-        array[i + 1] = array[i];
+        array->items[i + 1] = array->items[i];
     }
 
     array->items[index] = item;
@@ -130,7 +130,7 @@ void BPTreeNodeArray_append(BPTreeNodeArray *array, BPTreeNode *item) {
 
 void BPTreeNodeArray_delete_at_index(BPTreeNodeArray *array, int index) {
     for (int i = index; i < array->size; i++) {
-        array[i] = array[i + 1];
+        array->items[i] = array->items[i + 1];
     }
 
     array->size--;
diff --git a/src/Array.h b/src/Array.h
index 38f8f81d19d642ded98d1811f7792db33f1b26a2..0ba36fedd47d64c7c37b709cea3084805c6da4ad 100644
--- a/src/Array.h
+++ b/src/Array.h
@@ -9,7 +9,7 @@ typedef struct IntegerArray {
     int size;
 } IntegerArray;
 
-int _lower_bound(IntegerArray *array, uint64_t item);
+int lower_bound(IntegerArray *array, uint64_t item);
 
 IntegerArray *IntegerArray_init(int capacity);
 void IntegerArray_destroy(IntegerArray **array);
diff --git a/src/Array.o b/src/Array.o
index 98ac59ff25f79787cbd31def792ed68db7f7bdb3..c31e4c7ab6aed7d5c02fffac7260f7ed7ca753d5 100644
Binary files a/src/Array.o and b/src/Array.o differ
diff --git a/src/Directory.o b/src/Directory.o
index 44cdaf0a743353597ff980dca51462dc4e9396e4..77b260a2d3c9b67d23dd49ac88c471b95c0068f6 100644
Binary files a/src/Directory.o and b/src/Directory.o differ
diff --git a/src/DirectoryRecord.o b/src/DirectoryRecord.o
index 86700a2bced8ec1297755924790fa9a47b1b5744..72bea73d54574ea676e178d73fb85693a8304b1d 100644
Binary files a/src/DirectoryRecord.o and b/src/DirectoryRecord.o differ
diff --git a/src/bptree.c b/src/bptree.c
index c9bf2b6cd98eb3788c5a78492578827dbcf01938..5a216d5d6b474ec63f6cea8b191fd4bd9fba2f30 100644
--- a/src/bptree.c
+++ b/src/bptree.c
@@ -5,7 +5,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#include "sorted_array.h"
+#include "Array.h"
 
 // static bool has_minimum_keys(BPTreeNode *node);
 static bool has_maximum_keys(BPTreeNode *node);
@@ -15,30 +15,27 @@ static bool has_maximum_keys(BPTreeNode *node);
 // }
 
 static bool has_maximum_keys(BPTreeNode *node) {
-    return node->keys_length == 2 * node->order;
+    return node->keys->size == 2 * node->order;
 }
 
 BPTreeNode *bptree_init(int order) {
     BPTreeNode *root = (BPTreeNode *)malloc(sizeof(BPTreeNode));
     root->order = order;
     root->is_leaf = true;
-    root->keys_length = 0;
-    root->keys = (uint64_t *)malloc(sizeof(uint64_t) * (2 * order));
-    root->data_length = 0;
-    root->data = (uint64_t *)malloc(sizeof(uint64_t) * (2 * order));
-    root->children_length = 0;
-    root->children = (BPTreeNode **)malloc(sizeof(BPTreeNode *) * (2 * order + 1));
+    root->keys = IntegerArray_init(2 * root->order);
+    root->data = IntegerArray_init(2 * root->order);
+    root->children = BPTreeNodeArray_init(2 * root->order + 1);
     return root;
 }
 
 void bptree_destroy(BPTreeNode **root) {
-    for (int i = 0; i < (*root)->children_length; i++) {
-        bptree_destroy(&(*root)->children[i]);
+    for (int i = 0; i < (*root)->children->size; i++) {
+        bptree_destroy(&(*root)->children->items[i]);
     }
 
-    free((*root)->keys);
-    free((*root)->data);
-    free((*root)->children);
+    IntegerArray_destroy(&(*root)->keys);
+    IntegerArray_destroy(&(*root)->data);
+    BPTreeNodeArray_destroy(&(*root)->children);
     free(*root);
     *root = NULL;
 }
@@ -48,108 +45,117 @@ void bptree_print(BPTreeNode *root, int depth) {
         printf("  ");
     }
 
-    array_print(root->keys_length, root->keys);
+    IntegerArray_print(root->keys);
 
-    for (int i = 0; i < root->children_length; i++) {
-        bptree_print(root->children[i], depth + 1);
+    for (int i = 0; i < root->children->size; i++) {
+        bptree_print(root->children->items[i], depth + 1);
     }
 }
 
 bool bptree_search(BPTreeNode *root, uint64_t key, uint64_t *data) {
     if (root->is_leaf) {
         int index;
-        bool found = sorted_array_search(root->keys_length, root->keys, key, &index);
+        bool found = IntegerArray_binary_search(root->keys, key, &index);
 
         if (found) {
-            *data = root->data[index];
+            *data = root->data->items[index];
         }
 
         return found;
     }
 
-    int child_index = lower_bound(root->keys_length, root->keys, key);
+    int child_index = lower_bound(root->keys, key);
 
-    if (child_index < root->keys_length && root->keys[child_index] == key) {
+    if (child_index < root->keys->size && root->keys->items[child_index] == key) {
         child_index += 1;
     }
 
-    return bptree_search(root->children[child_index], key, data);
+    return bptree_search(root->children->items[child_index], key, data);
 }
 
 // Insertion
 
+static void redistribute_keys(BPTreeNode *left_node, BPTreeNode *right_node, int left_index, int right_index);
+static void redistribute_children(BPTreeNode *left_node, BPTreeNode *right_node, int left_index, int right_index);
+static uint64_t split_internal(BPTreeNode *node, uint64_t key, BPTreeNode *right_child_node, BPTreeNode **right_node);
+static uint64_t split_leaf(BPTreeNode *node, uint64_t key, uint64_t data, BPTreeNode **right_node);
+static void grow(BPTreeNode *root, uint64_t median_value, BPTreeNode *split_right_node);
+static BPTreeNode *find_leaf(BPTreeNode *root, uint64_t key, BPTreeNodeArray **parents);
+static void insert_full(BPTreeNode *root, BPTreeNodeArray *parents, BPTreeNode *node, uint64_t key, uint64_t data, BPTreeNode *previous_split_right_node);
+static void insert_non_full(BPTreeNode *node, uint64_t key, uint64_t data, BPTreeNode *previous_split_right_node);
+
 static void redistribute_keys(BPTreeNode *left_node, BPTreeNode *right_node, int left_index, int right_index) {
-    for (int i = right_index; i < left_node->keys_length; i++) {
-        array_append(&right_node->keys_length, right_node->keys, left_node->keys[i]);
-        array_append(&right_node->data_length, right_node->data, left_node->data[i]);
+    for (int i = right_index; i < left_node->keys->size; i++) {
+        IntegerArray_append(right_node->keys, left_node->keys->items[i]);
+        IntegerArray_append(right_node->data, left_node->data->items[i]);
     }
 
-    left_node->keys_length = left_index;
-    left_node->data_length = left_index;
+    left_node->keys->size = left_index;
+    left_node->data->size = left_index;
 }
 
-static uint64_t split_leaf(BPTreeNode *node, uint64_t key, uint64_t data, BPTreeNode **right_node) {
-    int virtual_insertion_index = lower_bound(node->keys_length, node->keys, key);
-    int median_index = node->keys_length / 2;
+static void redistribute_children(BPTreeNode *left_node, BPTreeNode *right_node, int left_index, int right_index) {
+    for (int i = right_index; i < left_node->children->size; i++) {
+        BPTreeNodeArray_append(right_node->children, left_node->children->items[i]);
+    }
+
+    left_node->children->size = left_index;
+}
+
+static uint64_t split_internal(BPTreeNode *node, uint64_t key, BPTreeNode *right_child_node, BPTreeNode **right_node) {
+    int virtual_insertion_index = lower_bound(node->keys, key);
+    int median_index = node->keys->size / 2;
     uint64_t median_value;
     *right_node = bptree_init(node->order);
+    (*right_node)->is_leaf = false;
 
     if (virtual_insertion_index < median_index) {
-        median_value = node->keys[median_index - 1];
-        redistribute_keys(node, *right_node, median_index - 1, median_index - 1);
-        int insertion_index = sorted_array_insert(&node->keys_length, node->keys, key);
-        array_insert_at_index(&node->data_length, node->data, insertion_index, data);
+        median_value = node->keys->items[median_index - 1];
+        redistribute_keys(node, *right_node, median_index - 1, median_index);
+        redistribute_children(node, *right_node, median_index, median_index);
+        int insertion_index = IntegerArray_insert_sorted(node->keys, key);
+        BPTreeNodeArray_insert_at_index(node->children, insertion_index + 1, right_child_node);
     } else if (virtual_insertion_index > median_index) {
-        median_value = node->keys[median_index];
-        redistribute_keys(node, *right_node, median_index, median_index);
-        int insertion_index = sorted_array_insert(&(*right_node)->keys_length, (*right_node)->keys, key);
-        array_insert_at_index(&(*right_node)->data_length, (*right_node)->data, insertion_index, data);
+        median_value = node->keys->items[median_index];
+        redistribute_keys(node, *right_node, median_index, median_index + 1);
+        redistribute_children(node, *right_node, median_index + 1, median_index + 1);
+        int insertion_index = IntegerArray_insert_sorted((*right_node)->keys, key);
+        BPTreeNodeArray_insert_at_index((*right_node)->children, insertion_index + 1, right_child_node);
     } else {
         median_value = key;
         redistribute_keys(node, *right_node, median_index, median_index);
-        int insertion_index = sorted_array_insert(&(*right_node)->keys_length, (*right_node)->keys, key);
-        array_insert_at_index(&(*right_node)->data_length, (*right_node)->data, insertion_index, data);
+        redistribute_children(node, *right_node, median_index + 1, median_index + 1);
+        BPTreeNodeArray_insert_at_index((*right_node)->children, 0, right_child_node);
     }
 
-    // TODO : Linked List
-
     return median_value;
 }
 
-static void redistribute_children(BPTreeNode *left_node, BPTreeNode *right_node, int left_index, int right_index) {
-    for (int i = right_index; i < left_node->children_length; i++) {
-        array_append_BPTreeNode(&right_node->children_length, right_node->children, left_node->children[i]);
-    }
-
-    left_node->children_length = left_index;
-}
-
-static uint64_t split_internal(BPTreeNode *node, uint64_t key, BPTreeNode *right_child_node, BPTreeNode **right_node) {
-    int virtual_insertion_index = lower_bound(node->keys_length, node->keys, key);
-    int median_index = node->keys_length / 2;
+static uint64_t split_leaf(BPTreeNode *node, uint64_t key, uint64_t data, BPTreeNode **right_node) {
+    int virtual_insertion_index = lower_bound(node->keys, key);
+    int median_index = node->keys->size / 2;
     uint64_t median_value;
     *right_node = bptree_init(node->order);
-    (*right_node)->is_leaf = false;
 
     if (virtual_insertion_index < median_index) {
-        median_value = node->keys[median_index - 1];
-        redistribute_keys(node, *right_node, median_index - 1, median_index);
-        redistribute_children(node, *right_node, median_index, median_index);
-        int insertion_index = sorted_array_insert(&node->keys_length, node->keys, key);
-        array_insert_at_index_BPTreeNode(&node->children_length, node->children, insertion_index + 1, right_child_node);
+        median_value = node->keys->items[median_index - 1];
+        redistribute_keys(node, *right_node, median_index - 1, median_index - 1);
+        int insertion_index = IntegerArray_insert_sorted(node->keys, key);
+        IntegerArray_insert_at_index(node->data, insertion_index, data);
     } else if (virtual_insertion_index > median_index) {
-        median_value = node->keys[median_index];
-        redistribute_keys(node, *right_node, median_index, median_index + 1);
-        redistribute_children(node, *right_node, median_index + 1, median_index + 1);
-        int insertion_index = sorted_array_insert(&(*right_node)->keys_length, (*right_node)->keys, key);
-        array_insert_at_index_BPTreeNode(&(*right_node)->children_length, (*right_node)->children, insertion_index + 1, right_child_node);
+        median_value = node->keys->items[median_index];
+        redistribute_keys(node, *right_node, median_index, median_index);
+        int insertion_index = IntegerArray_insert_sorted((*right_node)->keys, key);
+        IntegerArray_insert_at_index((*right_node)->data, insertion_index, data);
     } else {
         median_value = key;
         redistribute_keys(node, *right_node, median_index, median_index);
-        redistribute_children(node, *right_node, median_index + 1, median_index + 1);
-        array_insert_at_index_BPTreeNode(&(*right_node)->children_length, (*right_node)->children, 0, right_child_node);
+        int insertion_index = IntegerArray_insert_sorted((*right_node)->keys, key);
+        IntegerArray_insert_at_index((*right_node)->data, insertion_index, data);
     }
 
+    // TODO : Linked List
+
     return median_value;
 }
 
@@ -157,30 +163,48 @@ static void grow(BPTreeNode *root, uint64_t median_value, BPTreeNode *split_righ
     BPTreeNode *left_node = bptree_init(root->order);
     left_node->is_leaf = split_right_node->is_leaf;
 
-    for (int i = 0; i < root->keys_length; i++) {
-        array_append(&left_node->keys_length, left_node->keys, root->keys[i]);
+    for (int i = 0; i < root->keys->size; i++) {
+        IntegerArray_append(left_node->keys, root->keys->items[i]);
 
-        if (root->is_leaf) {
-            array_append(&left_node->data_length, left_node->data, root->data[i]);
+        // if (root->is_leaf) {
+        if (left_node->is_leaf) {
+            IntegerArray_append(left_node->data, root->data->items[i]);
         }
     }
 
-    for (int i = 0; i < root->children_length; i++) {
-        array_append_BPTreeNode(&left_node->children_length, left_node->children, root->children[i]);
+    for (int i = 0; i < root->children->size; i++) {
+        BPTreeNodeArray_append(left_node->children, root->children->items[i]);
     }
 
     root->is_leaf = false;
-    root->keys_length = 0;
-    root->children_length = 0;
+    root->keys->size = 0;
+    root->children->size = 0;
 
-    array_append(&root->keys_length, root->keys, median_value);
-    array_append_BPTreeNode(&root->children_length, root->children, left_node);
-    array_append_BPTreeNode(&root->children_length, root->children, split_right_node);
+    IntegerArray_append(root->keys, median_value);
+    BPTreeNodeArray_append(root->children, left_node);
+    BPTreeNodeArray_append(root->children, split_right_node);
 }
 
-static void insert_non_full(BPTreeNode *node, uint64_t key, uint64_t data, BPTreeNode *previous_split_right_node);
+static BPTreeNode *find_leaf(BPTreeNode *root, uint64_t key, BPTreeNodeArray **parents) {
+    BPTreeNode *current = root;
+    // TODO : 10 is not enough.
+    *parents = BPTreeNodeArray_init(10);
 
-static void insert_full(BPTreeNode *root, int *parents_length, BPTreeNode **parents, BPTreeNode *node, uint64_t key, uint64_t data, BPTreeNode *previous_split_right_node) {
+    while (!current->is_leaf) {
+        BPTreeNodeArray_append(*parents, current);
+        int child_index = lower_bound(current->keys, key);
+
+        if (child_index < current->keys->size && current->keys->items[child_index] == key) {
+            child_index += 1;
+        }
+
+        current = current->children->items[child_index];
+    }
+
+    return current;
+}
+
+static void insert_full(BPTreeNode *root, BPTreeNodeArray *parents, BPTreeNode *node, uint64_t key, uint64_t data, BPTreeNode *previous_split_right_node) {
     uint64_t median_value;
     BPTreeNode *split_right_node;
 
@@ -193,11 +217,12 @@ static void insert_full(BPTreeNode *root, int *parents_length, BPTreeNode **pare
     if (node == root) {
         grow(root, median_value, split_right_node);
     } else {
-        BPTreeNode *parent = parents[*parents_length - 1];
-        array_delete_at_index_BPTreeNode(parents_length, parents, *parents_length - 1);
+        BPTreeNode *parent = parents->items[parents->size - 1];
+        BPTreeNodeArray_delete_at_index(parents, parents->size - 1);
 
         if (has_maximum_keys(parent)) {
-            insert_full(root, parents_length, parents, parent, median_value, 0, split_right_node);
+            // 0 is passed instead of data because the recursion is necessarily done on an internal node.
+            insert_full(root, parents, parent, median_value, 0, split_right_node);
         } else {
             insert_non_full(parent, median_value, data, split_right_node);
         }
@@ -205,51 +230,30 @@ static void insert_full(BPTreeNode *root, int *parents_length, BPTreeNode **pare
 }
 
 static void insert_non_full(BPTreeNode *node, uint64_t key, uint64_t data, BPTreeNode *previous_split_right_node) {
-    int insertion_index = sorted_array_insert(&node->keys_length, node->keys, key);
+    int insertion_index = IntegerArray_insert_sorted(node->keys, key);
 
     if (node->is_leaf) {
-        array_insert_at_index(&node->data_length, node->data, insertion_index, data);
+        IntegerArray_insert_at_index(node->data, insertion_index, data);
     }
 
     if (previous_split_right_node != NULL) {
-        array_insert_at_index_BPTreeNode(&node->children_length, node->children, insertion_index + 1, previous_split_right_node);
+        BPTreeNodeArray_insert_at_index(node->children, insertion_index + 1, previous_split_right_node);
     }
 }
 
-static BPTreeNode *find_leaf(BPTreeNode *root, uint64_t key, int *parents_length, BPTreeNode ***parents) {
-    BPTreeNode *current = root;
-    *parents_length = 0;
-    // TODO : 10 is not enough.
-    *parents = (BPTreeNode **)malloc(sizeof(BPTreeNode *) * 10);
-
-    while (!current->is_leaf) {
-        array_append_BPTreeNode(parents_length, *parents, current);
-        int child_index = lower_bound(current->keys_length, current->keys, key);
-
-        if (child_index < current->keys_length && current->keys[child_index] == key) {
-            child_index += 1;
-        }
-
-        current = current->children[child_index];
-    }
-
-    return current;
-}
-
 void bptree_insert(BPTreeNode *root, uint64_t key, uint64_t data) {
-    int parents_length;
-    BPTreeNode **parents;
-    BPTreeNode *leaf = find_leaf(root, key, &parents_length, &parents);
+    BPTreeNodeArray *parents;
+    BPTreeNode *leaf = find_leaf(root, key, &parents);
 
     // TODO : vérifier si la clé existe dans leaf.
 
     if (has_maximum_keys(leaf)) {
-        insert_full(root, &parents_length, parents, leaf, key, data, NULL);
+        insert_full(root, parents, leaf, key, data, NULL);
     } else {
         insert_non_full(leaf, key, data, NULL);
     }
 
-    free(parents);
+    BPTreeNodeArray_destroy(&parents);
 }
 
 // Deletion
diff --git a/src/bptree.h b/src/bptree.h
index 05fdd197a9d4008a55ad25cfaf7c08205cc0b856..dcf15be76b524de37acb5956f952dd092d3f7d9f 100644
--- a/src/bptree.h
+++ b/src/bptree.h
@@ -4,15 +4,14 @@
 #include <stdbool.h>
 #include <stdint.h>
 
+#include "Array.h"
+
 typedef struct BPTreeNode {
     int order;
     bool is_leaf;
-    int keys_length;
-    uint64_t *keys;
-    int data_length;
-    uint64_t *data;
-    int children_length;
-    struct BPTreeNode **children;
+    IntegerArray *keys;
+    IntegerArray *data;
+    BPTreeNodeArray *children;
 } BPTreeNode;
 
 BPTreeNode *bptree_init(int order);
diff --git a/src/bptree.o b/src/bptree.o
index 294a237e01ba5f0ef580c048fb095a908abe53f8..71e13d20252ef1ac8af21af0cd1eb6319323c44e 100644
Binary files a/src/bptree.o and b/src/bptree.o differ
diff --git a/src/main.c b/src/main.c
index ee5ea626811d449c48d13b4c052c6cec4601e108..70b5b9aff0b5af4f20193d014db73e020807bb84 100644
--- a/src/main.c
+++ b/src/main.c
@@ -4,20 +4,34 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#include "Directory.h"
-#include "DirectoryRecord.h"
 #include "bptree.h"
-#include "sorted_array.h"
 
 int main() {
-    BPTreeNode *index = bptree_init(2);
+    BPTreeNode *root = bptree_init(2);
 
-    Directory *directory = Directory_init();
-    Directory_insert(directory, DirectoryRecord_init("0794592180", "Florian", "Burgener", 2000, 10, 03));
-    Directory_insert(directory, DirectoryRecord_init("0799494969", "Daisy", "Luna", 1995, 05, 31));
-    Directory_print(directory);
+    uint64_t input[] = {8, 12, 11, 47, 22, 95, 86, 40, 33, 78, 28, 5, 75, 88, 21, 56, 82, 51, 93, 66, 48, 70, 57, 65, 35, 4, 60, 41, 49, 55, 68, 72, 23, 31, 30, 42, 18, 87, 24, 58};
+    IntegerArray *keys = IntegerArray_init(40);
+    for (int i = 0; i < 40; i++) {
+        IntegerArray_append(keys, input[i]);
+    }
 
-    Directory_destroy(&directory);
-    bptree_destroy(&index);
+    IntegerArray_print(keys);
+
+    for (int i = 0; i < keys->size; i++) {
+        bptree_insert(root, keys->items[i], keys->items[i] * 1000);
+    }
+
+    bptree_print(root, 0);
+
+    for (int i = 0; i < keys->size; i++) {
+        uint64_t data;
+        bool found = bptree_search(root, keys->items[i], &data);
+
+        assert(found == true);
+        assert(data == keys->items[i] * 1000);
+    }
+
+    IntegerArray_destroy(&keys);
+    bptree_destroy(&root);
     return EXIT_SUCCESS;
 }
diff --git a/src/main.o b/src/main.o
index ca2341be399e9bed35f53bf070ec7056618708e1..b1839b18fd5461fd48e0738adc6f4a6e0635f226 100644
Binary files a/src/main.o and b/src/main.o differ
diff --git a/src/sorted_array.c b/src/sorted_array.c
deleted file mode 100644
index 3e75b04714892a35be6ac86f093eb56637e8c46a..0000000000000000000000000000000000000000
--- a/src/sorted_array.c
+++ /dev/null
@@ -1,126 +0,0 @@
-#include "sorted_array.h"
-
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-int lower_bound(int array_length, uint64_t *array, uint64_t value) {
-    int low = 0;
-    int high = array_length - 1;
-
-    while (low <= high) {
-        int m = (low + high) / 2;
-
-        if (array[m] < value) {
-            low = m + 1;
-        } else if (array[m] > value) {
-            high = m - 1;
-        } else {
-            return m;
-        }
-    }
-
-    return low;
-}
-
-int sorted_array_find_index(int array_length, uint64_t *array, uint64_t value) {
-    int low = 0;
-    int high = array_length - 1;
-
-    while (low <= high) {
-        int m = (low + high) / 2;
-
-        if (array[m] < value) {
-            low = m + 1;
-        } else if (array[m] > value) {
-            high = m - 1;
-        } else {
-            return m;
-        }
-    }
-
-    return -1;
-}
-
-bool sorted_array_search(int array_length, uint64_t *array, uint64_t value, int *index) {
-    int i = sorted_array_find_index(array_length, array, value);
-
-    if (index != NULL) {
-        *index = i;
-    }
-
-    return i != -1;
-}
-
-int sorted_array_insert(int *array_length, uint64_t *array, uint64_t value) {
-    int insertion_index = lower_bound(*array_length, array, value);
-
-    for (int i = *array_length - 1; i >= insertion_index; i--) {
-        array[i + 1] = array[i];
-    }
-
-    array[insertion_index] = value;
-    *array_length += 1;
-    return insertion_index;
-}
-
-void sorted_array_delete(int *array_length, uint64_t *array, uint64_t value) {
-    int index = sorted_array_find_index(*array_length, array, value);
-
-    for (int i = index; i < *array_length; i++) {
-        array[i] = array[i + 1];
-    }
-
-    *array_length -= 1;
-}
-
-void array_insert_at_index(int *array_length, uint64_t *array, int insertion_index, uint64_t value) {
-    for (int i = *array_length - 1; i >= insertion_index; i--) {
-        array[i + 1] = array[i];
-    }
-
-    array[insertion_index] = value;
-    *array_length += 1;
-}
-
-void array_append(int *array_length, uint64_t *array, uint64_t value) {
-    array[*array_length] = value;
-    *array_length += 1;
-}
-
-void array_print(int array_length, uint64_t *array) {
-    printf("[");
-
-    for (int i = 0; i < array_length; i++) {
-        printf("%ld", array[i]);
-
-        if (i < array_length - 1) {
-            printf(", ");
-        }
-    }
-
-    printf("]\n");
-}
-
-void array_insert_at_index_BPTreeNode(int *array_length, BPTreeNode **array, int insertion_index, BPTreeNode *value) {
-    for (int i = *array_length - 1; i >= insertion_index; i--) {
-        array[i + 1] = array[i];
-    }
-
-    array[insertion_index] = value;
-    *array_length += 1;
-}
-
-void array_append_BPTreeNode(int *array_length, BPTreeNode **array, BPTreeNode *value) {
-    array[*array_length] = value;
-    *array_length += 1;
-}
-
-void array_delete_at_index_BPTreeNode(int *array_length, BPTreeNode **array, int deletion_index) {
-    for (int i = deletion_index; i < *array_length; i++) {
-        array[i] = array[i + 1];
-    }
-
-    *array_length -= 1;
-}
diff --git a/src/sorted_array.h b/src/sorted_array.h
deleted file mode 100644
index 02f12fdcd90d6cc122299379ab6d227a1b2db2ed..0000000000000000000000000000000000000000
--- a/src/sorted_array.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef SORTED_ARRAY_H
-#define SORTED_ARRAY_H
-
-#include <stdbool.h>
-#include <stdint.h>
-
-int lower_bound(int array_length, uint64_t *array, uint64_t value);
-
-int sorted_array_find_index(int array_length, uint64_t *array, uint64_t value);
-bool sorted_array_search(int array_length, uint64_t *array, uint64_t value, int *index);
-int sorted_array_insert(int *array_length, uint64_t *array, uint64_t value);
-void sorted_array_delete(int *array_length, uint64_t *array, uint64_t value);
-
-void array_print(int array_length, uint64_t *array);
-void array_insert_at_index(int *array_length, uint64_t *array, int insertion_index, uint64_t value);
-void array_append(int *array_length, uint64_t *array, uint64_t value);
-
-typedef struct BPTreeNode BPTreeNode;
-
-void array_insert_at_index_BPTreeNode(int *array_length, BPTreeNode **array, int insertion_index, BPTreeNode *value);
-void array_append_BPTreeNode(int *array_length, BPTreeNode **array, BPTreeNode *value);
-void array_delete_at_index_BPTreeNode(int *array_length, BPTreeNode **array, int deletion_index);
-
-#endif