diff --git a/BertognaResponseTimeDefs.v b/BertognaResponseTimeDefs.v
index db32efeb88c34a700115274837f7754ea3e138b5..f22b47d026abd7cf46ef8572c1e3d2aacfa85bf3 100644
--- a/BertognaResponseTimeDefs.v
+++ b/BertognaResponseTimeDefs.v
@@ -437,16 +437,18 @@ Module ResponseTimeAnalysis.
           rewrite [\sum_(_ <- _ | ~~_)_](eq_big (fun i => x i < R - task_cost tsk + 1) (fun i => x i));
             [| by red; ins; rewrite ltnNge
              | by intros i COND; rewrite -ltnNge in COND; rewrite COND].
-          destruct (~~ has (fun i => R - task_cost tsk + 1 <= x i) ts) eqn:HAS.
+
+          (* Case 1 |A| = 0 *)
+          destruct (~~ has (fun i => R - task_cost tsk + 1 <= x i) ts) eqn:HASa.
           {
-            rewrite [\sum_(_ <- _ | _ <= _) _]big_hasC; last by apply HAS.
-            rewrite big_seq_cond; move: HAS => /hasPn HAS.
+            rewrite [\sum_(_ <- _ | _ <= _) _]big_hasC; last by apply HASa.
+            rewrite big_seq_cond; move: HASa => /hasPn HASa.
             rewrite add0n (eq_bigl (fun i => (i \in ts) && true));
               last by red; intros tsk_k; destruct (tsk_k \in ts) eqn:INk;
-                [by rewrite andTb ltnNge; apply HAS | by rewrite andFb].
+                [by rewrite andTb ltnNge; apply HASa | by rewrite andFb].
             by rewrite -big_seq_cond. 
-          } apply negbFE in HAS.
-
+          } apply negbFE in HASa.
+          
           set card := count (fun i => R - task_cost tsk + 1 <= x i) ts.
           destruct (card >= num_cpus) eqn:CARD.
           {
@@ -460,7 +462,119 @@ Module ResponseTimeAnalysis.
           assert (GEsum: \sum_(i <- ts | x i < R - task_cost tsk + 1) x i >=
                            (R - task_cost tsk + 1) * (num_cpus - card)).
           {
-            admit.
+            set some_interference_A := fun t =>
+              backlogged job_cost rate sched j t &&
+              has (fun tsk_k => (is_interfering_task tsk_k && ((x tsk_k) >= R - task_cost tsk + 1) && tsk_is_scheduled job_task sched tsk_k t)) ts.      
+            set total_interference_B := fun t =>
+              backlogged job_cost rate sched j t *
+              count (fun tsk_k =>
+                is_interfering_task tsk_k &&
+                ((x tsk_k) < R - task_cost tsk + 1) &&
+                tsk_is_scheduled job_task sched tsk_k t) ts.
+
+            apply leq_trans with ((\sum_(job_arrival j <= t < job_arrival j + R) some_interference_A t) * (num_cpus - card)).
+            {
+              rewrite leq_mul2r; apply/orP; right.
+              move: HASa => /hasP HASa; destruct HASa as [tsk_a INa LEa].
+              apply leq_trans with (n := x tsk_a); first by apply LEa.
+              unfold x, task_interference, some_interference_A.
+              destruct (is_interfering_task tsk_a) eqn:INTERFa; last by ins.
+              apply leq_sum; ins.
+              destruct (backlogged job_cost rate sched j i);
+                [rewrite 2!andTb | by ins].
+              destruct (tsk_is_scheduled job_task sched tsk_a i) eqn:SCHEDa;
+                [apply eq_leq; symmetry | by ins].
+              apply/eqP; rewrite eqb1.
+              apply/hasP; exists tsk_a; first by ins.
+              apply/andP; split; last by ins.
+              by apply/andP; split; ins.
+            }
+            apply leq_trans with (\sum_(job_arrival j <= t < job_arrival j + R) total_interference_B t).
+            {
+              rewrite big_distrl /=.
+              apply leq_sum; intros t _.
+              unfold some_interference_A, total_interference_B. 
+              destruct (backlogged job_cost rate sched j t) eqn:BACK;
+                [rewrite andTb mul1n | by ins].
+              destruct (has (fun tsk_k : sporadic_task =>
+                       is_interfering_task tsk_k &&
+                       (R - task_cost tsk + 1 <= x tsk_k) &&
+                       tsk_is_scheduled job_task sched tsk_k t) ts) eqn:HAS;
+                last by ins.
+              rewrite mul1n; move: HAS => /hasP HAS.
+              destruct HAS as [tsk_k INk H].
+              move: H => /andP [/andP [INTERFk LEk] SCHEDk].
+              
+              exploit INVARIANT;
+                [by apply JOBtsk | by apply BACK | intro COUNT].
+
+              unfold card.
+              set interfering_tasks_at_t :=
+                [seq tsk_k <- ts | is_interfering_task tsk_k && tsk_is_scheduled job_task sched tsk_k t].
+
+              rewrite -(count_filter (fun i => true)) in COUNT.
+              fold interfering_tasks_at_t in COUNT.
+              rewrite count_predT in COUNT.
+              apply leq_trans with (n := num_cpus - count (fun i => is_interfering_task i && (x i >= R -  task_cost tsk + 1) && tsk_is_scheduled job_task sched i t) ts).
+              {
+                apply leq_sub2l.
+                rewrite -2!sum1_count big_mkcond /=.
+                rewrite [\sum_(_ <- _ | _ <= _)_]big_mkcond /=.
+                apply leq_sum; intros i _.
+                unfold x; destruct (is_interfering_task i);
+                  [rewrite andTb | by rewrite 2!andFb].
+                destruct (tsk_is_scheduled job_task sched i t);
+                  [by rewrite andbT | by rewrite andbF].
+              }
+
+              rewrite leq_subLR.
+              rewrite -count_predUI.
+              apply leq_trans with (n :=
+                count (predU (fun i : sporadic_task =>
+                                is_interfering_task i &&
+                                (R - task_cost tsk + 1 <= x i) &&
+                                tsk_is_scheduled job_task sched i t)
+                             (fun tsk_k0 : sporadic_task =>
+                                is_interfering_task tsk_k0 &&
+                                (x tsk_k0 < R - task_cost tsk + 1) &&
+                                tsk_is_scheduled job_task sched tsk_k0 t))
+                      ts); last by apply leq_addr.
+              apply leq_trans with (n := size interfering_tasks_at_t);
+                first by rewrite COUNT.
+              unfold interfering_tasks_at_t.
+              rewrite -count_predT count_filter.
+              rewrite leq_eqVlt; apply/orP; left; apply/eqP.
+              apply eq_count; red; simpl.
+              intros i.
+              destruct (is_interfering_task i),
+                       (tsk_is_scheduled job_task sched i t);
+                rewrite 3?andTb ?andFb ?andbF ?andbT /=; try ins.
+              by rewrite leqNgt orNb. 
+            }
+            {
+              unfold x at 2, task_interference.
+              rewrite [\sum_(i <- ts | _) _](eq_bigr
+                (fun i => \sum_(job_arrival j <= t < job_arrival j + R)
+                             is_interfering_task i &&
+                             backlogged job_cost rate sched j t &&
+                             tsk_is_scheduled job_task sched i t));
+                last first.
+              {
+                ins; destruct (is_interfering_task i);
+                  first by apply eq_bigr; ins.
+                by rewrite (eq_bigr (fun i => 0));
+                  [by rewrite big_const_nat iter_addn mul0n addn0 | by ins].
+              }
+              {
+                rewrite exchange_big /=; apply leq_sum; intros t _.
+                unfold total_interference_B.
+                destruct (backlogged job_cost rate sched j t); last by ins.
+                rewrite mul1n -sum1_count.
+                rewrite big_mkcond [\sum_(i <- ts | _ < _) _]big_mkcond.
+                by apply leq_sum; ins; destruct (x i<R - task_cost tsk + 1);
+                  [by ins | by rewrite andbF andFb].
+              }
+            }
           }
           
           rewrite big_const_seq iter_addn addn0; fold card.
@@ -528,7 +642,7 @@ Module ResponseTimeAnalysis.
       (* Bertogna and Cirinei's response-time bound recurrence *)
       Definition response_time_recurrence_jlfp R :=
         R <= task_cost tsk + div_floor
-                             (total_interference_jlfp ts tsk R_other R)
+                             (total_interference_bound_jlfp ts tsk R_other R)
                              num_cpus.
 
       Variable R: time.