diff --git a/srp_analysis/src/main.rs b/srp_analysis/src/main.rs
index 2ca26d0721503ffccd5d17587bea4aaf662e9aa2..c329e35a0df7540a406425aa4a79bf7c6751d0ab 100644
--- a/srp_analysis/src/main.rs
+++ b/srp_analysis/src/main.rs
@@ -76,28 +76,26 @@ fn main() {
     println!("tr: {:?}", tr);
 
     print_analysis(&tasks, &ip, &tr);
-
-    
-    
 }
-
+// Prints out vector with [task id, response time, wcet time, blocking time, preemption time]
 fn print_analysis(tasks: &Tasks, ip: &IdPrio, tr: &TaskResources) {
     for t in tasks {
         let b = blocking(t, &tasks, &ip, &tr);
-        let p = preemptions(t, &tasks);
-        let r = response_time(t, &tasks, &ip, &tr);
+        // let p = preemptions(t, &tasks);
+        let p = recurrence_preemption(t, &tasks, &ip, &tr, true).unwrap();
+        let r = response_time(t, &tasks, &ip, &tr, true);
         let c = wcet(t);
         let tasks_analysis = vec![t.id.to_string(), r.to_string(), c.to_string(), b.to_string(), p.to_string()];
         println!("{:?}", tasks_analysis)
     }
 }
 
-
-fn response_time(task: &Task, tasks: &Tasks, ip: &IdPrio, tr: &TaskResources) -> u32 {
-    let blocking = blocking(task, &tasks, &ip, &tr);
-    let wcet = wcet(task);
-    let preemption = preemptions(task, &tasks);
-    return blocking + wcet + preemption;
+fn response_time(task: &Task, tasks: &Tasks, ip: &IdPrio, tr: &TaskResources, exact_solution: bool) -> u32 {
+    let b = blocking(task, &tasks, &ip, &tr);
+    let c = wcet(task);
+    // let p = preemptions(task, &tasks);
+    let p = recurrence_preemption(task, &tasks, &ip, &tr, exact_solution).unwrap();
+    return b + c + p;
 }
 
 fn wcet(task: &Task) -> u32 {
@@ -115,29 +113,42 @@ fn load_factor(tasks: &Tasks) -> f32{
     return l_tot;
 }
 
-fn preemptions(task: &Task, tasks: &Tasks) -> u32 {
-    // Find higher or same task prio
-    let mut higher_prio_tasks = HashSet::new();
+fn recurrence_preemption(task: &Task, tasks: &Tasks, ip: &IdPrio, tr: &TaskResources, exact_solution: bool) -> Result<u32, String> {
+    if !exact_solution {
+        return Ok(preemptions(task, &tasks, 0, exact_solution));
+    }
+    let sum = wcet(task) + blocking(task, &tasks, &ip, &tr);
+    let mut current_busy_period: u32 = sum + preemptions(task, &tasks, sum, exact_solution);
+    loop {
+        let busy_period: u32 = current_busy_period + preemptions(task, &tasks, current_busy_period, exact_solution);
+        if current_busy_period == busy_period {
+            return Ok(busy_period);
+        }
+        if current_busy_period > task.deadline {
+            return Err("Deadline miss!".to_string());
+        }
+        current_busy_period = busy_period;
+    }
+}
+
+
+fn preemptions(task: &Task, tasks: &Tasks, busy_period: u32, exact_solution: bool) -> u32 {
+    let mut p_time = 0;
+    let mut busy_period = busy_period;
+    if !exact_solution {
+        busy_period = task.deadline;
+    }
     for t in tasks {
         if t.id == task.id {
             continue;
         }
         if t.prio >= task.prio {
-            higher_prio_tasks.insert(t.id.to_string());
-        }
-    }
-    // Calculate preemptions time (I(t))
-    let mut p_time = 0;
-    for t_id in higher_prio_tasks {
-        for t in tasks {
-            if t_id == t.id {
-                let inter_arrival = t.inter_arrival;
-                let busy_period = t.deadline;
-                p_time = p_time + wcet(t)*(busy_period / inter_arrival);
-            }
+            let inter_arrival = t.inter_arrival;
+            // println!("bp{} ia{}", busy_period, inter_arrival);
+            p_time = p_time + wcet(t)*(((busy_period as f32) / (inter_arrival as f32)).ceil() as u32);
         }
     }
-    // println!("{}", p_time);
+    println!("{}", p_time);
     return p_time;
 }