diff --git a/src/backends/C/c_backend_spec.ml b/src/backends/C/c_backend_spec.ml
index 0dd2bfab9ba112eddb4295db90cf71fe7d0eeaf9..bcead9c22d25b7e3222a820e48c21915eb3a19e2 100644
--- a/src/backends/C/c_backend_spec.ml
+++ b/src/backends/C/c_backend_spec.ml
@@ -87,7 +87,6 @@ let pp_nothing fmt () = pp_print_string fmt "\\nothing"
 let pp_null fmt () = pp_print_string fmt "\\null"
 let pp_stdout fmt () = pp_print_string fmt "stdout"
 let pp_at pp_v fmt (v, l) = fprintf fmt "\\at(%a, %s)" pp_v v l
-let pp_at_pre pp_v fmt v = pp_at pp_v fmt (v, "Pre")
 let find_machine f = List.find (fun m -> m.mname.node_id = f)
 
 let instances machines m =
@@ -198,7 +197,6 @@ let pp_paren pp fmt v = fprintf fmt "(%a)" pp v
 let pp_initialization pp_mem fmt (name, mem) =
   fprintf fmt "%s_initialization(%a)" name pp_mem mem
 
-let pp_init pp_mem fmt (name, mem) = fprintf fmt "%s_init(%a)" name pp_mem mem
 let pp_initialization' = pp_initialization pp_print_string
 
 let pp_local m =
@@ -324,6 +322,11 @@ let pp_transition_aux' ?i m =
   pp_transition_aux ?i stateless pp_print_string pp_print_string (fun fmt v ->
       (if is_output m v then pp_ptr_decl else pp_var_decl) fmt v)
 
+let pp_reset_set pp_mem fmt (name, mem) =
+  fprintf fmt "%s_reset_set(%a)" name pp_mem mem
+
+let pp_reset_set' = pp_reset_set pp_print_string
+
 let pp_reset_cleared pp_mem_in pp_mem_out fmt (name, mem_in, mem_out) =
   fprintf
     fmt
@@ -656,12 +659,6 @@ let pp_predicate pp_l pp_r fmt (l, r) =
 let pp_lemma pp_l pp_r fmt (l, r) =
   fprintf fmt "@[<v 2>lemma %a:@,%a;@]" pp_l l pp_r r
 
-let pp_axiomatic pp_l pp_r fmt (l, r) =
-  fprintf fmt "@[<v 2>axiomatic %a {@,%a@]@;}" pp_l l pp_r r
-
-let pp_axiom pp_l pp_r fmt (l, r) =
-  fprintf fmt "@[<v 2>axiom %a:@,%a;@]" pp_l l pp_r r
-
 let pp_mem_valid_def fmt m =
   if not (fst (get_stateless_status m) || m.mis_contract) then
     let name = m.mname.node_id in
@@ -853,6 +850,17 @@ let pp_initialization_def fmt m =
       fmt
       ((name, (name, mem_in)), m.minstances)
 
+let pp_reset_set_def fmt m =
+  if not (fst (get_stateless_status m)) then
+    let name = m.mname.node_id in
+    let mem = mk_mem m in
+    pp_acsl
+      (pp_predicate
+         (pp_reset_set (pp_machine_decl' ~ghost:true))
+         (pp_equal (pp_reset_flag' ~indirect:false) pp_print_int))
+      fmt
+      ((name, (name, mem)), (mem, 1))
+
 let pp_reset_cleared_def fmt m =
   if not (fst (get_stateless_status m)) then
     let name = m.mname.node_id in
@@ -970,7 +978,7 @@ module SrcMod = struct
     in
     fprintf
       fmt
-      "%a%a%a%a%a%a"
+      "%a%a%a%a%a%a%a"
       (pp_preds "/* ACSL `valid` predicates */" pp_mem_valid_def)
       machines
       (pp_preds "/* ACSL `memory pack` simulations */" pp_memory_pack_defs)
@@ -979,6 +987,8 @@ module SrcMod = struct
       machines
       (pp_preds "/* ACSL reset cleared annotations */" pp_reset_cleared_def)
       machines
+      (pp_preds "/* ACSL reset set annotations */" pp_reset_set_def)
+      machines
       (pp_preds "/* ACSL transition annotations */" pp_transition_defs)
       machines
       (pp_preds
@@ -1036,17 +1046,19 @@ module SrcMod = struct
           "%a@,%a@,%a"
           (pp_ensures (pp_memory_pack_aux pp_ptr pp_print_string))
           (name, mem, self)
-          (pp_ensures (pp_equal pp_reset_flag' pp_print_int))
-          (mem, 1)
+          (pp_ensures (pp_reset_set pp_ptr))
+          (name, mem)
           (pp_assigns pp_reset_flag')
           [ self; mem ])
       fmt
       ()
 
-  let spec_from_contract c = Spec_common.red (Imply (c.mc_pre, c.mc_post))
+  (** UNUSED *)
+  (* let spec_from_contract c = Spec_common.red (Imply (c.mc_pre, c.mc_post)) *)
 
-  let pp_contract m fmt c =
-    PrintSpec.pp_spec PrintSpec.TransitionMode m fmt (spec_from_contract c)
+  (** UNUSED *)
+  (* let pp_contract m fmt c = *)
+  (*   PrintSpec.pp_spec PrintSpec.TransitionMode m fmt (spec_from_contract c) *)
 
   let contract_of machines m =
     match m.mspec.mnode_spec with
@@ -1064,106 +1076,89 @@ module SrcMod = struct
     | None ->
       None, None
 
-  let pp_init_def fmt m =
-    let name = m.mname.node_id in
-    let mem = mk_mem m in
-    pp_predicate
-      (pp_init (pp_machine_decl' ~ghost:true))
-      (pp_and pp_initialization' (pp_reset_flag' ~indirect:false))
-      fmt
-      ((name, (name, mem)), ((name, mem), mem))
-
   let rename n x = sprintf "%s_%d" x n
   let rename_var_decl n vd = { vd with var_id = rename n vd.var_id }
 
-  let rec rename_value n v =
-    {
-      v with
-      value_desc =
-        (match v.value_desc with
-        | Machine_code_types.Var v ->
-          Machine_code_types.Var (rename_var_decl n v)
-        | Fun (f, vs) ->
-          Fun (f, List.map (rename_value n) vs)
-        | Array vs ->
-          Array (List.map (rename_value n) vs)
-        | Access (v1, v2) ->
-          Access (rename_value n v1, rename_value n v2)
-        | Power (v1, v2) ->
-          Power (rename_value n v1, rename_value n v2)
-        | v ->
-          v);
-    }
-
-  let rename_expression n = function
-    | Val v ->
-      Val (rename_value n v)
-    | Var v ->
-      Var (rename_var_decl n v)
-    | e ->
-      e
-
-  let rename_predicate n = function
-    | Transition (s, f, inst, i, es, r, mf, mif) ->
-      Transition (s, f, inst, i, List.map (rename_expression n) es, r, mf, mif)
-    | p ->
-      p
-
-  let rec rename_formula n = function
-    | Equal (e1, e2) ->
-      Equal (rename_expression n e1, rename_expression n e2)
-    | And fs ->
-      And (List.map (rename_formula n) fs)
-    | Or fs ->
-      Or (List.map (rename_formula n) fs)
-    | Imply (f1, f2) ->
-      Imply (rename_formula n f1, rename_formula n f2)
-    | Exists (xs, f) ->
-      Exists (List.map (rename_var_decl n) xs, rename_formula n f)
-    | Forall (xs, f) ->
-      Forall (List.map (rename_var_decl n) xs, rename_formula n f)
-    | Ternary (e, t, f) ->
-      Ternary (rename_expression n e, rename_formula n t, rename_formula n f)
-    | Predicate p ->
-      Predicate (rename_predicate n p)
-    | ExistsMem (x, f1, f2) ->
-      ExistsMem (rename n x, rename_formula n f1, rename_formula n f2)
-    | Value v ->
-      Value (rename_value n v)
-    | f ->
-      f
-
-  let rename_contract n c =
-    {
-      c with
-      mc_pre = rename_formula n c.mc_pre;
-      mc_post = rename_formula n c.mc_post;
-    }
-
-  let but_last l = List.(rev (tl (rev l)))
-
-  let pp_k_induction_case case m pp_mem_in pp_mem_out pp_vars fmt
-      (n, mem_in, mem_out) =
+  (** UNUSED *)
+  (* let rec rename_value n v = *)
+  (*   { *)
+  (*     v with *)
+  (*     value_desc = *)
+  (*       (match v.value_desc with *)
+  (*       | Machine_code_types.Var v -> *)
+  (*         Machine_code_types.Var (rename_var_decl n v) *)
+  (*       | Fun (f, vs) -> *)
+  (*         Fun (f, List.map (rename_value n) vs) *)
+  (*       | Array vs -> *)
+  (*         Array (List.map (rename_value n) vs) *)
+  (*       | Access (v1, v2) -> *)
+  (*         Access (rename_value n v1, rename_value n v2) *)
+  (*       | Power (v1, v2) -> *)
+  (*         Power (rename_value n v1, rename_value n v2) *)
+  (*       | v -> *)
+  (*         v); *)
+  (*   } *)
+
+  (* let rename_expression n = function *)
+  (*   | Val v -> *)
+  (*     Val (rename_value n v) *)
+  (*   | Var v -> *)
+  (*     Var (rename_var_decl n v) *)
+  (*   | e -> *)
+  (*     e *)
+
+  (* let rename_predicate n = function *)
+  (*   | Transition (s, f, inst, i, es, r, mf, mif) -> *)
+  (*     Transition (s, f, inst, i, List.map (rename_expression n) es, r, mf, mif) *)
+  (*   | p -> *)
+  (*     p *)
+
+  (* let rec rename_formula n = function *)
+  (*   | Equal (e1, e2) -> *)
+  (*     Equal (rename_expression n e1, rename_expression n e2) *)
+  (*   | And fs -> *)
+  (*     And (List.map (rename_formula n) fs) *)
+  (*   | Or fs -> *)
+  (*     Or (List.map (rename_formula n) fs) *)
+  (*   | Imply (f1, f2) -> *)
+  (*     Imply (rename_formula n f1, rename_formula n f2) *)
+  (*   | Exists (xs, f) -> *)
+  (*     Exists (List.map (rename_var_decl n) xs, rename_formula n f) *)
+  (*   | Forall (xs, f) -> *)
+  (*     Forall (List.map (rename_var_decl n) xs, rename_formula n f) *)
+  (*   | Ternary (e, t, f) -> *)
+  (*     Ternary (rename_expression n e, rename_formula n t, rename_formula n f) *)
+  (*   | Predicate p -> *)
+  (*     Predicate (rename_predicate n p) *)
+  (*   | ExistsMem (x, f1, f2) -> *)
+  (*     ExistsMem (rename n x, rename_formula n f1, rename_formula n f2) *)
+  (*   | Value v -> *)
+  (*     Value (rename_value n v) *)
+  (*   | f -> *)
+  (*     f *)
+
+  (* let rename_contract n c = *)
+  (*   { *)
+  (*     c with *)
+  (*     mc_pre = rename_formula n c.mc_pre; *)
+  (*     mc_post = rename_formula n c.mc_post; *)
+  (*   } *)
+
+  let pp_k_induction_case base m m_c pp_mem_out pp_vars fmt
+      (n, mem_out) =
     let name = m.mname.node_id in
-    let inputs = m.mstep.step_inputs in
-    let outputs = m.mstep.step_outputs in
     fprintf
       fmt
-      "%s_%s_%d(@[<hov>%a,@;%a,@;%a@])"
+      "%s_%s_%d(@[<hov>%a,@;%a@])"
       name
-      case
+      (if base then "base" else "inductive")
       n
-      pp_mem_in
-      mem_in
-      pp_vars
-      (inputs @ outputs)
       pp_mem_out
       mem_out
+      pp_vars
+      (List.map (rename_var_decl n) m_c.mstep.step_outputs)
 
-  let pp_k_induction_base_case m = pp_k_induction_case "base" m
-  let pp_k_induction_inductive_case m = pp_k_induction_case "inductive" m
-
-  let pp_base_cases m fmt (c, m_c, k) =
+  let pp_k_induction_case_def base m (_, m_c, _) fmt n =
     let name = m.mname.node_id in
     let name_c = m_c.mname.node_id in
     let mem = mk_mem m in
@@ -1172,317 +1167,152 @@ module SrcMod = struct
     let outputs = m.mstep.step_outputs in
     let stateless = fst (get_stateless_status m) in
     let stateless_c = fst (get_stateless_status m_c) in
-    let l = List.init (k - 1) (fun n -> n + 1) in
-    pp_print_list
-      ~pp_open_box:pp_open_vbox0
-      ~pp_sep:pp_print_cutcut
-      (fun fmt n ->
-        let l = List.init (n + 1) (fun n -> n) in
-        let pp fmt =
-          let pp =
-            pp_implies
-              (pp_and_l (fun fmt -> function
-                 | 0 ->
-                   let pp = pp_init pp_print_string in
-                   (if stateless_c then fun fmt (x, _) -> pp fmt x
-                   else pp_and pp pp)
-                     fmt
-                     ((name, rename 0 mem), (name_c, rename 0 mem_c))
-                 | n' ->
-                   let pp_var_c fmt (out, vd) =
-                     if out && n' < n then pp_true_c_bool fmt ()
-                     else pp_var_decl fmt vd
-                   in
-                   let c_inputs =
-                     List.map
-                       (fun v -> false, rename_var_decl n' v)
-                       m_c.mstep.step_inputs
-                   in
-                   let c_outputs =
-                     List.map
-                       (fun v -> true, rename_var_decl n' v)
-                       m_c.mstep.step_outputs
-                   in
-                   let pp stateless pp_var =
-                     pp_transition_aux
-                       stateless
-                       pp_print_string
-                       pp_print_string
-                       pp_var
-                   in
-                   pp_and
-                     (pp stateless pp_var_decl)
-                     (pp stateless_c pp_var_c)
-                     fmt
-                     ( ( name,
-                         List.map (rename_var_decl n') (inputs @ outputs),
-                         rename (n' - 1) mem,
-                         rename n' mem ),
-                       ( name_c,
-                         c_inputs @ c_outputs,
-                         rename (n' - 1) mem_c,
-                         rename n' mem_c ) )))
-              (pp_contract m)
+    let l = List.init (n + 1) Fun.id in
+    let l_pp = List.concat_map (function
+        | 0 ->
+          let pp = pp_reset_set' in
+          [
+            fun fmt ->
+              (if stateless_c then fun fmt (x, _) -> pp fmt x
+               else pp_and pp pp)
+                fmt
+                ((name, rename 0 mem), (name_c, rename 0 mem_c))
+          ]
+        | n' ->
+          let pp_var_c fmt (out, vd) =
+            if out && n' < n then pp_true_c_bool fmt ()
+            else pp_var_decl fmt vd
           in
-          if stateless_c then pp fmt
-          else fun x ->
-            pp_forall
-              (pp_machine_decl
-                 ~ghost:true
-                 (pp_comma_list (fun fmt n ->
-                      pp_print_string fmt (rename n mem_c))))
-              pp
-              fmt
-              ((name_c, l), x)
-        in
-        pp_predicate
-          (pp_k_induction_base_case
-             m
-             (pp_machine_decl' ~ghost:true)
-             (pp_machine_decl' ~ghost:true)
-             (fun fmt xs -> pp_locals m fmt (List.map (rename_var_decl n) xs)))
-          (pp_forall
-             (pp_locals m)
-             (if n > 1 then
-              pp_forall
-                (fun fmt l ->
-                  fprintf
-                    fmt
-                    "%a@,%a"
-                    (pp_machine_decl
-                       ~ghost:true
-                       (pp_comma_list ~pp_eol:pp_print_comma (fun fmt n ->
-                            pp_print_string fmt (rename n mem))))
-                    (name, but_last l)
-                    (pp_locals m)
-                    (List.flatten
-                       (List.map
-                          (fun n ->
-                            List.map (rename_var_decl n) (inputs @ outputs))
-                          (List.tl l))))
-                pp
-             else fun fmt (_, x) -> pp fmt x))
-          fmt
-          ( (n, (name, rename (n - 1) mem), (name, rename n mem)),
-            ( List.map (rename_var_decl n) m_c.mstep.step_outputs,
-              (but_last l, (l, rename_contract n c)) ) ))
-      fmt
-      l
-
-  let pp_inductive_case m fmt (c, m_c, k) =
-    let name = m.mname.node_id in
-    let mem = mk_mem m in
-    let mem_c = mk_mem_c m_c in
-    let inputs = m.mstep.step_inputs in
-    let outputs = m.mstep.step_outputs in
-    let stateless = fst (get_stateless_status m) in
-    let stateless_c = fst (get_stateless_status m_c) in
-    let l = List.init k (fun n -> n + 1) in
-    let l' = 0 :: l in
-    let pp fmt =
-      let pp =
-        pp_implies
-          (pp_and_l (fun fmt n ->
-               let pp_var_c fmt (out, vd) =
-                 if out && n < k then pp_true_c_bool fmt ()
-                 else pp_var_decl fmt vd
-               in
-               let c_inputs =
-                 List.map
-                   (fun v -> false, rename_var_decl n v)
-                   m_c.mstep.step_inputs
-               in
-               let c_outputs =
-                 List.map
-                   (fun v -> true, rename_var_decl n v)
-                   m_c.mstep.step_outputs
-               in
-               pp_and
-                 (pp_transition_aux
-                    stateless
-                    pp_print_string
-                    pp_print_string
-                    pp_var_decl)
-                 (pp_transition_aux
-                    stateless_c
-                    pp_print_string
-                    pp_print_string
-                    pp_var_c)
-                 fmt
-                 ( ( name,
-                     List.map (rename_var_decl n) (inputs @ outputs),
-                     rename (n - 1) mem,
-                     rename n mem ),
-                   ( m_c.mname.node_id,
-                     c_inputs @ c_outputs,
-                     rename (n - 1) mem_c,
-                     rename n mem_c ) )))
-          (pp_contract m)
-      in
-      if stateless_c then pp fmt
-      else fun x ->
-        pp_forall
+          let c_inputs =
+            List.map
+              (fun v -> false, rename_var_decl n' v)
+              m_c.mstep.step_inputs
+          in
+          let c_outputs =
+            List.map
+              (fun v -> true, rename_var_decl n' v)
+              m_c.mstep.step_outputs
+          in
+          let pp stateless pp_var =
+            pp_transition_aux
+              stateless
+              pp_print_string
+              pp_print_string
+              pp_var
+          in
+          [
+            (fun fmt ->
+               pp stateless pp_var_decl fmt
+                 ( name,
+                   List.map (rename_var_decl n') (inputs @ outputs),
+                   rename (n' - 1) mem,
+                   rename n' mem ));
+            (fun fmt ->
+               pp stateless_c pp_var_c fmt
+                 ( name_c,
+                   c_inputs @ c_outputs,
+                   rename (n' - 1) mem_c,
+                   rename n' mem_c ))
+          ]) l
+    in
+    let l_pp = if base then l_pp else List.tl l_pp in
+    let pp fmt () =
+      let pp fmt () = pp_and_l (fun fmt f -> f fmt) fmt l_pp in
+      if stateless_c then pp fmt ()
+      else
+        pp_exists
           (pp_machine_decl
              ~ghost:true
-             (pp_comma_list (fun fmt n -> pp_print_string fmt (rename n mem_c))))
+             (pp_comma_list (fun fmt n ->
+                  pp_print_string fmt (rename n mem_c))))
           pp
           fmt
-          ((m_c.mname.node_id, l'), x)
+          ((name_c, l), ())
     in
     pp_predicate
-      (pp_k_induction_inductive_case
+      (pp_k_induction_case
+         base
          m
+         m_c
          (pp_machine_decl' ~ghost:true)
-         (pp_machine_decl' ~ghost:true)
-         (fun fmt xs -> pp_locals m fmt (List.map (rename_var_decl k) xs)))
-      (pp_forall
-         (pp_locals m)
-         (if k > 1 then
-          pp_forall
-            (fun fmt l ->
-              fprintf
-                fmt
-                "%a@,%a"
-                (pp_machine_decl
-                   ~ghost:true
-                   (pp_comma_list ~pp_eol:pp_print_comma (fun fmt n ->
-                        pp_print_string fmt (rename (n - 1) mem))))
-                (name, but_last l)
-                (pp_locals m)
-                (List.flatten
-                   (List.map
-                      (fun n ->
-                        List.map (rename_var_decl (n - 1)) (inputs @ outputs))
-                      (List.tl l))))
-            pp
-         else fun fmt (_, x) -> pp fmt x))
+         (pp_locals m_c))
+      (pp_exists
+         (fun fmt l ->
+            fprintf
+              fmt
+              "%a@,%a"
+              (pp_machine_decl
+                 ~ghost:true
+                 (pp_comma_list ~pp_eol:pp_print_comma (fun fmt n ->
+                      pp_print_string fmt (rename (n - 1) mem))))
+              (name, l)
+              (pp_locals m)
+              (List.concat_map (fun n ->
+                   List.map (rename_var_decl n) (inputs @ outputs))
+                  l))
+         pp)
       fmt
-      ( (k, (name, rename (k - 1) mem), (name, rename k mem)),
-        ( List.map (rename_var_decl k) m_c.mstep.step_outputs,
-          (l, (l, rename_contract k c)) ) )
+      ( (n, (name, rename n mem)),
+        ( List.tl l, () ) )
 
-  let pp_k_induction_lemmas m fmt k =
-    let name = m.mname.node_id in
-    let mem_in = mk_mem_in m in
-    let mem_out = mk_mem_out m in
-    let inputs = m.mstep.step_inputs in
-    let outputs = m.mstep.step_outputs in
-    let l = List.init k (fun n -> n + 1) in
+  let pp_base_case_defs m fmt (_, _, k as c_m_k) =
+    let l = List.init (k - 1) succ in
     pp_print_list
       ~pp_open_box:pp_open_vbox0
       ~pp_sep:pp_print_cutcut
-      (fun fmt n ->
-        pp_lemma
-          (fun fmt n -> fprintf fmt "%s_k_induction_%d" name n)
-          (pp_forall
-             (fun fmt () ->
-               fprintf
-                 fmt
-                 "%a,@;%a"
-                 (pp_machine_decl ~ghost:true (pp_comma_list pp_print_string))
-                 (name, [ mem_in; mem_out ])
-                 (pp_locals m)
-                 (inputs @ outputs))
-             ((if n = k then pp_k_induction_inductive_case
-              else pp_k_induction_base_case)
-                m
-                pp_print_string
-                pp_print_string
-                (pp_comma_list pp_var_decl)))
-          fmt
-          (n, ((), (n, mem_in, mem_out))))
+      (pp_k_induction_case_def true m c_m_k)
       fmt
       l
 
-  let pp_k_induction_axiom m fmt (c, m_c, k) =
+  let pp_inductive_case_def m fmt (_, _, k as c_m_k) =
+    pp_k_induction_case_def false m c_m_k fmt k
+
+  let pp_k_induction_lemmas m fmt (_, m_c, k) =
     let name = m.mname.node_id in
-    let mem_in = mk_mem_in m in
-    let mem_out = mk_mem_out m in
-    let mem_in_c = mk_mem_in_c m_c in
-    let mem_out_c = mk_mem_out_c m_c in
-    let inputs = m.mstep.step_inputs in
-    let outputs = m.mstep.step_outputs in
-    let stateless = fst (get_stateless_status m) in
-    let stateless_c = fst (get_stateless_status m_c) in
+    let mem = mk_mem m in
     let l = List.init k (fun n -> n + 1) in
-    let pp =
-      pp_implies
-        (pp_and_l (fun fmt n ->
-             (if n = k then pp_k_induction_inductive_case
-             else pp_k_induction_base_case)
-               m
-               pp_print_string
-               pp_print_string
-               (pp_comma_list pp_var_decl)
-               fmt
-               (n, mem_in, mem_out)))
-        (pp_forall
-           (pp_locals m)
-           (pp_implies
-              (pp_and
-                 (pp_transition_aux
-                    stateless
-                    pp_print_string
-                    pp_print_string
-                    pp_var_decl)
-                 (pp_transition_aux
-                    stateless_c
-                    pp_print_string
+    pp_print_list
+      ~pp_open_box:pp_open_vbox0
+      ~pp_sep:pp_print_cutcut
+      (fun fmt n ->
+         let outputs = List.map (rename_var_decl n) m_c.mstep.step_outputs in
+         pp_lemma
+           (fun fmt n -> fprintf fmt "%s_k_induction_%d" name n)
+           (pp_forall
+              (fun fmt () ->
+                 fprintf
+                   fmt
+                   "%a,@;%a"
+                   (pp_machine_decl' ~ghost:true)
+                   (name, mem)
+                   (pp_locals m_c)
+                   outputs)
+              (pp_implies
+                 (pp_k_induction_case
+                    (n <> k)
+                    m
+                    m_c
                     pp_print_string
-                    pp_var_decl))
-              (pp_contract m)))
-    in
-    pp_axiomatic
-      (fun fmt () -> fprintf fmt "%s_k_Induction" name)
-      (pp_axiom
-         (fun fmt () -> fprintf fmt "%s_k_induction" name)
-         (pp_forall
-            (fun fmt () ->
-              fprintf
-                fmt
-                "%a,@;%a"
-                (pp_machine_decl ~ghost:true (pp_comma_list pp_print_string))
-                (name, [ mem_in; mem_out ])
-                (pp_locals m)
-                (inputs @ outputs))
-            (if stateless_c then pp
-            else fun fmt x ->
-              pp_forall
-                (pp_machine_decl ~ghost:true (pp_comma_list pp_print_string))
-                pp
-                fmt
-                ((m_c.mname.node_id, [ mem_in_c; mem_out_c ]), x))))
+                    (pp_comma_list pp_var_decl))
+                 (pp_and_l
+                    (fun fmt x ->
+                       pp_equal pp_var_decl pp_print_int fmt (x, 1)))))
+           fmt
+           (n, ((), ((n, mem), outputs))))
       fmt
-      ( (),
-        ( (),
-          ( (),
-            ( l,
-              ( m_c.mstep.step_outputs,
-                ( ( (name, inputs @ outputs, mem_in, mem_out),
-                    ( m_c.mname.node_id,
-                      m_c.mstep.step_inputs @ m_c.mstep.step_outputs,
-                      mem_in_c,
-                      mem_out_c ) ),
-                  c ) ) ) ) ) )
+      l
 
-  let pp_k_induction m fmt ((_, m_c, k) as c_m_k) =
-    let stateless_c = fst (get_stateless_status m_c) in
+  let pp_k_induction m fmt c_m_k =
     pp_acsl_cut
       (fun fmt () ->
         fprintf
           fmt
-          "%a@,@,%a@,@,%a@,@,%a@,@,%a@,@,%a"
-          pp_init_def
-          m
-          (if stateless_c then pp_print_nothing else pp_init_def)
-          m_c
-          (pp_base_cases m)
+          "%a@,@,%a@,@,%a"
+          (pp_base_case_defs m)
           c_m_k
-          (pp_inductive_case m)
+          (pp_inductive_case_def m)
           c_m_k
           (pp_k_induction_lemmas m)
-          k
-          (pp_k_induction_axiom m)
           c_m_k)
       fmt
       ()
@@ -1525,14 +1355,14 @@ module SrcMod = struct
     let pp_spec =
       pp_print_option
         (if m.mis_contract then pp_print_nothing
-        else fun fmt c ->
+        else fun fmt _c ->
           pp_print_option
             (fun fmt m_c ->
               let mem_in = mk_mem_in_c m_c in
               let mem_out = mk_mem_out_c m_c in
               let stateless_c = fst (get_stateless_status m_c) in
               pp_ensures
-                (pp_forall
+                (pp_exists
                    (fun fmt vs ->
                      fprintf
                        fmt
@@ -1547,23 +1377,20 @@ module SrcMod = struct
                        (m_c.mname.node_id, [ mem_in; mem_out ])
                        (pp_locals m)
                        vs)
-                   (pp_implies
-                      (pp_transition_aux
-                         stateless_c
-                         pp_print_string
-                         pp_print_string
-                         (fun fmt v ->
-                           (if is_output m v then pp_ptr_decl else pp_var_decl)
-                             fmt
-                             v))
-                      (pp_contract m)))
+                   (pp_transition_aux
+                      stateless_c
+                      pp_print_string
+                      pp_print_string
+                      (fun fmt v ->
+                         (if is_output m v then pp_ptr_decl else pp_var_decl)
+                           fmt
+                           v)))
                 fmt
                 ( m_c.mstep.step_outputs,
-                  ( ( m_c.mname.node_id,
+                  ( m_c.mname.node_id,
                       m_c.mstep.step_inputs @ m_c.mstep.step_outputs,
                       mem_in,
-                      mem_out ),
-                    c ) ))
+                      mem_out )))
             fmt
             m_c)
     in
@@ -1700,33 +1527,6 @@ module SrcMod = struct
       | None ->
         [ mem, pp_print_string ])
 
-  let pp_contract fmt machines _self mem m =
-    let pp_vars ?pp_eol = pp_comma_list ?pp_eol (pp_c_var_read m) in
-    match contract_of machines m with
-    | Some c, Some _ ->
-      pp_print_option
-        (pp_acsl_cut (fun fmt -> function
-           | Kinduction k ->
-             let l = List.init k (fun n -> n + 1) in
-             let pp_mem_in = pp_at_pre pp_ptr in
-             let pp_mem_out = pp_ptr in
-             pp_assert
-               (pp_and_l (fun fmt n ->
-                    (if n = k then pp_k_induction_inductive_case
-                    else pp_k_induction_base_case)
-                      m
-                      pp_mem_in
-                      pp_mem_out
-                      pp_vars
-                      fmt
-                      (n, mem, mem)))
-               fmt
-               l))
-        fmt
-        c.mc_proof
-    | _, _ ->
-      ()
-
   let pp_c_decl_local_spec_var m fmt v =
     pp_acsl_line'
       (fun fmt v -> fprintf fmt "%a;" (pp_ghost (pp_c_decl_local_var m)) v)
diff --git a/src/backends/C/c_backend_src.ml b/src/backends/C/c_backend_src.ml
index 15f7da4c87de31012468d51f82c154a6771a01d6..4fa2b900c2e0b1081e267d1a047cf8343c5acfc2 100644
--- a/src/backends/C/c_backend_src.ml
+++ b/src/backends/C/c_backend_src.ml
@@ -33,9 +33,6 @@ module type MODIFIERS_SRC = sig
 
   val pp_ghost_parameter : ident -> formatter -> ident option -> unit
 
-  val pp_contract :
-    formatter -> machine_t list -> ident -> ident -> machine_t -> unit
-
   val pp_c_decl_local_spec_var : machine_t -> formatter -> var_decl -> unit
   val get_spec_locals : machine_t -> var_decl list
   val pp_ghost_reset_memory : machine_t -> formatter -> ident -> unit
@@ -50,7 +47,6 @@ module EmptyMod = struct
   let pp_step_spec _ _ _ _ _ = ()
   let pp_step_instr_spec _ _ _ _ _ = ()
   let pp_ghost_parameter _ _ _ = ()
-  let pp_contract _ _ _ _ _ = ()
   let pp_c_decl_local_spec_var _ _ _ = ()
   let get_spec_locals _ = []
   let pp_ghost_reset_memory _ _ _ = ()
@@ -631,7 +627,6 @@ module Main (Mod : MODIFIERS_SRC) = struct
         ~checks:m.mstep.step_checks
         ~pp_instr:(pp_machine_instr dependencies m self self)
         ~instrs:m.mstep.step_instrs
-        ~pp_extra:(fun fmt () -> Mod.pp_contract fmt machines self self m)
         fmt
     else
       (* C90 code *)
@@ -663,7 +658,6 @@ module Main (Mod : MODIFIERS_SRC) = struct
         ~checks:m.mstep.step_checks
         ~pp_instr:(pp_machine_instr dependencies m self self)
         ~instrs:m.mstep.step_instrs
-        ~pp_extra:(fun fmt () -> Mod.pp_contract fmt machines self self m)
         fmt
 
   let pp_clear_reset_code dependencies self mem fmt m =
@@ -763,7 +757,6 @@ module Main (Mod : MODIFIERS_SRC) = struct
         ~checks:m.mstep.step_checks
         ~pp_instr:(pp_machine_instr dependencies m self mem)
         ~instrs:m.mstep.step_instrs
-        ~pp_extra:(fun fmt () -> Mod.pp_contract fmt machines self mem m)
         fmt
     else
       (* C90 code *)
@@ -798,7 +791,6 @@ module Main (Mod : MODIFIERS_SRC) = struct
         ~checks:m.mstep.step_checks
         ~pp_instr:(pp_machine_instr dependencies m self mem)
         ~instrs:m.mstep.step_instrs
-        ~pp_extra:(fun fmt () -> Mod.pp_contract fmt machines self mem m)
         fmt
 
   (********************************************************************************************)
diff --git a/src/backends/C/c_backend_src.mli b/src/backends/C/c_backend_src.mli
index 47a5665099636ed26da3f35e8e4e47b2d00bf11c..1f0f9bcfdc415b3eb512364c77fea2098df0016d 100644
--- a/src/backends/C/c_backend_src.mli
+++ b/src/backends/C/c_backend_src.mli
@@ -19,9 +19,6 @@ module type MODIFIERS_SRC = sig
 
   val pp_ghost_parameter : ident -> formatter -> ident option -> unit
 
-  val pp_contract :
-    formatter -> machine_t list -> ident -> ident -> machine_t -> unit
-
   val pp_c_decl_local_spec_var : machine_t -> formatter -> var_decl -> unit
   val get_spec_locals : machine_t -> var_decl list
   val pp_ghost_reset_memory : machine_t -> formatter -> ident -> unit