diff --git a/coq/Bank.v b/coq/Bank.v
index d72d30c3156710ed9bc25934843b2158aa13e1f4..dac17c535dac8970546c6a51666f57a9fc17b798 100644
--- a/coq/Bank.v
+++ b/coq/Bank.v
@@ -7,9 +7,11 @@ Class Bank_configuration :=
   BANKS  : nat;
 
   T_RC   : nat;    (* ACT to ACT delay intra-bank *)
+  T_RP   : nat;    (* PRE to ACT delay intra-bank *)
 
   BANKS_pos : BANKS != 0;
-  T_RC_pos  : T_RC != 0
+  T_RC_pos  : T_RC != 0;
+  T_RP_pos  : T_RP != 0
 }.
 
 Section Banks.
diff --git a/coq/Commands.v b/coq/Commands.v
index f017937338518ad41aa260ad77cb801206fe36f9..96bd4e1bc82b068ae4ad527f5810c0a326e4fd7a 100644
--- a/coq/Commands.v
+++ b/coq/Commands.v
@@ -74,6 +74,9 @@ Section Commands.
   Definition isACT (cmd : Command_t) :=
     cmd.(CKind) == ACT.
 
+  Definition isPRE (cmd : Command_t) :=
+    cmd.(CKind) == PRE.
+
   Definition PRE_of_req req t :=
     mkCmd t PRE req.
 
diff --git a/coq/FIFO.v b/coq/FIFO.v
index 314ea82999590ed7c57b91601b15cacf7ce3b7dc..451e4633e29dd00e9a3b63cc1accb9cd04c915fe 100644
--- a/coq/FIFO.v
+++ b/coq/FIFO.v
@@ -5,6 +5,10 @@ Section FIFO.
   Context {BANK_CFG : Bank_configuration}.
   Context {Input    : Requests_t}.
 
+  Definition FIFO_PRE_date := 1.
+  Definition FIFO_ACT_date := FIFO_PRE_date + T_RP + 1.
+  Definition FIFO_CMD_date := FIFO_ACT_date + 1.
+
   Class FIFO_configuration :=
   {
     FIFO_wait : nat;
@@ -13,6 +17,10 @@ Section FIFO.
     FIFO_cmds : 3 < FIFO_wait;
     (* have to respect T_RC *)
     FIFO_T_RC : T_RC < FIFO_wait;
+
+    FIFO_T_PRE : FIFO_PRE_date <= FIFO_wait;
+    FIFO_T_ACT : FIFO_ACT_date <= FIFO_wait;
+    FIFO_T_CMD : FIFO_CMD_date <= FIFO_wait;
   }.
 
   Context {FIFO_CFG : FIFO_configuration }.
@@ -25,9 +33,9 @@ Section FIFO.
 
   Local Definition FIFO_req req State : FIFO_state_t :=
     let time := maxn State.(Time) req.(Date) in
-    let PRE_date := time + 1 in
-    let ACT_date := time + 2 in
-    let CMD_date := time + 3 in
+    let PRE_date := time + FIFO_PRE_date in
+    let ACT_date := time + FIFO_ACT_date in
+    let CMD_date := time + FIFO_CMD_date in
       let PRE := PRE_of_req req PRE_date in
       let ACT := ACT_of_req req ACT_date in
       let CMD := Cmd_of_req req CMD_date in
@@ -51,6 +59,17 @@ Section FIFO.
     by apply ltn_trans with (m := n) in H.
   Qed.
 
+  Lemma FIFO_T_RP : T_RP < FIFO_wait.
+  Proof.
+    specialize FIFO_T_ACT as H.
+    unfold FIFO_ACT_date in H.
+    rewrite addn1 in H.
+    apply ltn_trans with (n := FIFO_PRE_date + T_RP).
+    - rewrite addnC. apply nat_ltnn_add.
+      by unfold FIFO_PRE_date.
+    - done.
+  Qed.
+
   Lemma FIFO_trace_time_monotone req Reqs:
     (FIFO_trace Reqs).(Time) < (FIFO_trace (req::Reqs)).(Time).
   Proof.
@@ -77,8 +96,11 @@ Section FIFO.
     induction Reqs; auto.
     simpl in *.
     rewrite -> 3 in_cons in H.
-    decompose_FIFO_cmds H H; subst;
-      try (rewrite leq_add2l; by apply lt_FIFO_wait).
+    specialize FIFO_T_PRE as Hpre.
+    specialize FIFO_T_ACT as Hact.
+    specialize FIFO_T_CMD as Hcmd.
+    decompose_FIFO_cmds H H; subst; simpl; 
+      try by rewrite leq_add2l.
     apply IHReqs in H.
     by apply nat_le_lemaxn_add with (x := FIFO_wait) (o := a.(Date)) in H.
   Qed.
@@ -134,24 +156,24 @@ Section FIFO.
         - set T := maxn (FIFO_trace Reqs').(Time) r.(Date).
           unfold maxn. simpl.
           destruct (T + FIFO_wait < req.(Date)) eqn:Hlt.
-          1  : rewrite <- (ltn_add2r 2) in Hlt.
-          1  : apply ltn_trans with (n := T + FIFO_wait + 2); auto.
-          1,2: rewrite addnCAC [T + FIFO_wait + 2]addnCAC.
-          1,2: rewrite [2 + _]addnC.
+          1  : rewrite <- (ltn_add2r FIFO_ACT_date) in Hlt.
+          1  : apply ltn_trans with (n := T + FIFO_wait + FIFO_ACT_date); auto.
+          1,2: rewrite addnCAC [T + FIFO_wait + FIFO_ACT_date]addnCAC.
+          1,2: rewrite [FIFO_ACT_date + _]addnC.
           1,2: rewrite ltn_add2r ltn_add2r.
           1,2: by specialize FIFO_T_RC.
          - set T := maxn (FIFO_trace (r :: Reqs')).(Time) req.(Date).
           set Tf := (FIFO_trace Reqs').(Time) + FIFO_wait.
           specialize (FIFO_trace_dist r Reqs') as Hdist.
           apply leq_trans with (p := T) in Hdist.
-          - rewrite <- (leq_add2r 2) in Hdist.
-            rewrite addnS in Hdist.
+          - rewrite <- (leq_add2r FIFO_ACT_date) in Hdist. 
+            rewrite addnS in Hdist. 
             apply FIFO_trace_time_ok in Ia as H.
             rewrite <- (leq_add2r T_RC) in H.
             apply leq_ltn_trans with (p := Tf) in H.
-            - apply ltn_trans with (p := Tf + 1) in H.
-              - by apply ltn_trans with (p := T + 2) in H.
-              - rewrite <- addn1. by rewrite leqnn.
+            - apply ltn_trans with (p := Tf + (T_RP + 1)) in H.
+              - by apply ltn_trans with (p := T + FIFO_ACT_date) in H.
+              - apply nat_ltnn_add. rewrite addn_gt0. apply /orP. by right.
             - rewrite ltn_add2l. by specialize FIFO_T_RC.
           - unfold T. by apply leq_maxl.
     - contradict aBb. subst a.
@@ -161,9 +183,70 @@ Section FIFO.
     - by apply (IHReqs' a b) in Ia.
   Qed.
 
+  Lemma nat_add_lt_add m1 m2 n1 n2: is_true ((m1 < m2) && (n1 < n2)) -> is_true (m1 + n1 < m2 + n2).
+  Proof.
+    intros.
+    rewrite <- addn1. rewrite addnACl addnC.
+    apply leq_add.
+    - rewrite addnC addn1. by move : H => /andP /proj1 H. 
+    - apply ltnW. by move : H => /andP /proj2 H. 
+  Qed.
+
+  Lemma FIFO_trace_T_RP_ok Reqs: 
+    forall a b, a \in (FIFO_trace Reqs).(Cmds) -> b \in (FIFO_trace Reqs).(Cmds) ->
+                    PRE_to_ACT a b -> Same_Bank a b -> Before a b ->
+                    Apart a b T_RP.
+  Proof.
+    induction Reqs as [| req Reqs']; auto.
+    intros a b Ia Ib PtA SB aBb.
+    decompose_FIFO_cmds Ib Cmdb; decompose_FIFO_cmds Ia Cmda;
+      try (contradict_PtoA PtA req).
+    - unfold Apart. subst. simpl.
+      unfold FIFO_ACT_date.
+      rewrite addnCAC addnC ltn_add2l addnC. by apply nat_ltnn_add.
+    - destruct Reqs'.
+      - by contradict Ia.
+      - decompose_FIFO_cmds Ia Cmda;
+          try contradict_PtoA PtA req; try contradict_PtoA PtA r;
+          subst; unfold Apart, ACT_of_req, PRE_of_req; simpl.
+        - set T := maxn (FIFO_trace Reqs').(Time) r.(Date).
+          unfold maxn. simpl.
+          destruct (T + FIFO_wait < req.(Date)) eqn:Hlt.
+          1  : rewrite <- (ltn_add2r FIFO_ACT_date) in Hlt.
+          1  : apply ltn_trans with (n := T + FIFO_wait + FIFO_ACT_date); auto.
+          1,2: rewrite addnCAC [T + FIFO_wait + FIFO_ACT_date]addnCAC.
+          1,2: rewrite [FIFO_ACT_date + _]addnC.
+          1,2: rewrite ltn_add2r.
+          1,2: apply nat_add_lt_add.
+          1,2: apply /andP; split.
+          1,3: by specialize FIFO_T_RP.
+          1,2: unfold FIFO_ACT_date.
+          1,2: rewrite addnCAC addnC; apply nat_ltnn_add.
+          1,2: rewrite addn_gt0; apply /orP; by left.
+         - set T := maxn (FIFO_trace (r :: Reqs')).(Time) req.(Date).
+          set Tf := (FIFO_trace Reqs').(Time) + FIFO_wait.
+          specialize (FIFO_trace_dist r Reqs') as Hdist.
+          apply leq_trans with (p := T) in Hdist.
+          - rewrite <- (leq_add2r FIFO_ACT_date) in Hdist. 
+            rewrite addnS in Hdist. 
+            apply FIFO_trace_time_ok in Ia as H.
+            rewrite <- (leq_add2r T_RP) in H.
+            apply leq_ltn_trans with (p := Tf) in H.
+            - apply ltn_trans with (p := Tf + (T_RP + 1)) in H.
+              - by apply ltn_trans with (p := T + FIFO_ACT_date) in H.
+              - apply nat_ltnn_add. rewrite addn_gt0. apply /orP. by right.
+            - rewrite ltn_add2l. by specialize FIFO_T_RP.
+          - unfold T. by apply leq_maxl.
+    - contradict aBb. subst a.
+      apply /negP.
+      unfold Before, ACT_of_req. rewrite <- leqNgt. apply nat_le_lemaxn_add.
+      by apply (FIFO_trace_time_ok Reqs') in Ib.
+    - by apply (IHReqs' a b) in Ia.
+  Qed.
+
   Program Definition FIFO_arbitrate :=
     let State := FIFO_trace Requests in
-      mkTrace State.(Cmds) State.(Time) _ (FIFO_trace_time_ok Requests) (FIFO_trace_T_RC_ok Requests).
+      mkTrace State.(Cmds) State.(Time) _ (FIFO_trace_time_ok Requests) (FIFO_trace_T_RC_ok Requests) (FIFO_trace_T_RP_ok Requests).
   Next Obligation.
     induction Requests; auto.
     by apply (FIFO_trace_uniq a) in IHl.
@@ -172,7 +255,7 @@ Section FIFO.
   Lemma FIFO_arbiter_handled req:
     req \in Requests -> exists cmd : Command_t, cmd \in FIFO_arbitrate.(Commands) ->
                     Match req cmd.
-  Proof.
+  Proof. 
     intros.
     exists (Cmd_of_req req 5).
     unfold FIFO_arbitrate in *. simpl in *.
@@ -198,12 +281,13 @@ Section Test.
   Program Instance BANK_CFG : Bank_configuration :=
   {
     BANKS := 1;
-    T_RC  := 3
+    T_RC  := 3;
+    T_RP  := 7
   }.
 
   Program Instance FIFO_CFG : FIFO_configuration :=
   { 
-    FIFO_wait := 4
+    FIFO_wait := 10
   }.
 
   Program Definition Req1 := mkReq 3 RD 0.
diff --git a/coq/Trace.v b/coq/Trace.v
index ede74fca31c585b224769fd9fab909d3747c9658..2c339933e5417103882193cb9252402729232553 100644
--- a/coq/Trace.v
+++ b/coq/Trace.v
@@ -11,6 +11,9 @@ Section Trace.
   Definition ACT_to_ACT (a b : Command_t) :=
     isACT a && isACT b.
 
+  Definition PRE_to_ACT (a b : Command_t) :=
+    isPRE a && isACT b.
+
   Definition Before (a b : Command_t) :=
     a.(CDate) < b.(CDate).
 
@@ -32,11 +35,20 @@ Section Trace.
     Cmds_T_RC_ok : forall a b, a \in Commands -> b \in Commands ->
                     ACT_to_ACT a b -> Same_Bank a b -> Before a b ->
                     Apart a b T_RC;
+
+    (* Ensure that the time between a PRE and an ACT commands respects T_RC *)
+    Cmds_T_RP_ok : forall a b, a \in Commands -> b \in Commands ->
+                    PRE_to_ACT a b -> Same_Bank a b -> Before a b ->
+                    Apart a b T_RP;
   }.
 
   Program Definition Trace_empty := mkTrace [::] 0 _ _ _.
 End Trace.
 
 Ltac contradict_AtoA H req :=
-  (contradict H; subst;unfold ACT_to_ACT, isACT, PRE_of_req, Cmd_of_req, Kind_of_req; simpl; destruct (Kind req));
+  (contradict H; subst; unfold ACT_to_ACT, isACT, PRE_of_req, Cmd_of_req, Kind_of_req; simpl; destruct (Kind req));
   (done + apply /negP; rewrite negb_and; apply /orP; by right).
+
+Ltac contradict_PtoA H req :=
+  (contradict H; subst; unfold PRE_to_ACT, isACT, isPRE, PRE_of_req, Cmd_of_req, Kind_of_req; simpl; destruct (Kind req);
+   (done + apply /negP; rewrite negb_and; apply /orP; by right)).