diff --git a/drivers/c.drv b/drivers/c.drv
index 811e4f3c4007fecdc6c2696d433fc221bd2ca5b4..f09eba31a6783191a15a549c0fa585d1d3bf17ff 100644
--- a/drivers/c.drv
+++ b/drivers/c.drv
@@ -27,17 +27,17 @@ module mach.int.Int32
 
   syntax type int32  "int32_t"
 
-  syntax val (+)     "%1 + %2"
-  syntax val (-)     "%1 - %2"
+  syntax val (+)     "(%1) + (%2)"
+  syntax val (-)     "(%1) - (%2)"
   syntax val (-_)    "-(%1)"
-  syntax val (*)     "%1 * %2"
-  syntax val (/)     "%1 / %2"
-  syntax val (%)     "%1 % %2"
-  syntax val (=)     "%1 == %2"
-  syntax val (<=)    "%1 <= %2"
-  syntax val (<)     "%1 < %2"
-  syntax val (>=)    "%1 >= %2"
-  syntax val (>)     "%1 > %2"
+  syntax val (*)     "(%1) * (%2)"
+  syntax val (/)     "(%1) / (%2)"
+  syntax val (%)     "(%1) % (%2)"
+  syntax val (=)     "(%1) == (%2)"
+  syntax val (<=)    "(%1) <= (%2)"
+  syntax val (<)     "(%1) < (%2)"
+  syntax val (>=)    "(%1) >= (%2)"
+  syntax val (>)     "(%1) > (%2)"
 end
 
 module mach.int.UInt32Gen
@@ -53,16 +53,17 @@ module mach.int.UInt32
 
   syntax converter of_int "%1U"
 
-  syntax val (+)     "%1 + %2"
-  syntax val (-)     "%1 - %2"
-  syntax val (*)     "%1 * %2"
-  syntax val (/)     "%1 / %2"
-  syntax val (%)     "%1 % %2"
-  syntax val (=)     "%1 == %2"
-  syntax val (<=)    "%1 <= %2"
-  syntax val (<)     "%1 < %2"
-  syntax val (>=)    "%1 >= %2"
-  syntax val (>)     "%1 > %2"
+
+  syntax val (+)     "(%1) + (%2)"
+  syntax val (-)     "(%1) - (%2)"
+  syntax val (*)     "(%1) * (%2)"
+  syntax val (/)     "(%1) / (%2)"
+  syntax val (%)     "(%1) % (%2)"
+  syntax val (=)     "(%1) == (%2)"
+  syntax val (<=)    "(%1) <= (%2)"
+  syntax val (<)     "(%1) < (%2)"
+  syntax val (>=)    "(%1) >= (%2)"
+  syntax val (>)     "(%1) > (%2)"
 
 end
 
@@ -184,16 +185,16 @@ struct __lsld32_result lsld32(uint32_t x, uint32_t cnt);
 
   syntax converter of_int "%1U"
 
-  syntax val (+)     "%1 + %2"
-  syntax val (-)     "%1 - %2"
-  syntax val (*)     "%1 * %2"
-  syntax val (/)     "%1 / %2"
-  syntax val (%)     "%1 % %2"
-  syntax val (=)     "%1 == %2"
-  syntax val (<=)    "%1 <= %2"
-  syntax val (<)     "%1 < %2"
-  syntax val (>=)    "%1 >= %2"
-  syntax val (>)     "%1 > %2"
+  syntax val (+)     "(%1) + (%2)"
+  syntax val (-)     "(%1) - (%2)"
+  syntax val (*)     "(%1) * (%2)"
+  syntax val (/)     "(%1) / (%2)"
+  syntax val (%)     "(%1) % (%2)"
+  syntax val (=)     "(%1) == (%2)"
+  syntax val (<=)    "(%1) <= (%2)"
+  syntax val (<)     "(%1) < (%2)"
+  syntax val (>=)    "(%1) >= (%2)"
+  syntax val (>)     "(%1) > (%2)"
 
   syntax val add_with_carry "add32_with_carry"
   syntax val sub_with_borrow "sub32_with_borrow"
@@ -201,23 +202,42 @@ struct __lsld32_result lsld32(uint32_t x, uint32_t cnt);
   syntax val add3 "add32_3"
   syntax val lsld "lsld32"
 
-  syntax val add_mod "%1 + %2"
-  syntax val sub_mod "%1 - %2"
-  syntax val mul_mod "%1 * %2"
+  syntax val add_mod "(%1) + (%2)"
+  syntax val sub_mod "(%1) - (%2)"
+  syntax val mul_mod "(%1) * (%2)"
 
   syntax val div2by1
-         "(uint32_t)(((uint64_t)%1 | ((uint64_t)%2 << 32))/(uint64_t)%3)"
+         "(uint32_t)((((uint64_t)%1) | (((uint64_t)%2) << 32))/(uint64_t)(%3))"
 
-  syntax val lsl "%1 << %2"
-  syntax val lsr "%1 >> %2"
+  syntax val lsl "(%1) << (%2)"
+  syntax val lsr "(%1) >> (%2)"
 
-  syntax val is_msb_set "%1 & 0x80000000U"
+  syntax val is_msb_set "(%1) & 0x80000000U"
 
   syntax val count_leading_zeros "__builtin_clz(%1)"
 
-  syntax val of_int32 "(uint32_t)%1"
+  syntax val of_int32 "(uint32_t)(%1)"
+
+
+end
+
+module mach.int.Int64
+  syntax val of_int "%1"
+  syntax converter of_int "%1"
 
+  syntax type int64  "int64_t"
 
+  syntax val (+)     "(%1) + (%2)"
+  syntax val (-)     "(%1) - (%2)"
+  syntax val (-_)    "-(%1)"
+  syntax val (*)     "(%1) * (%2)"
+  syntax val (/)     "(%1) / (%2)"
+  syntax val (%)     "(%1) % (%2)"
+  syntax val (=)     "(%1) == (%2)"
+  syntax val (<=)    "(%1) <= (%2)"
+  syntax val (<)     "(%1) < (%2)"
+  syntax val (>=)    "(%1) >= (%2)"
+  syntax val (>)     "(%1) > (%2)"
 end
 
 module mach.int.UInt64Gen
@@ -233,17 +253,17 @@ module mach.int.UInt64
 
   syntax converter of_int "%1ULL"
 
-  syntax val (+)     "%1 + %2"
-  syntax val (-)     "%1 - %2"
-  syntax val (*)     "%1 * %2"
-  syntax val (/)     "%1 / %2"
-  syntax val (%)     "%1 % %2"
-  syntax val (=)     "%1 == %2"
-  syntax val (<=)    "%1 <= %2"
-  syntax val (<)     "%1 < %2"
-  syntax val (>=)    "%1 >= %2"
-  syntax val (>)     "%1 > %2"
-
+  syntax val (+)     "(%1) + (%2)"
+  syntax val (-)     "(%1) - (%2)"
+  syntax val (-_)    "-(%1)"
+  syntax val (*)     "(%1) * (%2)"
+  syntax val (/)     "(%1) / (%2)"
+  syntax val (%)     "(%1) % (%2)"
+  syntax val (=)     "(%1) == (%2)"
+  syntax val (<=)    "(%1) <= (%2)"
+  syntax val (<)     "(%1) < (%2)"
+  syntax val (>=)    "(%1) >= (%2)"
+  syntax val (>)     "(%1) > (%2)"
 
 end
 
@@ -434,16 +454,16 @@ struct __lsld64_result lsld64(uint64_t x, uint64_t cnt);
 "
   syntax converter of_int "%1ULL"
 
-  syntax val (+)     "%1 + %2"
-  syntax val (-)     "%1 - %2"
-  syntax val (*)     "%1 * %2"
-  syntax val (/)     "%1 / %2"
-  syntax val (%)     "%1 % %2"
-  syntax val (=)     "%1 == %2"
-  syntax val (<=)    "%1 <= %2"
-  syntax val (<)     "%1 < %2"
-  syntax val (>=)    "%1 >= %2"
-  syntax val (>)     "%1 > %2"
+  syntax val (+)     "(%1) + (%2)"
+  syntax val (-)     "(%1) - (%2)"
+  syntax val (*)     "(%1) * (%2)"
+  syntax val (/)     "(%1) / (%2)"
+  syntax val (%)     "(%1) % (%2)"
+  syntax val (=)     "(%1) == (%2)"
+  syntax val (<=)    "(%1) <= (%2)"
+  syntax val (<)     "(%1) < (%2)"
+  syntax val (>=)    "(%1) >= (%2)"
+  syntax val (>)     "(%1) > (%2)"
 
   syntax val add_with_carry "add64_with_carry"
   syntax val add_double "add64_double"
@@ -458,20 +478,20 @@ struct __lsld64_result lsld64(uint64_t x, uint64_t cnt);
   syntax val add3 "add64_3"
   syntax val lsld "lsld64"
 
-  syntax val add_mod "%1 + %2"
-  syntax val sub_mod "%1 - %2"
-  syntax val mul_mod "%1 * %2"
+  syntax val add_mod "(%1) + (%2)"
+  syntax val sub_mod "(%1) - (%2)"
+  syntax val mul_mod "(%1) * (%2)"
 
-  syntax val lsl "%1 << %2"
-  syntax val lsr "%1 >> %2"
+  syntax val lsl "(%1) << (%2)"
+  syntax val lsr "(%1) >> (%2)"
 
-  syntax val is_msb_set "%1 & 0x8000000000000000ULL"
+  syntax val is_msb_set "(%1) & 0x8000000000000000ULL"
 
   syntax val count_leading_zeros "__builtin_clzll(%1)"
 
-  syntax val of_int32 "(uint64_t)%1"
-  syntax val to_int64 "(int64_t)%1"
-  syntax val of_int64 "(uint64_t)%1"
+  syntax val of_int32 "(uint64_t)(%1)"
+  syntax val to_int64 "(int64_t)(%1)"
+  syntax val of_int64 "(uint64_t)(%1)"
 
 end
 
@@ -480,6 +500,8 @@ end
 module mach.c.C
 
   prelude "#include <assert.h>"
+  prelude "#define IGNORE2(x,y) do {} while (0)"
+  interface "#define IGNORE2(x,y) do {} while (0)"
 
   syntax type ptr "%1 *"
   syntax type bool "int" (* ? *)
@@ -501,7 +523,9 @@ module mach.c.C
   syntax val set_ofs "*(%1+(%2)) = %3"
 
   syntax val incr_split "%1+(%2)"
-  syntax val join "(void)0"
+  syntax val decr_split "%1-(%2)"
+  syntax val join "IGNORE2"
+  syntax val join_r "IGNORE2"
 
   syntax val c_assert "assert ( %1 )"
 
diff --git a/examples/multiprecision/sub.mlw b/examples/multiprecision/sub.mlw
index 5634c7215166acb08969bd4970152c3e0c487402..946a14e790d1cbb8f13f85622f1bb2c48185d351 100644
--- a/examples/multiprecision/sub.mlw
+++ b/examples/multiprecision/sub.mlw
@@ -380,9 +380,9 @@ module Sub
     writes   { x.data.elts }
   =
     let ghost ox = { x } in
-    let ghost b : ref limb = ref 1 in
-    let lx : ref limb = ref 0 in
-    let i : ref int32 = ref 0 in
+    let ghost b = ref (Limb.of_int 1) in
+    let lx = ref (Limb.of_int 0) in
+    let i = ref (Int32.of_int 0) in
     while (Limb.(=) !lx 0) do
       invariant { 0 <= !i <= sz }
       invariant { !i = sz -> !lx <> 0 }
diff --git a/examples/multiprecision/sub/why3session.xml b/examples/multiprecision/sub/why3session.xml
index a4e2b3b86a02eccc1bb19ae56e6666476d385d1d..707afb55d9be51683ddd10c9982081a159c282a1 100644
--- a/examples/multiprecision/sub/why3session.xml
+++ b/examples/multiprecision/sub/why3session.xml
@@ -1034,197 +1034,206 @@
  </goal>
  <goal name="VC wmpn_decr_1" expl="VC for wmpn_decr_1" proved="true">
  <transf name="split_vc" proved="true" >
-  <goal name="VC wmpn_decr_1.0" expl="loop invariant init" proved="true">
-  <proof prover="3"><result status="valid" time="0.02"/></proof>
+  <goal name="VC wmpn_decr_1.0" expl="integer overflow" proved="true">
+  <proof prover="2"><result status="valid" time="0.06"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.1" expl="loop invariant init" proved="true">
-  <proof prover="3"><result status="valid" time="0.02"/></proof>
+  <goal name="VC wmpn_decr_1.1" expl="integer overflow" proved="true">
+  <proof prover="2"><result status="valid" time="0.04"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.2" expl="loop invariant init" proved="true">
-  <proof prover="3"><result status="valid" time="0.02"/></proof>
+  <goal name="VC wmpn_decr_1.2" expl="integer overflow" proved="true">
+  <proof prover="2"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="VC wmpn_decr_1.3" expl="loop invariant init" proved="true">
   <proof prover="3"><result status="valid" time="0.02"/></proof>
   </goal>
   <goal name="VC wmpn_decr_1.4" expl="loop invariant init" proved="true">
-  <proof prover="3"><result status="valid" time="0.04"/></proof>
+  <proof prover="3"><result status="valid" time="0.02"/></proof>
   </goal>
   <goal name="VC wmpn_decr_1.5" expl="loop invariant init" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.06" steps="20"/></proof>
+  <proof prover="3"><result status="valid" time="0.02"/></proof>
   </goal>
   <goal name="VC wmpn_decr_1.6" expl="loop invariant init" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.03" steps="18"/></proof>
+  <proof prover="3"><result status="valid" time="0.02"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.7" expl="precondition" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.02" steps="90"/></proof>
+  <goal name="VC wmpn_decr_1.7" expl="loop invariant init" proved="true">
+  <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.8" expl="assertion" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.01" steps="40"/></proof>
+  <goal name="VC wmpn_decr_1.8" expl="loop invariant init" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.03" steps="20"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.9" expl="assertion" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.02" steps="29"/></proof>
+  <goal name="VC wmpn_decr_1.9" expl="loop invariant init" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.06" steps="18"/></proof>
   </goal>
   <goal name="VC wmpn_decr_1.10" expl="precondition" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.04" steps="111"/></proof>
+  </goal>
+  <goal name="VC wmpn_decr_1.11" expl="assertion" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.01" steps="43"/></proof>
+  </goal>
+  <goal name="VC wmpn_decr_1.12" expl="assertion" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.02" steps="32"/></proof>
+  </goal>
+  <goal name="VC wmpn_decr_1.13" expl="precondition" proved="true">
   <proof prover="3"><result status="valid" time="0.03"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.11" expl="precondition" proved="true">
+  <goal name="VC wmpn_decr_1.14" expl="precondition" proved="true">
   <proof prover="3"><result status="valid" time="0.01"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.12" expl="precondition" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.04" steps="130"/></proof>
+  <goal name="VC wmpn_decr_1.15" expl="precondition" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.04" steps="151"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.13" expl="assertion" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.02" steps="54"/></proof>
+  <goal name="VC wmpn_decr_1.16" expl="assertion" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.02" steps="57"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.14" expl="assertion" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.08" steps="114"/></proof>
+  <goal name="VC wmpn_decr_1.17" expl="assertion" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.09" steps="134"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.15" expl="precondition" proved="true">
+  <goal name="VC wmpn_decr_1.18" expl="precondition" proved="true">
   <proof prover="3"><result status="valid" time="0.01"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.16" expl="precondition" proved="true">
+  <goal name="VC wmpn_decr_1.19" expl="precondition" proved="true">
   <proof prover="3"><result status="valid" time="0.01"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.17" expl="assertion" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.04" steps="54"/></proof>
+  <goal name="VC wmpn_decr_1.20" expl="assertion" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.04" steps="57"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.18" expl="integer overflow" proved="true">
+  <goal name="VC wmpn_decr_1.21" expl="integer overflow" proved="true">
   <proof prover="3"><result status="valid" time="0.16"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.19" expl="assertion" proved="true">
+  <goal name="VC wmpn_decr_1.22" expl="assertion" proved="true">
   <transf name="split_vc" proved="true" >
-   <goal name="VC wmpn_decr_1.19.0" expl="assertion" proved="true">
+   <goal name="VC wmpn_decr_1.22.0" expl="assertion" proved="true">
    <proof prover="0" memlimit="1000"><result status="valid" time="0.02"/></proof>
    </goal>
-   <goal name="VC wmpn_decr_1.19.1" expl="VC for wmpn_decr_1" proved="true">
+   <goal name="VC wmpn_decr_1.22.1" expl="VC for wmpn_decr_1" proved="true">
    <proof prover="3"><result status="valid" time="0.02"/></proof>
    </goal>
-   <goal name="VC wmpn_decr_1.19.2" expl="VC for wmpn_decr_1" proved="true">
+   <goal name="VC wmpn_decr_1.22.2" expl="VC for wmpn_decr_1" proved="true">
    <proof prover="2"><result status="valid" time="0.12"/></proof>
    </goal>
-   <goal name="VC wmpn_decr_1.19.3" expl="VC for wmpn_decr_1" proved="true">
+   <goal name="VC wmpn_decr_1.22.3" expl="VC for wmpn_decr_1" proved="true">
    <proof prover="3"><result status="valid" time="0.02"/></proof>
    </goal>
-   <goal name="VC wmpn_decr_1.19.4" expl="VC for wmpn_decr_1" proved="true">
+   <goal name="VC wmpn_decr_1.22.4" expl="VC for wmpn_decr_1" proved="true">
    <proof prover="3"><result status="valid" time="0.02"/></proof>
    </goal>
-   <goal name="VC wmpn_decr_1.19.5" expl="VC for wmpn_decr_1" proved="true">
+   <goal name="VC wmpn_decr_1.22.5" expl="VC for wmpn_decr_1" proved="true">
    <proof prover="3"><result status="valid" time="0.02"/></proof>
    </goal>
   </transf>
   </goal>
-  <goal name="VC wmpn_decr_1.20" expl="loop variant decrease" proved="true">
-  <proof prover="3"><result status="valid" time="0.03"/></proof>
+  <goal name="VC wmpn_decr_1.23" expl="loop variant decrease" proved="true">
+  <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.21" expl="loop invariant preservation" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.04" steps="122"/></proof>
+  <goal name="VC wmpn_decr_1.24" expl="loop invariant preservation" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.04" steps="135"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.22" expl="loop invariant preservation" proved="true">
+  <goal name="VC wmpn_decr_1.25" expl="loop invariant preservation" proved="true">
   <proof prover="3"><result status="valid" time="0.03"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.23" expl="loop invariant preservation" proved="true">
+  <goal name="VC wmpn_decr_1.26" expl="loop invariant preservation" proved="true">
   <proof prover="3"><result status="valid" time="0.03"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.24" expl="loop invariant preservation" proved="true">
+  <goal name="VC wmpn_decr_1.27" expl="loop invariant preservation" proved="true">
   <proof prover="3"><result status="valid" time="0.02"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.25" expl="loop invariant preservation" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.03" steps="50"/></proof>
+  <goal name="VC wmpn_decr_1.28" expl="loop invariant preservation" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.03" steps="53"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.26" expl="loop invariant preservation" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.04" steps="66"/></proof>
+  <goal name="VC wmpn_decr_1.29" expl="loop invariant preservation" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.04" steps="69"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.27" expl="loop invariant preservation" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.02" steps="69"/></proof>
+  <goal name="VC wmpn_decr_1.30" expl="loop invariant preservation" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.02" steps="72"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.28" expl="assertion" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.02" steps="52"/></proof>
+  <goal name="VC wmpn_decr_1.31" expl="assertion" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.02" steps="56"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.29" expl="precondition" proved="true">
+  <goal name="VC wmpn_decr_1.32" expl="precondition" proved="true">
   <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.30" expl="precondition" proved="true">
+  <goal name="VC wmpn_decr_1.33" expl="precondition" proved="true">
   <proof prover="3"><result status="valid" time="0.01"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.31" expl="precondition" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.04" steps="131"/></proof>
+  <goal name="VC wmpn_decr_1.34" expl="precondition" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.02" steps="152"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.32" expl="assertion" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.02" steps="55"/></proof>
+  <goal name="VC wmpn_decr_1.35" expl="assertion" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.02" steps="58"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.33" expl="assertion" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.09" steps="112"/></proof>
+  <goal name="VC wmpn_decr_1.36" expl="assertion" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.08" steps="131"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.34" expl="precondition" proved="true">
+  <goal name="VC wmpn_decr_1.37" expl="precondition" proved="true">
   <proof prover="3"><result status="valid" time="0.01"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.35" expl="precondition" proved="true">
+  <goal name="VC wmpn_decr_1.38" expl="precondition" proved="true">
   <proof prover="3"><result status="valid" time="0.02"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.36" expl="assertion" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.03" steps="42"/></proof>
+  <goal name="VC wmpn_decr_1.39" expl="assertion" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.03" steps="45"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.37" expl="integer overflow" proved="true">
+  <goal name="VC wmpn_decr_1.40" expl="integer overflow" proved="true">
   <proof prover="3"><result status="valid" time="0.20"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.38" expl="assertion" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.04" steps="47"/></proof>
+  <goal name="VC wmpn_decr_1.41" expl="assertion" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.04" steps="50"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.39" expl="loop variant decrease" proved="true">
-  <proof prover="3"><result status="valid" time="0.04"/></proof>
+  <goal name="VC wmpn_decr_1.42" expl="loop variant decrease" proved="true">
+  <proof prover="3"><result status="valid" time="0.03"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.40" expl="loop invariant preservation" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.08" steps="122"/></proof>
+  <goal name="VC wmpn_decr_1.43" expl="loop invariant preservation" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.08" steps="135"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.41" expl="loop invariant preservation" proved="true">
+  <goal name="VC wmpn_decr_1.44" expl="loop invariant preservation" proved="true">
   <proof prover="3"><result status="valid" time="0.03"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.42" expl="loop invariant preservation" proved="true">
+  <goal name="VC wmpn_decr_1.45" expl="loop invariant preservation" proved="true">
   <proof prover="3"><result status="valid" time="0.03"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.43" expl="loop invariant preservation" proved="true">
+  <goal name="VC wmpn_decr_1.46" expl="loop invariant preservation" proved="true">
   <proof prover="3"><result status="valid" time="0.02"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.44" expl="loop invariant preservation" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.03" steps="50"/></proof>
+  <goal name="VC wmpn_decr_1.47" expl="loop invariant preservation" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.03" steps="53"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.45" expl="loop invariant preservation" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.04" steps="66"/></proof>
+  <goal name="VC wmpn_decr_1.48" expl="loop invariant preservation" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.04" steps="69"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.46" expl="loop invariant preservation" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.02" steps="69"/></proof>
+  <goal name="VC wmpn_decr_1.49" expl="loop invariant preservation" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.02" steps="72"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.47" expl="precondition" proved="true">
+  <goal name="VC wmpn_decr_1.50" expl="precondition" proved="true">
   <proof prover="3"><result status="valid" time="0.02"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.48" expl="precondition" proved="true">
+  <goal name="VC wmpn_decr_1.51" expl="precondition" proved="true">
   <proof prover="3"><result status="valid" time="0.02"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.49" expl="assertion" proved="true">
+  <goal name="VC wmpn_decr_1.52" expl="assertion" proved="true">
   <transf name="split_vc" proved="true" >
-   <goal name="VC wmpn_decr_1.49.0" expl="assertion" proved="true">
+   <goal name="VC wmpn_decr_1.52.0" expl="assertion" proved="true">
    <proof prover="3"><result status="valid" time="0.03"/></proof>
    </goal>
-   <goal name="VC wmpn_decr_1.49.1" expl="assertion" proved="true">
+   <goal name="VC wmpn_decr_1.52.1" expl="assertion" proved="true">
    <proof prover="3"><result status="valid" time="0.02"/></proof>
    </goal>
-   <goal name="VC wmpn_decr_1.49.2" expl="VC for wmpn_decr_1" proved="true">
+   <goal name="VC wmpn_decr_1.52.2" expl="VC for wmpn_decr_1" proved="true">
    <proof prover="0" memlimit="1000"><result status="valid" time="0.02"/></proof>
-   <proof prover="5"><result status="valid" time="0.02" steps="44"/></proof>
+   <proof prover="5"><result status="valid" time="0.02" steps="47"/></proof>
    </goal>
-   <goal name="VC wmpn_decr_1.49.3" expl="VC for wmpn_decr_1" proved="true">
+   <goal name="VC wmpn_decr_1.52.3" expl="VC for wmpn_decr_1" proved="true">
    <proof prover="3"><result status="valid" time="0.01"/></proof>
    </goal>
   </transf>
   </goal>
-  <goal name="VC wmpn_decr_1.50" expl="precondition" proved="true">
+  <goal name="VC wmpn_decr_1.53" expl="precondition" proved="true">
   <proof prover="3"><result status="valid" time="0.03"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.51" expl="postcondition" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.03" steps="26"/></proof>
+  <goal name="VC wmpn_decr_1.54" expl="postcondition" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.03" steps="29"/></proof>
   </goal>
-  <goal name="VC wmpn_decr_1.52" expl="postcondition" proved="true">
-  <proof prover="5" timelimit="1"><result status="valid" time="0.06" steps="40"/></proof>
+  <goal name="VC wmpn_decr_1.55" expl="postcondition" proved="true">
+  <proof prover="5" timelimit="1"><result status="valid" time="0.06" steps="43"/></proof>
   </goal>
  </transf>
  </goal>
diff --git a/examples/multiprecision/sub/why3shapes.gz b/examples/multiprecision/sub/why3shapes.gz
index 3e4c07b501028d1a2a6dd5af197f3df5b5078f0b..0c5a3993247b0f8aab4ae1f7405e1888f5884129 100644
Binary files a/examples/multiprecision/sub/why3shapes.gz and b/examples/multiprecision/sub/why3shapes.gz differ
diff --git a/examples/multiprecision/toom.mlw b/examples/multiprecision/toom.mlw
index 1e93e4b6d95e8e610caeca2a57e7d8ea83c648d7..d673b166e44705213b609aab79cdf61e9a11dff0 100644
--- a/examples/multiprecision/toom.mlw
+++ b/examples/multiprecision/toom.mlw
@@ -857,9 +857,9 @@ with toom32_mul (r x y scratch: ptr limb) (sx sy:int32) (ghost k: int) : unit
                        -> (pelts scratch)[j] = old (pelts scratch)[j] }
   variant { k + k }
 =
-  let n  = 1 + (if 2 * sx >= 3 * sy
-                then Int32.(/) (sx - 1) 3
-                else Int32.(/) (sy - 1) 2) in
+  let n = 1 + (if 2 * sx >= 3 * sy
+               then Int32.(/) (sx - 1) 3
+               else Int32.(/) (sy - 1) 2) in
   let s = sx - 2 * n in
   let t = sy - n in
   assert { 0 < s <= n };
diff --git a/src/mlw/cprinter.ml b/src/mlw/cprinter.ml
index 48a9974c6ddb6db19229fa504e41f7c22b632412..319ac4ab1987ebbb33ed22d1c40e689dc314534c 100644
--- a/src/mlw/cprinter.ml
+++ b/src/mlw/cprinter.ml
@@ -327,9 +327,12 @@ module C = struct
     | Sexpr _ -> true
     | _ -> false
 
-  let simplify_expr (d,s) : expr =
+  let rec simplify_expr (d,s) : expr =
     match (d,s) with
+    | [], Sblock([],s) -> simplify_expr ([],s)
     | [], Sexpr e -> e
+    | [], Sif(c,t,e) ->
+       Equestion (c, simplify_expr([],t), simplify_expr([],e))
     | _ -> raise (Invalid_argument "simplify_expr")
 
   let rec simplify_cond (cd, cs) =
@@ -459,6 +462,9 @@ module Print = struct
     | Ecast(ty, e) ->
       fprintf fmt (protect_on paren "(%a)%a")
         (print_ty ~paren:false) ty (print_expr ~paren:true) e
+    | Ecall (Esyntax (s, _, _, [], _), l) -> (* function defined in the prelude *)
+       fprintf fmt (protect_on paren "%s(%a)")
+         s (print_list comma (print_expr ~paren:false)) l
     | Ecall (e,l) -> fprintf fmt (protect_on paren "%a(%a)")
       (print_expr ~paren:true) e (print_list comma (print_expr ~paren:false)) l
     | Econst c -> print_const fmt c
@@ -754,6 +760,7 @@ module MLToC = struct
       let e = C.(Econst (Cint (BigInt.to_string n))) in
       ([], return_or_expr env e)
     | Eapp (rs, el) ->
+       Debug.dprintf debug_c_extraction "call to %s@." rs.rs_name.id_string;
        if is_rs_tuple rs && env.computes_return_value
        then begin
 	 let args =
@@ -1063,53 +1070,55 @@ module MLToC = struct
 
   let translate_decl (info:info) (d:decl) : C.definition list
     =
+    let translate_fun rs vl e =
+      Debug.dprintf debug_c_extraction "print %s@." rs.rs_name.id_string;
+      if rs_ghost rs
+      then begin Debug.dprintf debug_c_extraction "is ghost@."; [] end
+      else
+        let params =
+          List.map (fun (id, ty, _gh) -> (ty_of_mlty info ty, id))
+            (List.filter (fun (_,_, gh) -> not gh) vl) in
+        let params = List.filter (fun (ty, _) -> ty <> C.Tvoid) params in
+	let env = { computes_return_value = true;
+		    in_unguarded_loop = false;
+                    current_function = rs;
+		    returns = Sid.empty;
+		    breaks = Sid.empty; } in
+	let rity = rs.rs_cty.cty_result in
+	let is_simple_tuple ity =
+	  let arity_zero = function
+	    | Ityapp(_,a,r) -> a = [] && r = []
+	    | Ityreg { reg_args = a; reg_regs = r } ->
+               a = [] && r = []
+	    | Ityvar _ -> true
+	  in
+	  (match ity.ity_node with
+	   | Ityapp ({its_ts = s},_,_)
+             | Ityreg { reg_its = {its_ts = s}; }
+	     -> is_ts_tuple s
+	   | _ -> false)
+	  && (ity_fold
+                (fun acc ity ->
+                  acc && arity_zero ity.ity_node) true ity)
+	in
+	(* FIXME is it necessary to have arity 0 in regions ?*)
+	let rtype = ty_of_ty info (ty_of_ity rity) in
+        let rtype,sdecls =
+          if rtype=C.Tnosyntax && is_simple_tuple rity
+          then
+            let st = struct_of_rs info rs in
+            C.Tstruct st, [C.Dstruct st]
+          else rtype, [] in
+	let d,s = expr info env e in
+        (*TODO check if we want this flatten*)
+	let d,s = C.flatten_defs d s in
+        let d = C.group_defs_by_type d in
+	let s = C.elim_nop s in
+	let s = C.elim_empty_blocks s in
+	sdecls@[C.Dfun (rs.rs_name, (rtype,params), (d,s))] in
     try
       begin match d with
-      | Dlet (Lsym(rs, _, vl, e)) ->
-         if rs_ghost rs
-         then begin Debug.dprintf debug_c_extraction "is ghost@."; [] end
-         else
-           let params =
-             List.map (fun (id, ty, _gh) -> (ty_of_mlty info ty, id))
-               (List.filter (fun (_,_, gh) -> not gh) vl) in
-           let params = List.filter (fun (ty, _) -> ty <> C.Tvoid) params in
-	   let env = { computes_return_value = true;
-		       in_unguarded_loop = false;
-                       current_function = rs;
-		       returns = Sid.empty;
-		       breaks = Sid.empty; } in
-	   let rity = rs.rs_cty.cty_result in
-	   let is_simple_tuple ity =
-	     let arity_zero = function
-	       | Ityapp(_,a,r) -> a = [] && r = []
-	       | Ityreg { reg_args = a; reg_regs = r } ->
-                  a = [] && r = []
-	       | Ityvar _ -> true
-	     in
-	     (match ity.ity_node with
-	      | Ityapp ({its_ts = s},_,_)
-                | Ityreg { reg_its = {its_ts = s}; }
-		-> is_ts_tuple s
-	      | _ -> false)
-	     && (ity_fold
-                   (fun acc ity ->
-                     acc && arity_zero ity.ity_node) true ity)
-	   in
-	   (* FIXME is it necessary to have arity 0 in regions ?*)
-	   let rtype = ty_of_ty info (ty_of_ity rity) in
-           let rtype,sdecls =
-             if rtype=C.Tnosyntax && is_simple_tuple rity
-             then
-               let st = struct_of_rs info rs in
-               C.Tstruct st, [C.Dstruct st]
-             else rtype, [] in
-	   let d,s = expr info env e in
-           (*TODO check if we want this flatten*)
-	   let d,s = C.flatten_defs d s in
-           let d = C.group_defs_by_type d in
-	   let s = C.elim_nop s in
-	   let s = C.elim_empty_blocks s in
-	   sdecls@[C.Dfun (rs.rs_name, (rtype,params), (d,s))]
+      | Dlet (Lsym(rs, _, vl, e)) -> translate_fun rs vl e
       | Dtype [{its_name=id; its_def=idef}] ->
          Debug.dprintf debug_c_extraction "PDtype %s@." id.id_string;
          begin
@@ -1125,7 +1134,15 @@ module MLToC = struct
                            ^id.id_string))
               end
          end
-
+      | Dlet (Lrec rl) ->
+         let translate_rdef rd =
+           translate_fun rd.rec_sym rd.rec_args rd.rec_exp in
+         let defs = List.flatten (List.map translate_rdef rl) in
+         let proto_of_fun = function
+           | C.Dfun (id, pr, _) -> [C.Dproto (id, pr)]
+           | _ -> [] in
+         let protos = List.flatten (List.map proto_of_fun defs) in
+       protos@defs
       | _ -> [] (*TODO exn ? *) end
     with Unsupported s ->
       Debug.dprintf debug_c_extraction "Unsupported : %s@." s; []
@@ -1133,16 +1150,9 @@ module MLToC = struct
   let translate_decl (info:info) (d:Mltree.decl) : C.definition list
     =
     let decide_print id = query_syntax info.syntax id = None in
-    match Mltree.get_decl_name d with
-    | [id] when decide_print id ->
-       Debug.dprintf debug_c_extraction "print %s@." id.id_string;
-       translate_decl info d
-    | [_] | [] -> []
-    | l -> Debug.dprintf debug_c_extraction "%d defs: %a@."
-             (List.length l)
-             (Pp.print_list Pp.space Pretty.print_id_attrs) l;
-           []
-
+    match List.filter decide_print (Mltree.get_decl_name d) with
+    | [] -> []
+    | _ -> translate_decl info d
 
 end