diff --git a/srp_analysis/src/main.rs b/srp_analysis/src/main.rs
index bc088d42b3254265474f3c5b6b5d0b5e9f903003..41e00db02c2698ec840651edca812d63266badd9 100644
--- a/srp_analysis/src/main.rs
+++ b/srp_analysis/src/main.rs
@@ -104,7 +104,7 @@ fn total_load_factor(tasks: &Tasks) -> f32 {
  * worst case. And the task t will not be able to finish in time in the worst case.
  */
 fn cpu_load(task: &Task) -> f32 {
-    return (wcet(task) as f32) / (task.inter_arrival as f32)
+    return (wcet(&task.trace) as f32) / (task.inter_arrival as f32)
 }
 
 
@@ -112,8 +112,8 @@ fn cpu_load(task: &Task) -> f32 {
  * Worst case execution time(WCET) of a task t(C(t)).
  * C(t)
  */
-fn wcet(task: &Task) -> u32 {
-    return task.trace.end.wrapping_sub(task.trace.start); 
+fn wcet(trace: &Trace) -> u32 {
+    return trace.end.wrapping_sub(trace.start); 
 }
 
 
@@ -140,6 +140,24 @@ fn response_time(task: &Task) -> u32 {
  * Note: B(t) = max(C(l_r)), where P(l) < P(t), π(l_r) >= P(t)
  */
 fn block_time(task: &Task, tasks: &Tasks, ip: &IdPrio, tr: &TaskResources) -> u32 {
+    /*
+     * Helper function for finding the trace of a resource using only the id an a trace.
+     */
+    fn find_res_tr<'a>(res_id: &String, trace: &'a Trace) -> Option<&'a Trace> {
+        if trace.id == *res_id {
+            return Some(trace);
+        } else {
+            for tr in &trace.inner {
+                match find_res_tr(res_id, tr) {
+                    Some(val) => return Some(val),
+                    None => (),
+                }
+            }
+        }
+        return None;
+    }
+
+
     // Find all lower priority tasks
     let mut lower_prio: Vec<&Task> = vec!();
     for t in tasks {
@@ -148,35 +166,43 @@ fn block_time(task: &Task, tasks: &Tasks, ip: &IdPrio, tr: &TaskResources) -> u3
         }
     }
 
-    println!("prio {:?}", task.prio);
-    println!("lower_prio {:?}", lower_prio);
+    //println!("prio {:?}", task.prio);
+    //println!("lower_prio {:?}", lower_prio);
 
     // Find all resources that will block the task(resources with a higher of equal priority) from
     // the resources that the lower priority tasks use.
-    let mut block_res: Vec<String> = vec!();
+    let mut block_res: Vec<&Trace> = vec!();
     for lpt in lower_prio {
-       match tr.get(&lpt.id) {
+        match tr.get(&lpt.id) {
             Some(resources) =>{
                 for r in resources {
                     if *ip.get(r).unwrap() >= task.prio {
-                        block_res.push(r.clone());
+                        block_res.push(find_res_tr(r, &lpt.trace).unwrap());
                     }
                 }
             },
             None => (),
-       };
+        }; 
     }
     
-    println!("block_res {:?}", block_res);
-
-    let mut wcets: Vec<u32> = vec!();
-
+    //println!("block_res {:?}", block_res);
+
+    // Calculate the max wcet of the list of blocking resource traces.
+    let mut block_time: u32 = 0;
+    for tr in block_res {
+        let wcet = wcet(tr);
+        if wcet > block_time {
+            block_time = wcet;
+        }
+    }
+    
+    println!("block time {:?}", block_time);
 
-// TODO: Implement
-    return 0;
+    return block_time;
 }
 
 
+
 /*
  * Calculates the interference (preemptions) to task t(I(t)).
  * I(t)