diff --git a/benches/treebench.rs b/benches/treebench.rs
index 61cac6d7e39e542953c4dec0b271ce7ec3766913..74d1f3d134af577ce13e90c8af41a5167d860b96 100644
--- a/benches/treebench.rs
+++ b/benches/treebench.rs
@@ -1,13 +1,14 @@
 #[macro_use]
 extern crate criterion;
+extern crate bv;
 extern crate fp_succinct_trees_1;
 extern crate id_tree;
 
 use criterion::Criterion;
 use criterion::Fun;
+use fp_succinct_trees_1::bp_tree::BPTree;
 use fp_succinct_trees_1::common::succinct_tree::SuccinctTree;
-use fp_succinct_trees_1::trees::bp_tree::BPTree;
-use fp_succinct_trees_1::trees::louds_tree::LOUDSTree;
+use fp_succinct_trees_1::louds_tree::LOUDSTree;
 use id_tree::InsertBehavior::*;
 use id_tree::Node;
 use id_tree::NodeId;
@@ -34,6 +35,22 @@ fn create_bench_tree() -> Tree<i32> {
     tree
 }
 
+fn create_bench_louds() -> LOUDSTree<i32> {
+    LOUDSTree::from_file("testdata/loudshuge.benchdata".to_string()).unwrap()
+}
+
+fn create_bench_bp() -> BPTree<i32> {
+    BPTree::from_file("testdata/bphuge.benchdata".to_string()).unwrap()
+}
+
+fn compare_load_huge_tree(c: &mut Criterion) {
+    let louds = Fun::new("LOUDS from file", |b, i| b.iter(|| create_bench_louds()));
+    let bp = Fun::new("BP from file", |b, i| {
+        b.iter(|| create_bench_bp());
+    });
+    c.bench_functions("Load huge trees", vec![louds, bp], 0);
+}
+
 fn create_bench_idtree(c: &mut Criterion) {
     let tree = create_bench_tree();
     c.bench_function("Create bench tree", |b| b.iter(|| create_bench_tree()));
@@ -50,32 +67,32 @@ fn compare_from_id_tree(c: &mut Criterion) {
 }
 
 fn compare_is_leaf(c: &mut Criterion) {
-    let louds = LOUDSTree::from_id_tree(create_bench_tree()).unwrap();
-    let bp = BPTree::from_id_tree(create_bench_tree()).unwrap();
+    let louds = create_bench_louds();
+    let bp = create_bench_bp();
     let louds_fun = Fun::new("LOUDS", move |b, _| b.iter(|| louds.is_leaf(1)));
     let bp_fun = Fun::new("BP", move |b, _| b.iter(|| bp.is_leaf(1)));
     c.bench_functions("Compare is_leaf()", vec![louds_fun, bp_fun], 0);
 }
 
 fn compare_parent(c: &mut Criterion) {
-    let louds = LOUDSTree::from_id_tree(create_bench_tree()).unwrap();
-    let bp = BPTree::from_id_tree(create_bench_tree()).unwrap();
+    let louds = create_bench_louds();
+    let bp = create_bench_bp();
     let louds_fun = Fun::new("LOUDS", move |b, _| b.iter(|| louds.parent(1)));
     let bp_fun = Fun::new("BP", move |b, _| b.iter(|| bp.parent(1)));
     c.bench_functions("Compare parent()", vec![louds_fun, bp_fun], 0);
 }
 
 fn compare_first_child(c: &mut Criterion) {
-    let louds = LOUDSTree::from_id_tree(create_bench_tree()).unwrap();
-    let bp = BPTree::from_id_tree(create_bench_tree()).unwrap();
+    let louds = create_bench_louds();
+    let bp = create_bench_bp();
     let louds_fun = Fun::new("LOUDS", move |b, _| b.iter(|| louds.first_child(1)));
     let bp_fun = Fun::new("BP", move |b, _| b.iter(|| bp.first_child(1)));
     c.bench_functions("Compare first_child()", vec![louds_fun, bp_fun], 0);
 }
 
 fn compare_next_sibling(c: &mut Criterion) {
-    let louds = LOUDSTree::from_id_tree(create_bench_tree()).unwrap();
-    let bp = BPTree::from_id_tree(create_bench_tree()).unwrap();
+    let louds = create_bench_louds();
+    let bp = create_bench_bp();
     let louds_fun = Fun::new("LOUDS", move |b, _| b.iter(|| louds.next_sibling(1)));
     let bp_fun = Fun::new("BP", move |b, _| b.iter(|| bp.next_sibling(1)));
     c.bench_functions("Compare next_sibling()", vec![louds_fun, bp_fun], 0);
@@ -84,6 +101,8 @@ fn compare_next_sibling(c: &mut Criterion) {
 criterion_group!(
     benches,
     create_bench_idtree,
+    compare_load_huge_tree,
+    compare_parent,
     compare_from_id_tree,
     compare_is_leaf,
     compare_first_child,