Index: generic/include/adt/btree.h
===================================================================
--- generic/include/adt/btree.h	(revision 7f7859b9cc377a9854528f655c07d282ce184e60)
+++ generic/include/adt/btree.h	(revision 2810636d5b780b7b0dafa0b20b18f93aedbd5c44)
@@ -77,4 +77,6 @@
 };
 
+extern void btree_init(void);
+
 extern void btree_create(btree_t *t);
 extern void btree_destroy(btree_t *t);
Index: generic/src/adt/btree.c
===================================================================
--- generic/src/adt/btree.c	(revision 7f7859b9cc377a9854528f655c07d282ce184e60)
+++ generic/src/adt/btree.c	(revision 2810636d5b780b7b0dafa0b20b18f93aedbd5c44)
@@ -29,5 +29,5 @@
 /*
  * This B-tree has the following properties:
- * - it is a ballanced 2-3-4-5 tree (i.e. BTREE_M = 5)
+ * - it is a ballanced 3-4-5 tree (i.e. BTREE_M = 5)
  * - values (i.e. pointers to values) are stored only in leaves
  * - leaves are linked in a list
@@ -75,4 +75,12 @@
 #define MEDIAN_HIGH(n)		((n)->key[MEDIAN_HIGH_INDEX((n))]);
 
+static slab_cache_t *btree_node_slab;
+
+/** Initialize B-trees. */
+void btree_init(void)
+{
+	btree_node_slab = slab_cache_create("btree_node_slab", sizeof(btree_node_t), 0, NULL, NULL, SLAB_CACHE_MAGDEFERRED);
+}
+
 /** Create empty B-tree.
  *
@@ -82,5 +90,5 @@
 {
 	list_initialize(&t->leaf_head);
-	t->root = (btree_node_t *) malloc(sizeof(btree_node_t), 0);
+	t->root = (btree_node_t *) slab_alloc(btree_node_slab, 0);
 	node_initialize(t->root);
 	list_append(&t->root->leaf_link, &t->leaf_head);
@@ -91,5 +99,5 @@
 {
 	ASSERT(!t->root->keys);
-	free(t->root);
+	slab_free(btree_node_slab, t->root);
 }
 
@@ -162,5 +170,5 @@
 			 * We split the root node. Create new root.
 			 */
-			t->root = (btree_node_t *) malloc(sizeof(btree_node_t), 0);
+			t->root = (btree_node_t *) slab_alloc(btree_node_slab, 0);
 			node->parent = t->root;
 			rnode->parent = t->root;
@@ -215,5 +223,5 @@
 			t->root = node->subtree[0];
 			t->root->parent = NULL;
-			free(node);
+			slab_free(btree_node_slab, node);
 		} else {
 			/*
@@ -270,5 +278,5 @@
 		idx = find_key_by_subtree(parent, rnode, true);
 		ASSERT((int) idx != -1);
-		free(rnode);
+		slab_free(btree_node_slab, rnode);
 		_btree_remove(t, parent->key[idx], parent);
 	}
@@ -563,5 +571,5 @@
 	 * Allocate and initialize new right sibling.
 	 */
-	rnode = (btree_node_t *) malloc(sizeof(btree_node_t), 0);
+	rnode = (btree_node_t *) slab_alloc(btree_node_slab, 0);
 	node_initialize(rnode);
 	rnode->parent = node->parent;
Index: generic/src/main/main.c
===================================================================
--- generic/src/main/main.c	(revision 7f7859b9cc377a9854528f655c07d282ce184e60)
+++ generic/src/main/main.c	(revision 2810636d5b780b7b0dafa0b20b18f93aedbd5c44)
@@ -58,4 +58,5 @@
 #include <ipc/ipc.h>
 #include <macros.h>
+#include <adt/btree.h>
 
 #ifdef CONFIG_SMP
@@ -169,4 +170,5 @@
 	frame_init();		/* Initialize at least 1 memory segment big enough for slab to work */
 	slab_cache_init();
+	btree_init();
 	as_init();
 	page_init();
