diff --git a/__main__.py b/__main__.py
index 8a2042cae7260896a6e4b3aebce415f93d184081..1f9ccd1b9a58c484d58630eb40787d56b33e663e 100644
--- a/__main__.py
+++ b/__main__.py
@@ -39,12 +39,14 @@ def array_insert_sorted(array, value):
 
 def insert(root, key):
     leaf_node = root
+    parents = []
     while not leaf_node.is_leaf:
+        parents.append(leaf_node)
         index = array_binary_search(leaf_node.keys, key)
         leaf_node = leaf_node.children[index]
 
     if node_is_full(leaf_node):
-        insert_full(root, leaf_node, key, None)
+        insert_full(root, parents, leaf_node, key, None)
     else:
         insert_non_full(leaf_node, key, None)
 
@@ -56,7 +58,7 @@ def insert_non_full(node, key, right_child_node):
         node.children.insert(inserted_at_index + 1, right_child_node)
 
 
-def insert_full(root, node, key, right_child_node):
+def insert_full(root, parents, node, key, right_child_node):
     if node.is_leaf:
         abc, split_right = split_leaf(node, key)
     else:
@@ -65,10 +67,10 @@ def insert_full(root, node, key, right_child_node):
     if node == root:
         increase_height(root, abc, split_right)
     else:
-        parent = find_parent(root, node)
+        parent = parents.pop()
 
         if node_is_full(parent):
-            insert_full(root, parent, abc, split_right)
+            insert_full(root, parents, parent, abc, split_right)
         else:
             insert_non_full(parent, abc, split_right)
 
@@ -110,7 +112,6 @@ def split_internal(node, key, right_child_node):
         split_right.children = node.children[split_index + 1 :]
         node.children = node.children[: split_index + 1]
         split_right.children.insert(0, right_child_node)
-        pass
 
     return abc, split_right
 
@@ -127,6 +128,10 @@ def split_leaf(node, key):
     else:
         abc = key
 
+    if key == node.keys[len(node.keys) // 2]:
+        # I don't like it but without it the duplicates can't work.
+        split_index = len(node.keys) // 2
+
     split_right = Node(node.order)
     split_right.is_leaf = node.is_leaf
     split_right.keys = node.keys[split_index:]
@@ -136,6 +141,7 @@ def split_leaf(node, key):
         array_insert_sorted(node.keys, key)
     else:
         array_insert_sorted(split_right.keys, key)
+
     return abc, split_right
 
 
@@ -149,15 +155,6 @@ def increase_height(root, key, right_child_node):
     root.children = [left_child_node, right_child_node]
 
 
-def find_parent(root, node):
-    while not root.is_leaf:
-        for child in root.children:
-            if node == child:
-                return root
-        root = root.children[array_binary_search(root.keys, node.keys[0])]
-    return None
-
-
 def tree_print(root, depth=0):
     if len(root.keys) == 0:
         return
@@ -171,10 +168,20 @@ def tree_print(root, depth=0):
 def main():
     order = 2
     root = Node(order)
-    keys = [10, 20, 50, 70, 1, 11, 40, 30, 90, 60, 110, 80, 15, 54, 42, 41, 12, 14, 16, 19, 20, 120, 130, 140, 150, 160, 161]
+    # keys = [10, 20, 50, 70, 1, 11, 40, 30, 90, 60, 110, 80, 15, 54, 42, 41, 12, 14, 16, 19, 20, 17, 18]
+    keys = [10, 20, 50, 70, 1, 11, 40, 30, 90, 60, 110]
 
     for key in keys:
         insert(root, key)
+    insert(root, 80)
+    # insert(root, 42)
+    # insert(root, 42)
+    # insert(root, 42)
+    insert(root, 20)
+    insert(root, 20)
+
+    insert(root, 20)
+    # insert(root, 20)
 
     tree_print(root)