diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f27809a2c512f0e9e41bac352104fd0197a30e0d..07877a1ee98ab6bc2ab2f1a465cd25465a238be9 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -184,25 +184,10 @@ internal_nightly:
   tags:
    - nix
 
-frama-c-ocaml-4.09:
-  variables:
-    OCAML: "4_09"
-  <<: *frama-c-ocaml
-  only:
-  - schedules
-
-frama-c-ocaml-4.12:
-  variables:
-    OCAML: "4_12"
-  <<: *frama-c-ocaml
-
-# check compatibility with future OCaml version
 frama-c-ocaml-4.13:
   variables:
     OCAML: "4_13"
   <<: *frama-c-ocaml
-  allow_failure: true
-
 
 caveat-importer:
   stage: tests
diff --git a/headers/header_spec.txt b/headers/header_spec.txt
index c77ac35916f2a607fe15fddb2a9b7803144a24f8..4397a53ffb823e5f3b17f17261cd7ab30b86e436 100644
--- a/headers/header_spec.txt
+++ b/headers/header_spec.txt
@@ -1738,6 +1738,8 @@ src/plugins/wp/TacBittest.ml: CEA_WP
 src/plugins/wp/TacBittest.mli: CEA_WP
 src/plugins/wp/TacChoice.ml: CEA_WP
 src/plugins/wp/TacChoice.mli: CEA_WP
+src/plugins/wp/TacClear.ml: CEA_WP
+src/plugins/wp/TacClear.mli: CEA_WP
 src/plugins/wp/TacCongruence.ml: CEA_WP
 src/plugins/wp/TacCongruence.mli: CEA_WP
 src/plugins/wp/TacCompound.ml: CEA_WP
diff --git a/ptests/ptests.ml b/ptests/ptests.ml
index 6ea8fbd5ec4f6ff0ee0c1d75713d3c3c48bf674c..0908d3a500eab8e128bfb294e5da371107a2f536 100644
--- a/ptests/ptests.ml
+++ b/ptests/ptests.ml
@@ -157,11 +157,25 @@ let print_default_env fmt =
     List.iter (fun (x,y) -> Format.fprintf fmt "%s = \"%s\"@\n"  x y) l;
     Format.fprintf fmt "@]"
 
-let default_env var value =
+let get_default_env var value =
   try
     let v = Unix.getenv var in
-    add_default_env (var ^ " (set from outside)") v
-  with Not_found -> add_env var value
+    add_default_env (var ^ " (set from outside)") v;
+    v
+  with Not_found -> add_env var value ; value
+
+let default_env var value = ignore (get_default_env var value)
+
+let get_default_env_of_int var value =
+  try
+    int_of_string (get_default_env var (string_of_int value))
+  with _ -> value
+
+(* 0 -> no change
+   1 -> apply a filter (about pathname) to prepare oracles
+   2 -> run tests from result directories (except make command)
+*)
+let dune_mode = ref (get_default_env_of_int "PTEST_DUNE_MODE" 0)
 
 (** the name of the directory-wide configuration file*)
 let dir_config_file = "test_config"
@@ -218,6 +232,36 @@ let unlink ?(silent = true) file =
   | Unix_error (ENOENT,_,_) -> () (* Ignore "No such file or directory" *)
   | Unix_error _ as e -> output_unix_error e
 
+let fail s =
+  Format.printf "Error: %s@." s;
+  exit 2
+
+let is_nonexisting_link filename =
+  let open Unix in
+  try
+    match (lstat filename).st_kind with
+    | S_LNK -> false
+    | _ -> fail ("Existing result file with the same name than one in the upper directory:" ^ filename)
+  with
+  | Unix_error (UnixLabels.ENOENT, _, _) -> (* file does not exist *)
+    true
+  | Unix_error _ as e ->
+    output_unix_error e;
+    raise e
+
+let is_nonexisting_file filename =
+  let open Unix in
+  try
+    match (lstat filename).st_kind with
+    | S_REG -> false
+    | _ -> fail ("Existing result file with the same name than one in the upper directory:" ^ filename)
+  with
+  | Unix_error (UnixLabels.ENOENT, _, _) -> (* file does not exist *)
+    true
+  | Unix_error _ as e ->
+    output_unix_error e;
+    raise e
+
 let is_file_empty_or_nonexisting filename =
   let open Unix in
   try
@@ -238,7 +282,9 @@ let base_path = Filename.current_dir_name
 (** Command-line flags *)
 
 type behavior = Examine | Update | Run | Show | Gui
-let behavior = ref Run
+let behavior = ref (if 1 = (get_default_env_of_int "PTEST_UPDATE" 0)
+                    then Update else Run)
+
 let verbosity = ref 0
 let dry_run = ref false
 let use_byte = ref false
@@ -251,7 +297,7 @@ let do_make = ref "make"
 let n = ref 4    (* the level of parallelism *)
 
 (** special configuration, with associated oracles *)
-let special_config = ref ""
+let special_config = ref (get_default_env "PTEST_CONFIG" "")
 let do_error_code = ref false
 
 let xunit = ref false
@@ -307,7 +353,8 @@ let example_msg =
      # NB: a dependency to the included files can be added with this directive.@ \
      # That is not necessary for files mentioned into the command or options when using the %%{dep:<file>} feature of dune.@]@  \
      LOG: <file>...       @[<v 0># Defines targets built by the next sub-test command.@]@  \
-     CMD: <command>       @[<v 0># Defines the command to execute for all tests in order to get results to be compared to oracles.@]@  \
+     CMD: <command>       @[<v 0># Defines the command to execute for all tests in order to get results to be compared to oracles.@ \
+     # NB: the dune feature %%{bin:tool} has to be used to access to a tool of the binary directory of Frama-C.@]@  \
      OPT: <options>       @[<v 0># Defines a sub-test using the 'CMD' definition: <command> <options>@]@  \
      STDOPT: -\"<extra>\"   @[<v 0># Defines a sub-test and remove the extra from the current option.@ \
      # NB: current version does not allow to remove a multiple-extra-argument.@]@  \
@@ -320,7 +367,7 @@ let example_msg =
      # An empty command drops the previous FILTER directives.@ \
      # NB: in such a command, the @@PTEST_ORACLE@@ macro is set to the basename of the oracle.@ \
      # This allows running a 'diff' command with the oracle of another test configuration:@ \
-     #    FILTER: diff --new-file @@PTEST_DIR@@/oracle_configuration/@@PTEST_ORACLE@@ @]@  \
+     #    FILTER: diff --new-file @@PTEST_SUITE_DIR@@/oracle_configuration/@@PTEST_ORACLE@@ @]@  \
      TIMEOUT: <delay>     @[<v 0># Set a timeout for all sub-test.@]@  \
      NOFRAMAC:            @[<v 0># Drops previous sub-test definitions and considers that there is no defined default sub-test.@]@  \
      GCC:                 @[<v 0># Deprecated.@]@  \
@@ -334,18 +381,20 @@ let example_msg =
      @]@ \
      @[<v 1>\
      Some predefined macros can be used in test commands:@ \
-     @@PTEST_DIR@@          # Dirname of the test file.@ \
+     @@PTEST_DIR@@          # Path to the test file from the execution directory (depends from -dune-mode option).@ \
      @@PTEST_FILE@@         # Substituted by the test filename.@ \
      @@PTEST_NAME@@         # Basename of the test file.@ \
      @@PTEST_NUMBER@@       # Test command number.@ \
      @@PTEST_CONFIG@@       # Test configuration suffix.@ \
-     @@PTEST_RESULT@@       # Shorthand alias to '@@PTEST_DIR@@/result@@PTEST_CONFIG@@' (the result directory dedicated to the tested configuration).@ \
+     @@PTEST_SUITE_DIR@@    # Path to the directory contained the source of the test file (depends from -dune-mode option).@ \
+     @@PTEST_RESULT@@       # Shorthand alias to '@@PTEST_SUITE_DIR@@/result@@PTEST_CONFIG@@' (the result directory dedicated to the tested configuration).@ \
      @@PTEST_ORACLE@@       # Basename of the current oracle file (macro only usable in FILTER directives).@ \
      @@PTEST_DEPS@@         # Current list of dependencies defined by the DEPS directive.@ \
      @@PTEST_LIBS@@         # Current list of modules defined by the LIBS directive.@ \
      @@PTEST_MODULE@@       # Current list of modules defined by the MODULE directive.@ \
      @@PTEST_PLUGIN@@       # Current list of plugins defined by the PLUGIN directive.@ \
      @@PTEST_SCRIPT@@       # Current list of ML scripts defined by the SCRIPT directive.@ \
+     @@PTEST_SHARE_DIR@@    # Shorthand alias to '@@PTEST_SUITE_DIR@@/../../share (the share directory related to the test suite).@ \
      @]@ \
      Other macros can only be used in test commands (CMD and EXECNOW directives):@  \
      @@PTEST_DEFAULT_OPTIONS@@  # The default option list: %s@  \
@@ -392,7 +441,8 @@ let rec argspec =
       ) ,
     " Start the tests in Frama-C's gui.";
     "-update", Arg.Unit (fun () -> behavior := Update) ,
-    " Take the current logs as oracles.";
+    " Take the current logs as oracles. \
+     \n   NB: the default value can be modified in setting the environment variable PTEST_UPDATE to 1";
     "-show", Arg.Unit (fun () -> behavior := Show) ,
     " Show the results of the tests.";
     "-run", Arg.Unit (fun () -> behavior := Run) ,
@@ -423,7 +473,8 @@ let rec argspec =
     "-opt", Arg.Clear use_byte,
     " Use native toplevel (default)";
     "-config", Arg.Set_string special_config,
-    " <name> Use special configuration and oracles";
+    " <name> Use special configuration and oracles \
+     \n   NB: the default value can be modified in setting the environment variable PTEST_CONFIG";
     "-add-options", Arg.Set_string macro_post_options,
     "<options> Add additional options to be passed to the toplevels \
      that will be launched. <options> are added after standard test options";
@@ -438,6 +489,12 @@ let rec argspec =
     " Create a xUnit file named xunit.xml collecting results";
     "-error-code", Arg.Set do_error_code,
     " Exit with error code 1 if tests failed (useful for scripts)";
+    "-dune-mode", Arg.Set_int dune_mode,
+    " <mode> Run test commands: \
+     \n   0 -> from the plugin or frama-c directory \
+     \n   1 -> same as mode 0 with some extra ptest directives giving results closer to those obtained with the mode 2 \
+     \n   2 -> from the result directories of the current configuration \
+     \n   NB: the default value can be modified in setting the environment variable PTEST_DUNE_MODE";
   ]
 and help_msg () = Arg.usage (Arg.align argspec) umsg;;
 
@@ -451,10 +508,6 @@ let () =
      ) @ ["", Arg.Unit (fun () -> ()), example_msg;])
     make_test_suite umsg
 
-let fail s =
-  Format.printf "Error: %s@." s;
-  exit 2
-
 (** split the filename into before including "tests" dir and after including "tests" dir
     NOTA: both part contains "tests" (one as suffix the other as prefix).
 *)
@@ -623,6 +676,49 @@ end = struct
 
 end
 
+let mk_symbolic_link =
+  let symlink = match !dune_mode with
+    | 0 | 1 -> fun ~unlink ~to_dir ~link_dst:_ ~link ->
+      if unlink then begin
+        if !verbosity >= 4 then lock_printf "removing symbolic link %s/%s@." (Unix.getcwd ()) link;
+        Unix.unlink link;
+      end
+    | _ -> fun ~unlink ~to_dir ~link_dst ~link ->
+      if !verbosity >= 4 then lock_printf "creating symbolic link %s/%s -> %s@." (Unix.getcwd ()) link link_dst;
+      if unlink then
+        Unix.unlink link;
+      Unix.symlink ~to_dir link_dst link
+  in
+  let symlink_there = match !dune_mode with
+    | 0 | 1 -> fun ~link ->
+      if !verbosity >= 4 then lock_printf "removing symbolic link %s/%s@." (Unix.getcwd ()) link;
+      Unix.unlink link
+    | _ -> fun ~link:_ -> ()
+  in
+  let regexp_ignored_dir = Str.regexp "^\\(result\\|oracle\\)" in
+  if not (Unix.has_symlink ()) then
+    fail "unable to create symbolic links!";
+  fun directory file ->
+    let dst = SubDir.make_file directory file in
+    let infos = Unix.stat dst in
+    let link = SubDir.make_result_file directory file in
+    let link_dst = "../" ^ file in
+    let mk_symlink ~to_dir =
+      if is_nonexisting_link link then (* not there *)
+        symlink ~unlink:false ~to_dir ~link_dst ~link
+      else if String.(link_dst <> (Unix.readlink link)) then (* goes elsewhere *)
+        symlink ~unlink:true ~to_dir ~link_dst ~link
+      else symlink_there link (* is already there *)
+    in
+    match infos.st_kind with
+    | Unix.S_LNK
+    | Unix.S_REG ->
+      mk_symlink ~to_dir:false
+    | Unix.S_DIR ->
+      if str_string_match regexp_ignored_dir file 0 then ()
+      else mk_symlink ~to_dir:true
+    | _ -> ()
+
 type does_expand = {
   has_ptest_file : bool;
   has_ptest_opt : bool;
@@ -733,6 +829,7 @@ end
 type execnow =
   {
     ex_cmd: string;      (** command to launch *)
+    ex_make_cmd: bool;   (** is it a make command *)
     ex_macros: Macros.t; (** current macros *)
     ex_log: string list; (** log files *)
     ex_bin: string list; (** bin files *)
@@ -752,6 +849,7 @@ type execnow =
 (** configuration of a directory/test. *)
 type cmd = {
   toplevel: string;
+  make_cmd: bool;   (** is it a make command *)
   opts: string;
   macros: Macros.t;
   exit_code: string option;
@@ -812,6 +910,16 @@ let launch command_string =
 
 let dev_null = if Sys.os_type = "Win32" then "NUL" else "/dev/null"
 
+let default_filter = match !dune_mode with
+  | 1 -> Some "sed -e \"s| share/| FRAMAC_SHARE/|g; s|@PTEST_DIR@/||g; s|result@PTEST_CONFIG@/||g\""
+  | _ -> None
+
+let log_default_filter = match default_filter with
+  | Some filter ->
+    let redirection = Str.regexp " > " in
+    fun s -> str_global_replace redirection (" | " ^ filter ^ " > ") s
+  | None -> fun s -> s
+
 module Test_config: sig
   val scan_directives: drop:bool ->
     SubDir.t -> file:string -> Scanf.Scanning.in_channel -> config -> config
@@ -819,13 +927,18 @@ module Test_config: sig
   val scan_test_file: config -> SubDir.t -> string -> config
 end = struct
 
+  let default_options =
+    match !dune_mode with
+    | 0 -> !macro_default_options
+    | _ -> !macro_default_options ^ " -add-symbolic-path $FRAMAC_SESSION:."
+
   let default_macros () =
     let l = [
       "frama-c-exe",  !toplevel_path;
       "frama-c-cmd",  !macro_frama_c_cmd;
       "frama-c",      !macro_frama_c;
       "DEV_NULL",     dev_null;
-      "PTEST_DEFAULT_OPTIONS",  !macro_default_options;
+      "PTEST_DEFAULT_OPTIONS",  default_options;
       "PTEST_OPTIONS",          !macro_options;
       "PTEST_PRE_OPTIONS",      !macro_pre_options;
       "PTEST_POST_OPTIONS",     !macro_post_options;
@@ -843,10 +956,10 @@ end = struct
     { dc_test_regexp = test_file_regexp ;
       dc_macros = default_macros ();
       dc_execnow = [];
-      dc_filter = None ;
+      dc_filter = default_filter ;
       dc_exit_code = None;
       dc_default_toplevel = !default_toplevel;
-      dc_commands = [ { toplevel= !default_toplevel; opts=""; macros=Macros.empty; exit_code=None; logs= []; timeout= ""} ];
+      dc_commands = [ { toplevel= !default_toplevel; make_cmd=false; opts=""; macros=Macros.empty; exit_code=None; logs= []; timeout= ""} ];
       dc_dont_run = false;
       dc_load_module = "";
       dc_load_libs = "";
@@ -868,7 +981,7 @@ end = struct
              aux { s with ex_cmd = cmd; ex_log = name :: s.ex_log })
       with Scanf.Scan_failure _ ->
       try
-        Scanf.sscanf s.ex_cmd "%_[ ]BIN%_[ ]%[A-Za-z0-9_.\\-@@]%_[ ]%s@\n"
+        Scanf.sscanf s.ex_cmd "%_[ ]BIN%_[ ]%[-A-Za-z0-9_.\\@@]%_[ ]%s@\n"
           (fun name cmd ->
              aux { s with ex_cmd = cmd; ex_bin = name :: s.ex_bin })
       with Scanf.Scan_failure _ ->
@@ -877,7 +990,11 @@ end = struct
           (fun cmd ->
              (* It should be better to use a specific macro into the command (such as @MAKE@) for that. *)
              let s = aux ({ s with ex_cmd = cmd; }) in
-             let r = { s with ex_cmd = !do_make^" "^cmd; } in
+             let r = { s with
+                       ex_cmd = !do_make^" "^cmd;
+                       ex_make_cmd = true
+                     }
+             in
              if warn then
                Format.eprintf "%s: EXEC%s directive with a make command (DEPRECATED): %s@."
                  file (if once then "NOW" else "") r.ex_cmd;
@@ -887,6 +1004,7 @@ end = struct
     in
     let execnow = aux
         { ex_cmd = s;
+          ex_make_cmd = false;
           ex_macros;
           ex_log = [];
           ex_bin = [];
@@ -974,12 +1092,17 @@ end = struct
         current
       end
 
+  let update_make_module_name s =
+    let s = (Filename.remove_extension s) ^ (if !use_byte then ".cmo" else ".cmxs") in
+    if "." = Filename.dirname s then "@PTEST_MAKE_DIR@/" ^  s else s
+
   let update_module_libs_name s =
-    "@PTEST_DIR@/" ^ (Filename.remove_extension s) ^ (if !use_byte then ".cmo" else ".cmxs")
+    let s = (Filename.remove_extension s) ^ (if !use_byte then ".cmo" else ".cmxs") in
+    if "." = Filename.dirname s then "@PTEST_SUITE_DIR@/" ^  s else s
 
   let add_make_modules ~file dir deps current =
     let deps,current = List.fold_left (fun ((deps,curr) as acc) s ->
-        let s = update_module_libs_name s in
+        let s = update_make_module_name s in
         if StringSet.mem s curr.dc_cmxs_module then acc
         else
           (deps ^ " " ^ s),
@@ -1004,7 +1127,8 @@ end = struct
     { current with dc_macros }
 
   let update_script_name s =
-    "@PTEST_DIR@/" ^ (Filename.remove_extension s) ^ ".ml"
+    let s = (Filename.remove_extension s) ^ ".ml" in
+    if "." = Filename.dirname s then "@PTEST_DIR@/" ^  s else s
 
   let update_module_macros =
     update_macros update_module_libs_name "-load-module=" "PTEST_MODULE" "PTEST_LOAD_MODULE"
@@ -1052,6 +1176,7 @@ end = struct
          let s = Macros.expand_directive ~file current.dc_macros s in
          let t =
            { toplevel= current.dc_default_toplevel;
+             make_cmd = false;
              opts= s;
              logs= current.dc_default_log;
              exit_code= current.dc_exit_code;
@@ -1073,6 +1198,7 @@ end = struct
            List.map
              (fun command ->
                 { toplevel = current.dc_default_toplevel;
+                  make_cmd = false;
                   opts= make_custom_opts ~file command.opts s;
                   logs= command.logs @ current.dc_default_log;
                   macros= current.dc_macros;
@@ -1253,6 +1379,7 @@ type toplevel_command =
     nb_files : int ;
     options : string ;
     toplevel: string ;
+    make_cmd: bool ;
     filter : string option ;
     exit_code : int ;
     directory : SubDir.t ;
@@ -1322,12 +1449,20 @@ let lock () = Mutex.lock shared.lock
 let update_log_files dir file =
   mv (SubDir.make_result_file dir file) (SubDir.make_oracle_file dir file)
 
+let dune_feature_cmd = (* removes dune feature such as %{deps:...} *)
+  let dune_cmd_features = Str.regexp "%{[a-z][a-z-]*:\\([^}]*\\)}" in
+  let dune_bin_features = Str.regexp "%{bin:\\([^}]*\\)}" in
+  let dune_bin_subst = (Filename.dirname !toplevel_path) ^ "/\\1" in
+  fun cmd ->
+    let cmd = str_global_replace dune_bin_features dune_bin_subst cmd in
+    str_global_replace dune_cmd_features "\\1" cmd
+
 module Cmd : sig
 
   val log_prefix : toplevel_command -> string
   val oracle_prefix : toplevel_command -> string
 
-  val expand_macros : defaults:Macros.t -> toplevel_command -> toplevel_command
+  val expand_macros : execnow:bool -> defaults:Macros.t -> toplevel_command -> toplevel_command
 
   (* [basic_command_string cmd] does not redirect the outputs, and does
      not overwrite the result files *)
@@ -1337,6 +1472,10 @@ module Cmd : sig
 
   val update_toplevel_command : toplevel_command -> unit
 
+  val get_ptest_dir : toplevel_command -> string
+
+  val remove_results : toplevel_command -> unit
+
 end = struct
 
   let catenate_number nb_files prefix n =
@@ -1359,78 +1498,99 @@ end = struct
   let log_prefix = gen_prefix SubDir.make_result_file
   let oracle_prefix = gen_prefix SubDir.make_oracle_file
 
-  let get_ptest_file cmd = SubDir.make_file cmd.directory cmd.file
+  let get_ptest_file = match !dune_mode with
+    | 0 | 1 -> fun cmd -> SubDir.make_file cmd.directory cmd.file
+    | _ -> fun cmd -> Filename.basename cmd.file
+
+  let get_ptest_dir = match !dune_mode with
+    | 0 | 1 -> fun cmd -> SubDir.get cmd.directory
+    | _ -> fun _ -> "."
+
+  let get_ptest_suite_dir = match !dune_mode with
+    | 0 | 1 -> fun cmd -> SubDir.get cmd.directory
+    | _ -> fun _ -> ".."
+
+  let ptest_share_dir = match !dune_mode with
+    | 0 | 1 -> "./share"
+    | _ -> "../../../share"
+
+  let get_ptest_result = match !dune_mode with
+    | 0 | 1 ->  fun cmd -> SubDir.get cmd.directory ^ "/" ^ SubDir.result_dirname
+    | _ -> fun _ -> "."
+
+  let get_ptest_toplevel = match !dune_mode with
+    | 0 | 1 -> fun _ s -> s
+    | _ -> fun cmd s ->
+      if cmd.make_cmd then s
+      else Format.sprintf "(cd %s && (%s))" (SubDir.make_result_file cmd.directory "") s
 
   let expand_macros =
-    let dune_cmd_features = Str.regexp "%{[a-z][a-z-]*:\\([^}]*\\)}" in
-    let dune_bin_features = Str.regexp "%{bin:\\([^}]*\\)}" in
-    let dune_bin_subst = (Filename.dirname !toplevel_path) ^ "/\\1" in
-    fun ~defaults cmd ->
-      let ptest_config =
-        if !special_config = "" then "" else "_" ^ !special_config
-      in
-      let ptest_file = get_ptest_file cmd in
-      let ptest_name =
-        try Filename.chop_extension cmd.file
-        with Invalid_argument _ -> cmd.file
-      in
-      let ptest_file = Filename.sanitize ptest_file in
-      let ptest_load_plugin = Macros.get "PTEST_LOAD_PLUGIN" cmd.macros in
-      let ptest_load_module = Macros.get "PTEST_LOAD_MODULE" cmd.macros in
-      let ptest_load_libs = Macros.get "PTEST_LOAD_LIBS" cmd.macros in
-      let ptest_load_script = Macros.get "PTEST_LOAD_SCRIPT" cmd.macros in
-      let macros =
-        [ "PTEST_CONFIG", ptest_config;
-          "PTEST_DIR", SubDir.get cmd.directory;
-          "PTEST_RESULT",
-          SubDir.get cmd.directory ^ "/" ^ SubDir.result_dirname;
-          "PTEST_FILE", ptest_file;
-          "PTEST_NAME", ptest_name;
-          "PTEST_NUMBER", string_of_int cmd.n;
-          "PTEST_OPT", cmd.options;
-          "PTEST_LOAD_OPTIONS", (String.concat " "
-                                   [ ptest_load_plugin ;
-                                     ptest_load_libs ;
-                                     ptest_load_module ;
-                                     ptest_load_script ; ])
-        ]
-      in
-      let macros = Macros.add_list macros cmd.macros in
-      let macros = Macros.add_defaults ~defaults macros in
-      let process_macros s = Macros.expand macros s in
-      let toplevel =
-        let in_toplevel,toplevel= Macros.does_expand macros cmd.toplevel in
-        if not cmd.execnow then begin
-          let has_ptest_file, options =
-            if in_toplevel.has_ptest_opt then in_toplevel.has_ptest_file, []
-            else
-              let in_option,options= Macros.does_expand macros cmd.options in
-              (in_option.has_ptest_file || in_toplevel.has_ptest_file),
-              (if in_toplevel.has_frama_c_exe then
-                 [ process_macros "@PTEST_PRE_OPTIONS@" ;
-                   options ;
-                   process_macros "@PTEST_POST_OPTIONS@" ;
-                 ]
-               else [ options ])
-          in
-          String.concat " " (toplevel::(if has_ptest_file then options else ptest_file::options))
-        end
-        else toplevel
-      in
-      let toplevel = (* removes dune feature such as %{deps:...} *)
-        let x = str_global_replace dune_bin_features dune_bin_subst toplevel in
-        str_global_replace dune_cmd_features "\\1" x
-      in
-      { cmd with
-        macros;
-        toplevel;
-        options = ""; (* no more usable *)
-        log_files = List.map process_macros cmd.log_files;
-        filter =
-          match cmd.filter with
-          | None -> None
-          | Some filter -> Some (process_macros filter)
-      }
+    fun ~execnow ~defaults cmd ->
+    let ptest_config =
+      if !special_config = "" then "" else "_" ^ !special_config
+    in
+    let ptest_file = get_ptest_file cmd in
+    let ptest_name =
+      try Filename.chop_extension cmd.file
+      with Invalid_argument _ -> cmd.file
+    in
+    let ptest_file = Filename.sanitize ptest_file in
+    let ptest_load_plugin = Macros.get "PTEST_LOAD_PLUGIN" cmd.macros in
+    let ptest_load_module = Macros.get "PTEST_LOAD_MODULE" cmd.macros in
+    let ptest_load_libs = Macros.get "PTEST_LOAD_LIBS" cmd.macros in
+    let ptest_load_script = Macros.get "PTEST_LOAD_SCRIPT" cmd.macros in
+    let macros =
+      [ "PTEST_CONFIG", ptest_config;
+        "PTEST_DIR", get_ptest_dir cmd;
+        "PTEST_SHARE_DIR", ptest_share_dir;
+        "PTEST_SUITE_DIR", get_ptest_suite_dir cmd;
+        "PTEST_MAKE_DIR", SubDir.get cmd.directory;
+        "PTEST_RESULT", get_ptest_result cmd;
+        "PTEST_FILE", ptest_file;
+        "PTEST_NAME", ptest_name;
+        "PTEST_NUMBER", string_of_int cmd.n;
+        "PTEST_OPT", cmd.options;
+        "PTEST_LOAD_OPTIONS", (String.concat " "
+                                 [ ptest_load_plugin ;
+                                   ptest_load_libs ;
+                                   ptest_load_module ;
+                                   ptest_load_script ; ])
+      ]
+    in
+    let macros = Macros.add_list macros cmd.macros in
+    let macros = Macros.add_defaults ~defaults macros in
+    let process_macros s = Macros.expand macros s in
+    let toplevel =
+      let toplevel = log_default_filter cmd.toplevel in
+      let in_toplevel,toplevel= Macros.does_expand macros toplevel in
+      if not cmd.execnow then begin
+        let has_ptest_file, options =
+          if in_toplevel.has_ptest_opt then in_toplevel.has_ptest_file, []
+          else
+            let in_option,options= Macros.does_expand macros cmd.options in
+            (in_option.has_ptest_file || in_toplevel.has_ptest_file),
+            (if in_toplevel.has_frama_c_exe then
+               [ process_macros "@PTEST_PRE_OPTIONS@" ;
+                 options ;
+                 process_macros "@PTEST_POST_OPTIONS@" ;
+               ]
+             else [ options ])
+        in
+        String.concat " " (toplevel::(if has_ptest_file then options else ptest_file::options))
+      end
+      else toplevel
+    in
+    let toplevel = get_ptest_toplevel cmd (dune_feature_cmd toplevel) in
+    { cmd with
+      macros;
+      toplevel;
+      options = ""; (* no more usable *)
+      log_files = List.map process_macros cmd.log_files;
+      filter =
+        match cmd.filter with
+        | None -> None
+        | Some filter -> Some (process_macros filter)
+    }
 
   let basic_command_string =
     fun command ->
@@ -1486,6 +1646,15 @@ end = struct
     (* Update files related to LOG directives *)
     List.iter (update_log_files command.directory) command.log_files
 
+  let remove_results cmd =
+    let log_prefix = log_prefix cmd in
+    unlink (log_prefix ^ ".res.log ");
+    unlink (log_prefix ^ ".err.log ");
+    let unlink_log_files dir file =
+      unlink (SubDir.make_result_file dir file)
+    in
+    List.iter (unlink_log_files cmd.directory) cmd.log_files
+
 end
 
 let rec update_command = function
@@ -1599,7 +1768,7 @@ let do_command command =
         (* basic_command_string does not redirect the outputs, and does
            not overwrite the result files *)
         let basic_command_string = Cmd.basic_command_string command in
-        lock_printf "%% launch %s@." basic_command_string ;
+        lock_printf "%% launch GUI: %s@." basic_command_string ;
         ignore (launch basic_command_string)
       end
       else begin
@@ -1608,7 +1777,7 @@ let do_command command =
           if !behavior <> Examine
           then begin
             if !verbosity >= 1
-            then lock_printf "%% launch %s@." command_string ;
+            then lock_printf "%% launch TOPLEVEL: %s@." command_string ;
             let launch_result = launch command_string in
             let time = 0. (* Individual time is difficult to compute correctly
                              for now, and currently unused *) in
@@ -1654,8 +1823,7 @@ let do_command command =
             Toplevel cmd ->
             shared.summary_run <- succ shared.summary_run;
             shared.summary_ret <- succ shared.summary_ret;
-            let log_prefix = Cmd.log_prefix cmd in
-            unlink (log_prefix ^ ".res.log ")
+            Cmd.remove_results cmd;
           | Target (execnow,cmds) ->
             shared.summary_run <- succ shared.summary_run;
             shared.summary_ret <- succ shared.summary_ret;
@@ -1683,7 +1851,7 @@ let do_command command =
           remove_execnow_results execnow;
           let cmd = execnow.ex_cmd in
           if !verbosity >= 1 || !behavior = Show then begin
-            lock_printf "%% launch %s@." cmd;
+            lock_printf "%% launch EXECNOW: %s@." cmd;
           end;
           shared.summary_run <- succ shared.summary_run;
           shared.summary_ret <- succ shared.summary_ret;
@@ -1706,7 +1874,7 @@ let launch_and_check_compare_file diff ~cmp_string ~log_file ~oracle_file =
   lock();
   shared.summary_log <- shared.summary_log + 1;
   unlock();
-  let res = launch cmp_string in
+  let res = if is_nonexisting_file log_file then 2 else launch cmp_string in
   begin
     match res with
       0 ->
@@ -1765,6 +1933,17 @@ let find_in_path s =
   with Exit ->
     Some !found
 
+(* filter commands are executed from the same directory than test commands *)
+let get_filter_cmd = match !dune_mode with
+  | 0 | 1 -> fun _ s -> dune_feature_cmd s
+  | _ -> fun cmd s  -> Format.sprintf "(cd %s && (%s))"
+      (SubDir.make_result_file cmd.directory "")
+      (dune_feature_cmd s)
+
+let get_unfiltered_log = match !dune_mode with
+  | 0 | 1 -> fun s -> s
+  | _ -> Filename.basename
+
 let do_filter =
   let regexp_ptest_oracle = Str.regexp "@PTEST_ORACLE@" in
   fun cmd kind ->
@@ -1783,20 +1962,24 @@ let do_filter =
         else
           match find_in_path exec_name with
           | Some full_exec_name -> full_exec_name
-          | None ->
+          | None -> (* must be in the suite directory *)
             Filename.concat
-              (Filename.dirname (Filename.dirname log_prefix))
+              (Cmd.get_ptest_dir cmd)
               (Filename.basename exec_name)
       in
-      let unfiltered_file = Filename.sanitize (log_prefix ^ log_ext ^ ".unfiltered-log") in
-      let filter_cmd = Format.sprintf "%s | %s%s > %s 2> %s"
-          (* the filter command can be a diff from a [@PTEST_ORACLE@] *)
-          (if Sys.file_exists unfiltered_file then "cat " ^ unfiltered_file else "echo \"\"")
-          exec_name params log_file
-          dev_null
+      let filter_cmd =
+        let unfiltered_file = Filename.sanitize (log_prefix ^ log_ext ^ ".unfiltered-log") in
+        let unfiltered_log = get_unfiltered_log unfiltered_file in
+        let filter_cmd = Format.sprintf "%s | %s%s"
+            (* the filter command can be a diff from a [@PTEST_ORACLE@] *)
+            (if Sys.file_exists unfiltered_file then "cat " ^ unfiltered_log else "echo \"\"")
+            exec_name params
+        in
+        let filter_cmd = get_filter_cmd cmd filter_cmd in
+        Format.sprintf "%s > %s 2> %s" filter_cmd log_file dev_null
       in
       if !verbosity >= 1
-      then lock_printf "%tFilter command:@\n%s@." print_default_env filter_cmd;
+      then lock_printf "%% launch FILTER:@\n%s@." filter_cmd;
       ignore (launch filter_cmd)
 
 let compare_one_file cmp log_prefix oracle_prefix log_kind =
@@ -1818,9 +2001,9 @@ let compare_one_file cmp log_prefix oracle_prefix log_kind =
       let cmp_string = Format.sprintf "%s %s %s > %s 2> %s"
           !do_cmp log_file oracle_file dev_null dev_null
       in
-      if !verbosity >= 2 then lock_printf "%% cmp%s (%d) :%s@."
-          ext
+      if !verbosity >= 2 then lock_printf "%% launch CMP (%d%s): %s@."
           cmp.n
+          ext
           cmp_string;
       launch_and_check_compare_file (Command_error (cmp,log_kind))
         ~cmp_string ~log_file ~oracle_file
@@ -1838,7 +2021,7 @@ let compare_one_log_file dir ~test_file ~log =
     let oracle_file = Filename.sanitize (SubDir.make_oracle_file dir log) in
     let cmp_string = Format.sprintf "%s %s %s > %s 2> %s"
         !do_cmp  log_file oracle_file dev_null dev_null in
-    if !verbosity >= 2 then lock_printf "%% cmplog: %s / %s@." (SubDir.get dir) log;
+    if !verbosity >= 2 then lock_printf "%% launch CMP-LOG: %s/%s %s/%s@." (SubDir.get dir) log (SubDir.get dir) oracle_file;
     ignore (launch_and_check_compare_file (Log_error (dir,test_file,log))
               ~cmp_string ~log_file ~oracle_file)
 
@@ -1941,6 +2124,10 @@ let do_diff =
         Filename.sanitize (oracle_prefix ^ log_ext ^ ".oracle")
       in
       let diff_string = diff_check_exist oracle_file log_file in
+      if !verbosity >= 2 then lock_printf "%% launch DIFF (%d%s): %s@."
+          diff.n
+          log_ext
+          diff_string;
       ignore (launch diff_string);
       lock_printf "#- Tested file: %s #- Command:@\n%s@." test_file (Cmd.command_string diff);
   | Target_error execnow ->
@@ -1975,6 +2162,8 @@ let do_diff =
         Filename.sanitize (SubDir.make_oracle_file dir log)
       in
       let diff_string = diff_check_exist oracle_file result_file in
+      if !verbosity >= 2 then lock_printf "%% launch DIFF-LOG: %s@."
+          diff_string;
       ignore (launch diff_string)
     end;
     lock_printf "#- Tested file: %s #- Log file: %s@." test_file result_file
@@ -2063,31 +2252,38 @@ let () =
          end
          else dir_config
        in
-       if interpret_as_file
-       then begin
-         if not (List.mem suite exclude_file) then
+       let process_dir action =
+         let dirname = SubDir.get directory in
+         let dir_files = Array.to_list (Sys.readdir dirname) in
+         (* ignore hidden files (starting with '.') *)
+         let dir_files =
+           List.filter (fun n -> String.get n 0 <> '.') dir_files
+         in
+         if !verbosity >= 2 then
+           lock_printf "%% - Look at %d entries of the directory %S ...@."
+             (List.length dir_files) dirname;
+         List.iter
+           (fun file ->
+              (* creates a symbolic link into the result directory *)
+              mk_symbolic_link directory file ;
+              assert (Filename.is_relative file);
+              action file) dir_files
+       in
+       if interpret_as_file then begin
+         if not (List.mem suite exclude_file) then begin
+           process_dir (fun _ -> ()) ;
            Queue.push (Filename.basename suite, directory, dir_config) files
+         end;
        end
        else begin
-         if not (List.mem suite exclude_suite) then begin
-           let dirname = SubDir.get directory in
-           let dir_files = Array.to_list (Sys.readdir dirname) in
-           (* ignore hidden files (starting with '.' *)
-           let dir_files =
-             List.filter (fun n -> String.get n 0 <> '.') dir_files
-           in
-           if !verbosity >= 2 then
-             lock_printf "%% - Look at %d entries of the directory %S ...@."
-               (List.length dir_files) dirname;
-           List.iter
+         if not (List.mem suite exclude_suite) then
+           process_dir
              (fun file ->
-                assert (Filename.is_relative file);
                 if test_pattern dir_config file &&
                    (not (List.mem (SubDir.make_file directory file) exclude_file))
                 then
                   Queue.push (file, directory, dir_config) files;
-             ) dir_files
-         end
+             );
        end)
     suites
 
@@ -2108,11 +2304,11 @@ let dispatcher () =
       let nb_files = List.length config.dc_commands in
       let make_toplevel_cmd =
         let i = ref 0 in
-        fun {toplevel; opts=options; logs=log_files; macros; exit_code; timeout} ->
+        fun {toplevel; make_cmd; opts=options; logs=log_files; macros; exit_code; timeout} ->
           let n = !i in
           incr i;
-          Cmd.expand_macros ~defaults:config.dc_macros
-            { file; options; toplevel; nb_files; directory; n; log_files;
+          Cmd.expand_macros ~execnow:false ~defaults:config.dc_macros
+            { file; make_cmd;  options; toplevel; nb_files; directory; n; log_files;
               filter = config.dc_filter; macros;
               exit_code = begin
                 match exit_code with
@@ -2131,12 +2327,13 @@ let dispatcher () =
         fun execnow ->
           let n = !e in
           incr e;
-          let cmd = Cmd.expand_macros ~defaults:config.dc_macros
+          let cmd = Cmd.expand_macros ~execnow:true ~defaults:config.dc_macros
               {file ;
                nb_files = nb_files_execnow;
                log_files = execnow.ex_log;
                options = "";
                toplevel = execnow.ex_cmd;
+               make_cmd = execnow.ex_make_cmd;
                exit_code = 0;
                n;
                directory;
@@ -2148,6 +2345,7 @@ let dispatcher () =
           in
           let process_macros s = Macros.expand cmd.macros s in
           { ex_cmd = Cmd.basic_command_string cmd;
+            ex_make_cmd = execnow.ex_make_cmd;
             ex_macros = cmd.macros;
             ex_log = cmd.log_files;
             ex_bin = List.map process_macros execnow.ex_bin;
diff --git a/src/plugins/aorai/tests/test_config b/src/plugins/aorai/tests/test_config
index f5c85b9049e58c1186384afda71624ced9f4b54b..9ff1b014011bbb31f78dfc53604b40012240b119 100644
--- a/src/plugins/aorai/tests/test_config
+++ b/src/plugins/aorai/tests/test_config
@@ -1,6 +1,6 @@
 PLUGIN: aorai eva,from,scope report wp,rtegen
 
 COMMENT: Path to the library from the test file
-LIBS: ../Aorai_test
+LIBS: @PTEST_SUITE_DIR@/../Aorai_test
 
 MACRO: PROVE_OPTIONS
diff --git a/src/plugins/aorai/tests/test_config_prove.in b/src/plugins/aorai/tests/test_config_prove.in
index 04ebf5a2e478a0cb0e0767bd58e33a09e26ff99e..d4b6b4fda2b33bbecfa86e992ebdd7ab94d8a79b 100644
--- a/src/plugins/aorai/tests/test_config_prove.in
+++ b/src/plugins/aorai/tests/test_config_prove.in
@@ -1,6 +1,6 @@
 PLUGIN: aorai eva,from,scope report wp,rtegen
 
 COMMENT: Path to the library from the test file
-LIBS: ../Aorai_test
+LIBS: @PTEST_SUITE_DIR@/../Aorai_test
 
 MACRO: PROVE_OPTIONS @AORAI_WP_SHARE@ -aorai-test-prove-aux-spec
diff --git a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcat.c b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcat.c
index 76184e157cb74d313132d37a6040e0f145897c61..5cc078f129551271693125266520e05e1e47b26d 100644
--- a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcat.c
+++ b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcat.c
@@ -116,7 +116,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data.pred_txt = "\\initialized(&dest[0 .. 1])";
       __gen_e_acsl_assert_data.file = "tests/builtin/strcat.c";
       __gen_e_acsl_assert_data.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data.line = 15;
+      __gen_e_acsl_assert_data.line = 16;
       __e_acsl_assert(__gen_e_acsl_initialized,& __gen_e_acsl_assert_data);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
     }
@@ -152,7 +152,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_2.pred_txt = "!\\initialized(&dest[2 .. 3])";
       __gen_e_acsl_assert_data_2.file = "tests/builtin/strcat.c";
       __gen_e_acsl_assert_data_2.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_2.line = 16;
+      __gen_e_acsl_assert_data_2.line = 17;
       __e_acsl_assert(! __gen_e_acsl_initialized_2,
                       & __gen_e_acsl_assert_data_2);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
@@ -189,7 +189,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_3.pred_txt = "\\initialized(&src[0 .. 1])";
       __gen_e_acsl_assert_data_3.file = "tests/builtin/strcat.c";
       __gen_e_acsl_assert_data_3.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_3.line = 17;
+      __gen_e_acsl_assert_data_3.line = 18;
       __e_acsl_assert(__gen_e_acsl_initialized_3,
                       & __gen_e_acsl_assert_data_3);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3);
@@ -227,7 +227,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_4.pred_txt = "\\initialized(&dest[0 .. 2])";
       __gen_e_acsl_assert_data_4.file = "tests/builtin/strcat.c";
       __gen_e_acsl_assert_data_4.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_4.line = 20;
+      __gen_e_acsl_assert_data_4.line = 21;
       __e_acsl_assert(__gen_e_acsl_initialized_4,
                       & __gen_e_acsl_assert_data_4);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4);
@@ -251,7 +251,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_5.pred_txt = "!\\initialized(&dest[3])";
       __gen_e_acsl_assert_data_5.file = "tests/builtin/strcat.c";
       __gen_e_acsl_assert_data_5.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_5.line = 21;
+      __gen_e_acsl_assert_data_5.line = 22;
       __e_acsl_assert(! __gen_e_acsl_initialized_5,
                       & __gen_e_acsl_assert_data_5);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5);
@@ -299,7 +299,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_6.pred_txt = "\\initialized(&dest_0[0 .. 1])";
       __gen_e_acsl_assert_data_6.file = "tests/builtin/strcat.c";
       __gen_e_acsl_assert_data_6.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_6.line = 27;
+      __gen_e_acsl_assert_data_6.line = 28;
       __e_acsl_assert(__gen_e_acsl_initialized_6,
                       & __gen_e_acsl_assert_data_6);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_6);
@@ -337,7 +337,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_7.pred_txt = "!\\initialized(&dest_0[2 .. 3])";
       __gen_e_acsl_assert_data_7.file = "tests/builtin/strcat.c";
       __gen_e_acsl_assert_data_7.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_7.line = 28;
+      __gen_e_acsl_assert_data_7.line = 29;
       __e_acsl_assert(! __gen_e_acsl_initialized_7,
                       & __gen_e_acsl_assert_data_7);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_7);
@@ -375,7 +375,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_8.pred_txt = "\\initialized(&src_0[0 .. 2])";
       __gen_e_acsl_assert_data_8.file = "tests/builtin/strcat.c";
       __gen_e_acsl_assert_data_8.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_8.line = 29;
+      __gen_e_acsl_assert_data_8.line = 30;
       __e_acsl_assert(__gen_e_acsl_initialized_8,
                       & __gen_e_acsl_assert_data_8);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_8);
@@ -414,7 +414,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_9.pred_txt = "\\initialized(&dest_0[0 .. 2])";
       __gen_e_acsl_assert_data_9.file = "tests/builtin/strcat.c";
       __gen_e_acsl_assert_data_9.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_9.line = 32;
+      __gen_e_acsl_assert_data_9.line = 33;
       __e_acsl_assert(__gen_e_acsl_initialized_9,
                       & __gen_e_acsl_assert_data_9);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_9);
@@ -438,7 +438,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_10.pred_txt = "!\\initialized(&dest_0[3])";
       __gen_e_acsl_assert_data_10.file = "tests/builtin/strcat.c";
       __gen_e_acsl_assert_data_10.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_10.line = 33;
+      __gen_e_acsl_assert_data_10.line = 34;
       __e_acsl_assert(! __gen_e_acsl_initialized_10,
                       & __gen_e_acsl_assert_data_10);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_10);
@@ -486,7 +486,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_11.pred_txt = "\\initialized(&dest_1[0 .. 1])";
       __gen_e_acsl_assert_data_11.file = "tests/builtin/strcat.c";
       __gen_e_acsl_assert_data_11.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_11.line = 39;
+      __gen_e_acsl_assert_data_11.line = 40;
       __e_acsl_assert(__gen_e_acsl_initialized_11,
                       & __gen_e_acsl_assert_data_11);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_11);
@@ -524,7 +524,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_12.pred_txt = "!\\initialized(&dest_1[2 .. 3])";
       __gen_e_acsl_assert_data_12.file = "tests/builtin/strcat.c";
       __gen_e_acsl_assert_data_12.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_12.line = 40;
+      __gen_e_acsl_assert_data_12.line = 41;
       __e_acsl_assert(! __gen_e_acsl_initialized_12,
                       & __gen_e_acsl_assert_data_12);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_12);
@@ -562,7 +562,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_13.pred_txt = "\\initialized(&src_1[0 .. 1])";
       __gen_e_acsl_assert_data_13.file = "tests/builtin/strcat.c";
       __gen_e_acsl_assert_data_13.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_13.line = 41;
+      __gen_e_acsl_assert_data_13.line = 42;
       __e_acsl_assert(__gen_e_acsl_initialized_13,
                       & __gen_e_acsl_assert_data_13);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_13);
@@ -601,7 +601,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_14.pred_txt = "\\initialized(&dest_1[0 .. 2])";
       __gen_e_acsl_assert_data_14.file = "tests/builtin/strcat.c";
       __gen_e_acsl_assert_data_14.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_14.line = 44;
+      __gen_e_acsl_assert_data_14.line = 45;
       __e_acsl_assert(__gen_e_acsl_initialized_14,
                       & __gen_e_acsl_assert_data_14);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_14);
@@ -625,7 +625,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_15.pred_txt = "!\\initialized(&dest_1[3])";
       __gen_e_acsl_assert_data_15.file = "tests/builtin/strcat.c";
       __gen_e_acsl_assert_data_15.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_15.line = 45;
+      __gen_e_acsl_assert_data_15.line = 46;
       __e_acsl_assert(! __gen_e_acsl_initialized_15,
                       & __gen_e_acsl_assert_data_15);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_15);
@@ -823,114 +823,114 @@ void __e_acsl_globals_init(void)
   static char __e_acsl_already_run = 0;
   if (! __e_acsl_already_run) {
     __e_acsl_already_run = 1;
-    __gen_e_acsl_literal_string_27 = "tests/builtin/strcat.c:98";
+    __gen_e_acsl_literal_string_27 = "tests/builtin/strcat.c:99";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_27,
-                         sizeof("tests/builtin/strcat.c:98"));
+                         sizeof("tests/builtin/strcat.c:99"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_27);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_27);
-    __gen_e_acsl_literal_string_26 = "tests/builtin/strcat.c:97";
+    __gen_e_acsl_literal_string_26 = "tests/builtin/strcat.c:98";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_26,
-                         sizeof("tests/builtin/strcat.c:97"));
+                         sizeof("tests/builtin/strcat.c:98"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_26);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_26);
-    __gen_e_acsl_literal_string_25 = "tests/builtin/strcat.c:96";
+    __gen_e_acsl_literal_string_25 = "tests/builtin/strcat.c:97";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_25,
-                         sizeof("tests/builtin/strcat.c:96"));
+                         sizeof("tests/builtin/strcat.c:97"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_25);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_25);
-    __gen_e_acsl_literal_string_24 = "tests/builtin/strcat.c:95";
+    __gen_e_acsl_literal_string_24 = "tests/builtin/strcat.c:96";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_24,
-                         sizeof("tests/builtin/strcat.c:95"));
+                         sizeof("tests/builtin/strcat.c:96"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_24);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_24);
-    __gen_e_acsl_literal_string_23 = "tests/builtin/strcat.c:94";
+    __gen_e_acsl_literal_string_23 = "tests/builtin/strcat.c:95";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_23,
-                         sizeof("tests/builtin/strcat.c:94"));
+                         sizeof("tests/builtin/strcat.c:95"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_23);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_23);
-    __gen_e_acsl_literal_string_22 = "tests/builtin/strcat.c:93";
+    __gen_e_acsl_literal_string_22 = "tests/builtin/strcat.c:94";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_22,
-                         sizeof("tests/builtin/strcat.c:93"));
+                         sizeof("tests/builtin/strcat.c:94"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_22);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_22);
-    __gen_e_acsl_literal_string_21 = "tests/builtin/strcat.c:92";
+    __gen_e_acsl_literal_string_21 = "tests/builtin/strcat.c:93";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_21,
-                         sizeof("tests/builtin/strcat.c:92"));
+                         sizeof("tests/builtin/strcat.c:93"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_21);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_21);
-    __gen_e_acsl_literal_string_20 = "tests/builtin/strcat.c:79";
+    __gen_e_acsl_literal_string_20 = "tests/builtin/strcat.c:80";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_20,
-                         sizeof("tests/builtin/strcat.c:79"));
+                         sizeof("tests/builtin/strcat.c:80"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_20);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_20);
-    __gen_e_acsl_literal_string_19 = "tests/builtin/strcat.c:78";
+    __gen_e_acsl_literal_string_19 = "tests/builtin/strcat.c:79";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_19,
-                         sizeof("tests/builtin/strcat.c:78"));
+                         sizeof("tests/builtin/strcat.c:79"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_19);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_19);
-    __gen_e_acsl_literal_string_18 = "tests/builtin/strcat.c:77";
+    __gen_e_acsl_literal_string_18 = "tests/builtin/strcat.c:78";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_18,
-                         sizeof("tests/builtin/strcat.c:77"));
+                         sizeof("tests/builtin/strcat.c:78"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_18);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_18);
-    __gen_e_acsl_literal_string_17 = "tests/builtin/strcat.c:76";
+    __gen_e_acsl_literal_string_17 = "tests/builtin/strcat.c:77";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_17,
-                         sizeof("tests/builtin/strcat.c:76"));
+                         sizeof("tests/builtin/strcat.c:77"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_17);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_17);
-    __gen_e_acsl_literal_string_16 = "tests/builtin/strcat.c:75";
+    __gen_e_acsl_literal_string_16 = "tests/builtin/strcat.c:76";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_16,
-                         sizeof("tests/builtin/strcat.c:75"));
+                         sizeof("tests/builtin/strcat.c:76"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_16);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_16);
-    __gen_e_acsl_literal_string_15 = "tests/builtin/strcat.c:74";
+    __gen_e_acsl_literal_string_15 = "tests/builtin/strcat.c:75";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_15,
-                         sizeof("tests/builtin/strcat.c:74"));
+                         sizeof("tests/builtin/strcat.c:75"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_15);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_15);
-    __gen_e_acsl_literal_string_14 = "tests/builtin/strcat.c:73";
+    __gen_e_acsl_literal_string_14 = "tests/builtin/strcat.c:74";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_14,
-                         sizeof("tests/builtin/strcat.c:73"));
+                         sizeof("tests/builtin/strcat.c:74"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_14);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_14);
-    __gen_e_acsl_literal_string_13 = "tests/builtin/strcat.c:72";
+    __gen_e_acsl_literal_string_13 = "tests/builtin/strcat.c:73";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_13,
-                         sizeof("tests/builtin/strcat.c:72"));
+                         sizeof("tests/builtin/strcat.c:73"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_13);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_13);
-    __gen_e_acsl_literal_string_12 = "tests/builtin/strcat.c:71";
+    __gen_e_acsl_literal_string_12 = "tests/builtin/strcat.c:72";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_12,
-                         sizeof("tests/builtin/strcat.c:71"));
+                         sizeof("tests/builtin/strcat.c:72"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_12);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_12);
-    __gen_e_acsl_literal_string_11 = "tests/builtin/strcat.c:70";
+    __gen_e_acsl_literal_string_11 = "tests/builtin/strcat.c:71";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_11,
-                         sizeof("tests/builtin/strcat.c:70"));
+                         sizeof("tests/builtin/strcat.c:71"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_11);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_11);
-    __gen_e_acsl_literal_string_10 = "tests/builtin/strcat.c:69";
+    __gen_e_acsl_literal_string_10 = "tests/builtin/strcat.c:70";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_10,
-                         sizeof("tests/builtin/strcat.c:69"));
+                         sizeof("tests/builtin/strcat.c:70"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_10);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_10);
-    __gen_e_acsl_literal_string_9 = "tests/builtin/strcat.c:67";
+    __gen_e_acsl_literal_string_9 = "tests/builtin/strcat.c:68";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_9,
-                         sizeof("tests/builtin/strcat.c:67"));
+                         sizeof("tests/builtin/strcat.c:68"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_9);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_9);
-    __gen_e_acsl_literal_string_30 = "tests/builtin/strcat.c:102";
+    __gen_e_acsl_literal_string_30 = "tests/builtin/strcat.c:103";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_30,
-                         sizeof("tests/builtin/strcat.c:102"));
+                         sizeof("tests/builtin/strcat.c:103"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_30);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_30);
-    __gen_e_acsl_literal_string_29 = "tests/builtin/strcat.c:101";
+    __gen_e_acsl_literal_string_29 = "tests/builtin/strcat.c:102";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_29,
-                         sizeof("tests/builtin/strcat.c:101"));
+                         sizeof("tests/builtin/strcat.c:102"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_29);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_29);
-    __gen_e_acsl_literal_string_28 = "tests/builtin/strcat.c:100";
+    __gen_e_acsl_literal_string_28 = "tests/builtin/strcat.c:101";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_28,
-                         sizeof("tests/builtin/strcat.c:100"));
+                         sizeof("tests/builtin/strcat.c:101"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_28);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_28);
     __gen_e_acsl_literal_string_7 = "abcd";
diff --git a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcmp.c b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcmp.c
index fcc76624c98e753c5e2bd700d0f26ffcc45bcf4b..74a48131471bfca4fe081b672c840c31ba2e6e0c 100644
--- a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcmp.c
+++ b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcmp.c
@@ -384,124 +384,124 @@ void __e_acsl_globals_init(void)
   static char __e_acsl_already_run = 0;
   if (! __e_acsl_already_run) {
     __e_acsl_already_run = 1;
-    __gen_e_acsl_literal_string_32 = "tests/builtin/strcmp.c:88";
+    __gen_e_acsl_literal_string_32 = "tests/builtin/strcmp.c:90";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_32,
-                         sizeof("tests/builtin/strcmp.c:88"));
+                         sizeof("tests/builtin/strcmp.c:90"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_32);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_32);
-    __gen_e_acsl_literal_string_31 = "tests/builtin/strcmp.c:85";
+    __gen_e_acsl_literal_string_31 = "tests/builtin/strcmp.c:87";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_31,
-                         sizeof("tests/builtin/strcmp.c:85"));
+                         sizeof("tests/builtin/strcmp.c:87"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_31);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_31);
-    __gen_e_acsl_literal_string_30 = "tests/builtin/strcmp.c:84";
+    __gen_e_acsl_literal_string_30 = "tests/builtin/strcmp.c:86";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_30,
-                         sizeof("tests/builtin/strcmp.c:84"));
+                         sizeof("tests/builtin/strcmp.c:86"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_30);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_30);
-    __gen_e_acsl_literal_string_29 = "tests/builtin/strcmp.c:81";
+    __gen_e_acsl_literal_string_29 = "tests/builtin/strcmp.c:83";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_29,
-                         sizeof("tests/builtin/strcmp.c:81"));
+                         sizeof("tests/builtin/strcmp.c:83"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_29);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_29);
-    __gen_e_acsl_literal_string_28 = "tests/builtin/strcmp.c:78";
+    __gen_e_acsl_literal_string_28 = "tests/builtin/strcmp.c:80";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_28,
-                         sizeof("tests/builtin/strcmp.c:78"));
+                         sizeof("tests/builtin/strcmp.c:80"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_28);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_28);
-    __gen_e_acsl_literal_string_27 = "tests/builtin/strcmp.c:75";
+    __gen_e_acsl_literal_string_27 = "tests/builtin/strcmp.c:77";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_27,
-                         sizeof("tests/builtin/strcmp.c:75"));
+                         sizeof("tests/builtin/strcmp.c:77"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_27);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_27);
-    __gen_e_acsl_literal_string_26 = "tests/builtin/strcmp.c:73";
+    __gen_e_acsl_literal_string_26 = "tests/builtin/strcmp.c:75";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_26,
-                         sizeof("tests/builtin/strcmp.c:73"));
+                         sizeof("tests/builtin/strcmp.c:75"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_26);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_26);
-    __gen_e_acsl_literal_string_25 = "tests/builtin/strcmp.c:70";
+    __gen_e_acsl_literal_string_25 = "tests/builtin/strcmp.c:72";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_25,
-                         sizeof("tests/builtin/strcmp.c:70"));
+                         sizeof("tests/builtin/strcmp.c:72"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_25);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_25);
-    __gen_e_acsl_literal_string_23 = "tests/builtin/strcmp.c:66";
+    __gen_e_acsl_literal_string_23 = "tests/builtin/strcmp.c:68";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_23,
-                         sizeof("tests/builtin/strcmp.c:66"));
+                         sizeof("tests/builtin/strcmp.c:68"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_23);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_23);
-    __gen_e_acsl_literal_string_22 = "tests/builtin/strcmp.c:65";
+    __gen_e_acsl_literal_string_22 = "tests/builtin/strcmp.c:67";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_22,
-                         sizeof("tests/builtin/strcmp.c:65"));
+                         sizeof("tests/builtin/strcmp.c:67"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_22);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_22);
-    __gen_e_acsl_literal_string_21 = "tests/builtin/strcmp.c:63";
+    __gen_e_acsl_literal_string_21 = "tests/builtin/strcmp.c:65";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_21,
-                         sizeof("tests/builtin/strcmp.c:63"));
+                         sizeof("tests/builtin/strcmp.c:65"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_21);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_21);
-    __gen_e_acsl_literal_string_20 = "tests/builtin/strcmp.c:62";
+    __gen_e_acsl_literal_string_20 = "tests/builtin/strcmp.c:64";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_20,
-                         sizeof("tests/builtin/strcmp.c:62"));
+                         sizeof("tests/builtin/strcmp.c:64"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_20);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_20);
-    __gen_e_acsl_literal_string_19 = "tests/builtin/strcmp.c:61";
+    __gen_e_acsl_literal_string_19 = "tests/builtin/strcmp.c:63";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_19,
-                         sizeof("tests/builtin/strcmp.c:61"));
+                         sizeof("tests/builtin/strcmp.c:63"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_19);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_19);
-    __gen_e_acsl_literal_string_18 = "tests/builtin/strcmp.c:51";
+    __gen_e_acsl_literal_string_18 = "tests/builtin/strcmp.c:53";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_18,
-                         sizeof("tests/builtin/strcmp.c:51"));
+                         sizeof("tests/builtin/strcmp.c:53"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_18);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_18);
-    __gen_e_acsl_literal_string_17 = "tests/builtin/strcmp.c:50";
+    __gen_e_acsl_literal_string_17 = "tests/builtin/strcmp.c:52";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_17,
-                         sizeof("tests/builtin/strcmp.c:50"));
+                         sizeof("tests/builtin/strcmp.c:52"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_17);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_17);
-    __gen_e_acsl_literal_string_16 = "tests/builtin/strcmp.c:45";
+    __gen_e_acsl_literal_string_16 = "tests/builtin/strcmp.c:47";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_16,
-                         sizeof("tests/builtin/strcmp.c:45"));
+                         sizeof("tests/builtin/strcmp.c:47"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_16);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_16);
-    __gen_e_acsl_literal_string_15 = "tests/builtin/strcmp.c:44";
+    __gen_e_acsl_literal_string_15 = "tests/builtin/strcmp.c:46";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_15,
-                         sizeof("tests/builtin/strcmp.c:44"));
+                         sizeof("tests/builtin/strcmp.c:46"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_15);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_15);
-    __gen_e_acsl_literal_string_14 = "tests/builtin/strcmp.c:42";
+    __gen_e_acsl_literal_string_14 = "tests/builtin/strcmp.c:44";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_14,
-                         sizeof("tests/builtin/strcmp.c:42"));
+                         sizeof("tests/builtin/strcmp.c:44"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_14);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_14);
-    __gen_e_acsl_literal_string_13 = "tests/builtin/strcmp.c:39";
+    __gen_e_acsl_literal_string_13 = "tests/builtin/strcmp.c:41";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_13,
-                         sizeof("tests/builtin/strcmp.c:39"));
+                         sizeof("tests/builtin/strcmp.c:41"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_13);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_13);
-    __gen_e_acsl_literal_string_12 = "tests/builtin/strcmp.c:37";
+    __gen_e_acsl_literal_string_12 = "tests/builtin/strcmp.c:39";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_12,
-                         sizeof("tests/builtin/strcmp.c:37"));
+                         sizeof("tests/builtin/strcmp.c:39"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_12);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_12);
-    __gen_e_acsl_literal_string_11 = "tests/builtin/strcmp.c:34";
+    __gen_e_acsl_literal_string_11 = "tests/builtin/strcmp.c:36";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_11,
-                         sizeof("tests/builtin/strcmp.c:34"));
+                         sizeof("tests/builtin/strcmp.c:36"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_11);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_11);
-    __gen_e_acsl_literal_string_10 = "tests/builtin/strcmp.c:31";
+    __gen_e_acsl_literal_string_10 = "tests/builtin/strcmp.c:33";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_10,
-                         sizeof("tests/builtin/strcmp.c:31"));
+                         sizeof("tests/builtin/strcmp.c:33"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_10);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_10);
-    __gen_e_acsl_literal_string_9 = "tests/builtin/strcmp.c:30";
+    __gen_e_acsl_literal_string_9 = "tests/builtin/strcmp.c:32";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_9,
-                         sizeof("tests/builtin/strcmp.c:30"));
+                         sizeof("tests/builtin/strcmp.c:32"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_9);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_9);
-    __gen_e_acsl_literal_string_8 = "tests/builtin/strcmp.c:29";
+    __gen_e_acsl_literal_string_8 = "tests/builtin/strcmp.c:31";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_8,
-                         sizeof("tests/builtin/strcmp.c:29"));
+                         sizeof("tests/builtin/strcmp.c:31"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_8);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_8);
     __gen_e_acsl_literal_string_7 = "comparison failure: %d == %d\n";
diff --git a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcpy.c b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcpy.c
index 41d960dd3f800c5cf02b351fdbe1e0e759cafbdb..b31343f27bfac7786ed28794aae856386abc254a 100644
--- a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcpy.c
+++ b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcpy.c
@@ -137,7 +137,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data.pred_txt = "!\\initialized(&dest[0 .. 3])";
       __gen_e_acsl_assert_data.file = "tests/builtin/strcpy.c";
       __gen_e_acsl_assert_data.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data.line = 13;
+      __gen_e_acsl_assert_data.line = 15;
       __e_acsl_assert(! __gen_e_acsl_initialized,& __gen_e_acsl_assert_data);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
     }
@@ -173,7 +173,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_2.pred_txt = "\\initialized(&src[0 .. 1])";
       __gen_e_acsl_assert_data_2.file = "tests/builtin/strcpy.c";
       __gen_e_acsl_assert_data_2.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_2.line = 14;
+      __gen_e_acsl_assert_data_2.line = 16;
       __e_acsl_assert(__gen_e_acsl_initialized_2,
                       & __gen_e_acsl_assert_data_2);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
@@ -211,7 +211,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_3.pred_txt = "\\initialized(&dest[0 .. 1])";
       __gen_e_acsl_assert_data_3.file = "tests/builtin/strcpy.c";
       __gen_e_acsl_assert_data_3.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_3.line = 17;
+      __gen_e_acsl_assert_data_3.line = 19;
       __e_acsl_assert(__gen_e_acsl_initialized_3,
                       & __gen_e_acsl_assert_data_3);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3);
@@ -248,7 +248,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_4.pred_txt = "!\\initialized(&dest[2 .. 3])";
       __gen_e_acsl_assert_data_4.file = "tests/builtin/strcpy.c";
       __gen_e_acsl_assert_data_4.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_4.line = 18;
+      __gen_e_acsl_assert_data_4.line = 20;
       __e_acsl_assert(! __gen_e_acsl_initialized_4,
                       & __gen_e_acsl_assert_data_4);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4);
@@ -295,7 +295,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_5.pred_txt = "!\\initialized(&dest_0[0 .. 3])";
       __gen_e_acsl_assert_data_5.file = "tests/builtin/strcpy.c";
       __gen_e_acsl_assert_data_5.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_5.line = 23;
+      __gen_e_acsl_assert_data_5.line = 25;
       __e_acsl_assert(! __gen_e_acsl_initialized_5,
                       & __gen_e_acsl_assert_data_5);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5);
@@ -333,7 +333,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_6.pred_txt = "\\initialized(&src_0[0 .. 3])";
       __gen_e_acsl_assert_data_6.file = "tests/builtin/strcpy.c";
       __gen_e_acsl_assert_data_6.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_6.line = 24;
+      __gen_e_acsl_assert_data_6.line = 26;
       __e_acsl_assert(__gen_e_acsl_initialized_6,
                       & __gen_e_acsl_assert_data_6);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_6);
@@ -358,7 +358,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_7.pred_txt = "\\initialized((char *)dest_0)";
       __gen_e_acsl_assert_data_7.file = "tests/builtin/strcpy.c";
       __gen_e_acsl_assert_data_7.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_7.line = 27;
+      __gen_e_acsl_assert_data_7.line = 29;
       __e_acsl_assert(__gen_e_acsl_initialized_7,
                       & __gen_e_acsl_assert_data_7);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_7);
@@ -396,7 +396,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_8.pred_txt = "!\\initialized(&dest_0[1 .. 3])";
       __gen_e_acsl_assert_data_8.file = "tests/builtin/strcpy.c";
       __gen_e_acsl_assert_data_8.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_8.line = 28;
+      __gen_e_acsl_assert_data_8.line = 30;
       __e_acsl_assert(! __gen_e_acsl_initialized_8,
                       & __gen_e_acsl_assert_data_8);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_8);
@@ -443,7 +443,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_9.pred_txt = "!\\initialized(&dest_1[0 .. 3])";
       __gen_e_acsl_assert_data_9.file = "tests/builtin/strcpy.c";
       __gen_e_acsl_assert_data_9.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_9.line = 33;
+      __gen_e_acsl_assert_data_9.line = 35;
       __e_acsl_assert(! __gen_e_acsl_initialized_9,
                       & __gen_e_acsl_assert_data_9);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_9);
@@ -481,7 +481,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_10.pred_txt = "\\initialized(&src_1[0 .. 3])";
       __gen_e_acsl_assert_data_10.file = "tests/builtin/strcpy.c";
       __gen_e_acsl_assert_data_10.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_10.line = 34;
+      __gen_e_acsl_assert_data_10.line = 36;
       __e_acsl_assert(__gen_e_acsl_initialized_10,
                       & __gen_e_acsl_assert_data_10);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_10);
@@ -520,7 +520,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_11.pred_txt = "\\initialized(&dest_1[0 .. 2])";
       __gen_e_acsl_assert_data_11.file = "tests/builtin/strcpy.c";
       __gen_e_acsl_assert_data_11.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_11.line = 37;
+      __gen_e_acsl_assert_data_11.line = 39;
       __e_acsl_assert(__gen_e_acsl_initialized_11,
                       & __gen_e_acsl_assert_data_11);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_11);
@@ -544,7 +544,7 @@ void test_memory_tracking(void)
       __gen_e_acsl_assert_data_12.pred_txt = "!\\initialized(&dest_1[3])";
       __gen_e_acsl_assert_data_12.file = "tests/builtin/strcpy.c";
       __gen_e_acsl_assert_data_12.fct = "test_memory_tracking";
-      __gen_e_acsl_assert_data_12.line = 38;
+      __gen_e_acsl_assert_data_12.line = 40;
       __e_acsl_assert(! __gen_e_acsl_initialized_12,
                       & __gen_e_acsl_assert_data_12);
       __e_acsl_assert_clean(& __gen_e_acsl_assert_data_12);
@@ -797,89 +797,89 @@ void __e_acsl_globals_init(void)
   static char __e_acsl_already_run = 0;
   if (! __e_acsl_already_run) {
     __e_acsl_already_run = 1;
-    __gen_e_acsl_literal_string_24 = "tests/builtin/strcpy.c:74";
+    __gen_e_acsl_literal_string_24 = "tests/builtin/strcpy.c:76";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_24,
-                         sizeof("tests/builtin/strcpy.c:74"));
+                         sizeof("tests/builtin/strcpy.c:76"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_24);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_24);
-    __gen_e_acsl_literal_string_23 = "tests/builtin/strcpy.c:73";
+    __gen_e_acsl_literal_string_23 = "tests/builtin/strcpy.c:75";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_23,
-                         sizeof("tests/builtin/strcpy.c:73"));
+                         sizeof("tests/builtin/strcpy.c:75"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_23);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_23);
-    __gen_e_acsl_literal_string_22 = "tests/builtin/strcpy.c:72";
+    __gen_e_acsl_literal_string_22 = "tests/builtin/strcpy.c:74";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_22,
-                         sizeof("tests/builtin/strcpy.c:72"));
+                         sizeof("tests/builtin/strcpy.c:74"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_22);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_22);
-    __gen_e_acsl_literal_string_21 = "tests/builtin/strcpy.c:71";
+    __gen_e_acsl_literal_string_21 = "tests/builtin/strcpy.c:73";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_21,
-                         sizeof("tests/builtin/strcpy.c:71"));
+                         sizeof("tests/builtin/strcpy.c:73"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_21);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_21);
-    __gen_e_acsl_literal_string_20 = "tests/builtin/strcpy.c:70";
+    __gen_e_acsl_literal_string_20 = "tests/builtin/strcpy.c:72";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_20,
-                         sizeof("tests/builtin/strcpy.c:70"));
+                         sizeof("tests/builtin/strcpy.c:72"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_20);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_20);
-    __gen_e_acsl_literal_string_19 = "tests/builtin/strcpy.c:69";
+    __gen_e_acsl_literal_string_19 = "tests/builtin/strcpy.c:71";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_19,
-                         sizeof("tests/builtin/strcpy.c:69"));
+                         sizeof("tests/builtin/strcpy.c:71"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_19);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_19);
-    __gen_e_acsl_literal_string_18 = "tests/builtin/strcpy.c:68";
+    __gen_e_acsl_literal_string_18 = "tests/builtin/strcpy.c:70";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_18,
-                         sizeof("tests/builtin/strcpy.c:68"));
+                         sizeof("tests/builtin/strcpy.c:70"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_18);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_18);
-    __gen_e_acsl_literal_string_17 = "tests/builtin/strcpy.c:67";
+    __gen_e_acsl_literal_string_17 = "tests/builtin/strcpy.c:69";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_17,
-                         sizeof("tests/builtin/strcpy.c:67"));
+                         sizeof("tests/builtin/strcpy.c:69"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_17);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_17);
-    __gen_e_acsl_literal_string_16 = "tests/builtin/strcpy.c:64";
+    __gen_e_acsl_literal_string_16 = "tests/builtin/strcpy.c:66";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_16,
-                         sizeof("tests/builtin/strcpy.c:64"));
+                         sizeof("tests/builtin/strcpy.c:66"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_16);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_16);
-    __gen_e_acsl_literal_string_15 = "tests/builtin/strcpy.c:63";
+    __gen_e_acsl_literal_string_15 = "tests/builtin/strcpy.c:65";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_15,
-                         sizeof("tests/builtin/strcpy.c:63"));
+                         sizeof("tests/builtin/strcpy.c:65"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_15);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_15);
-    __gen_e_acsl_literal_string_14 = "tests/builtin/strcpy.c:62";
+    __gen_e_acsl_literal_string_14 = "tests/builtin/strcpy.c:64";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_14,
-                         sizeof("tests/builtin/strcpy.c:62"));
+                         sizeof("tests/builtin/strcpy.c:64"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_14);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_14);
-    __gen_e_acsl_literal_string_13 = "tests/builtin/strcpy.c:61";
+    __gen_e_acsl_literal_string_13 = "tests/builtin/strcpy.c:63";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_13,
-                         sizeof("tests/builtin/strcpy.c:61"));
+                         sizeof("tests/builtin/strcpy.c:63"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_13);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_13);
-    __gen_e_acsl_literal_string_12 = "tests/builtin/strcpy.c:60";
+    __gen_e_acsl_literal_string_12 = "tests/builtin/strcpy.c:62";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_12,
-                         sizeof("tests/builtin/strcpy.c:60"));
+                         sizeof("tests/builtin/strcpy.c:62"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_12);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_12);
-    __gen_e_acsl_literal_string_11 = "tests/builtin/strcpy.c:59";
+    __gen_e_acsl_literal_string_11 = "tests/builtin/strcpy.c:61";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_11,
-                         sizeof("tests/builtin/strcpy.c:59"));
+                         sizeof("tests/builtin/strcpy.c:61"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_11);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_11);
-    __gen_e_acsl_literal_string_10 = "tests/builtin/strcpy.c:58";
+    __gen_e_acsl_literal_string_10 = "tests/builtin/strcpy.c:60";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_10,
-                         sizeof("tests/builtin/strcpy.c:58"));
+                         sizeof("tests/builtin/strcpy.c:60"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_10);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_10);
-    __gen_e_acsl_literal_string_9 = "tests/builtin/strcpy.c:57";
+    __gen_e_acsl_literal_string_9 = "tests/builtin/strcpy.c:59";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_9,
-                         sizeof("tests/builtin/strcpy.c:57"));
+                         sizeof("tests/builtin/strcpy.c:59"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_9);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_9);
-    __gen_e_acsl_literal_string_7 = "tests/builtin/strcpy.c:56";
+    __gen_e_acsl_literal_string_7 = "tests/builtin/strcpy.c:58";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_7,
-                         sizeof("tests/builtin/strcpy.c:56"));
+                         sizeof("tests/builtin/strcpy.c:58"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_7);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_7);
     __gen_e_acsl_literal_string_6 = "abcd";
diff --git a/src/plugins/e-acsl/tests/builtin/oracle/gen_strlen.c b/src/plugins/e-acsl/tests/builtin/oracle/gen_strlen.c
index 836035907163c2fae009d5aefc28a64ad03f4b57..0f7fe7a05daf5c9cd89a9faa6e02b782de0b0b91 100644
--- a/src/plugins/e-acsl/tests/builtin/oracle/gen_strlen.c
+++ b/src/plugins/e-acsl/tests/builtin/oracle/gen_strlen.c
@@ -368,39 +368,39 @@ void __e_acsl_globals_init(void)
                          sizeof("the cat"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_7);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_7);
-    __gen_e_acsl_literal_string_15 = "tests/builtin/strlen.c:33";
+    __gen_e_acsl_literal_string_15 = "tests/builtin/strlen.c:35";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_15,
-                         sizeof("tests/builtin/strlen.c:33"));
+                         sizeof("tests/builtin/strlen.c:35"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_15);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_15);
-    __gen_e_acsl_literal_string_14 = "tests/builtin/strlen.c:31";
+    __gen_e_acsl_literal_string_14 = "tests/builtin/strlen.c:33";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_14,
-                         sizeof("tests/builtin/strlen.c:31"));
+                         sizeof("tests/builtin/strlen.c:33"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_14);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_14);
-    __gen_e_acsl_literal_string_13 = "tests/builtin/strlen.c:29";
+    __gen_e_acsl_literal_string_13 = "tests/builtin/strlen.c:31";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_13,
-                         sizeof("tests/builtin/strlen.c:29"));
+                         sizeof("tests/builtin/strlen.c:31"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_13);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_13);
-    __gen_e_acsl_literal_string_12 = "tests/builtin/strlen.c:24";
+    __gen_e_acsl_literal_string_12 = "tests/builtin/strlen.c:26";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_12,
-                         sizeof("tests/builtin/strlen.c:24"));
+                         sizeof("tests/builtin/strlen.c:26"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_12);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_12);
-    __gen_e_acsl_literal_string_11 = "tests/builtin/strlen.c:23";
+    __gen_e_acsl_literal_string_11 = "tests/builtin/strlen.c:25";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_11,
-                         sizeof("tests/builtin/strlen.c:23"));
+                         sizeof("tests/builtin/strlen.c:25"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_11);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_11);
-    __gen_e_acsl_literal_string_10 = "tests/builtin/strlen.c:22";
+    __gen_e_acsl_literal_string_10 = "tests/builtin/strlen.c:24";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_10,
-                         sizeof("tests/builtin/strlen.c:22"));
+                         sizeof("tests/builtin/strlen.c:24"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_10);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_10);
-    __gen_e_acsl_literal_string_9 = "tests/builtin/strlen.c:21";
+    __gen_e_acsl_literal_string_9 = "tests/builtin/strlen.c:23";
     __e_acsl_store_block((void *)__gen_e_acsl_literal_string_9,
-                         sizeof("tests/builtin/strlen.c:21"));
+                         sizeof("tests/builtin/strlen.c:23"));
     __e_acsl_full_init((void *)__gen_e_acsl_literal_string_9);
     __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_9);
     __gen_e_acsl_literal_string = "TEST %d: ";
diff --git a/src/plugins/e-acsl/tests/builtin/oracle/strcmp.res.oracle b/src/plugins/e-acsl/tests/builtin/oracle/strcmp.res.oracle
index 455bfd43413ff0193be76f0b37f94cdfa2afc6f3..1073ab7cbaafbde2ee5da972c14336c0712b791d 100644
--- a/src/plugins/e-acsl/tests/builtin/oracle/strcmp.res.oracle
+++ b/src/plugins/e-acsl/tests/builtin/oracle/strcmp.res.oracle
@@ -1,4 +1,4 @@
-[variadic] tests/builtin/strcmp.c:11: Warning: 
+[variadic] tests/builtin/strcmp.c:13: Warning: 
   Call to function fprintf with non-static format argument: assuming that parameters are coherent with the format, and that no %n specifiers are present in the actual string.
 [e-acsl] beginning translation.
 [e-acsl] Warning: annotating undefined function `abort':
diff --git a/src/plugins/e-acsl/tests/builtin/oracle_dev/strcat.e-acsl.err.log b/src/plugins/e-acsl/tests/builtin/oracle_dev/strcat.e-acsl.err.log
index ba266124594f7cb22a17928de0f6f61f45e81758..a6ba088466b843d16e4513543a9d1bd3e068886c 100644
--- a/src/plugins/e-acsl/tests/builtin/oracle_dev/strcat.e-acsl.err.log
+++ b/src/plugins/e-acsl/tests/builtin/oracle_dev/strcat.e-acsl.err.log
@@ -1,40 +1,40 @@
-TEST 1: OK: Expected execution at tests/builtin/strcat.c:67
-TEST 2: OK: Expected execution at tests/builtin/strcat.c:69
+TEST 1: OK: Expected execution at tests/builtin/strcat.c:68
+TEST 2: OK: Expected execution at tests/builtin/strcat.c:70
 strcat: insufficient space in destination string, available: 8 bytes, requires at least 9 bytes
-TEST 3: OK: Expected signal at tests/builtin/strcat.c:70
+TEST 3: OK: Expected signal at tests/builtin/strcat.c:71
 strcat: destination string string unallocated
-TEST 4: OK: Expected signal at tests/builtin/strcat.c:71
+TEST 4: OK: Expected signal at tests/builtin/strcat.c:72
 strcat: source string string unallocated
-TEST 5: OK: Expected signal at tests/builtin/strcat.c:72
+TEST 5: OK: Expected signal at tests/builtin/strcat.c:73
 strcat: destination string string unallocated
-TEST 6: OK: Expected signal at tests/builtin/strcat.c:73
+TEST 6: OK: Expected signal at tests/builtin/strcat.c:74
 strcat: source string string unallocated
-TEST 7: OK: Expected signal at tests/builtin/strcat.c:74
+TEST 7: OK: Expected signal at tests/builtin/strcat.c:75
 strcat: destination string string is not writable
-TEST 8: OK: Expected signal at tests/builtin/strcat.c:75
+TEST 8: OK: Expected signal at tests/builtin/strcat.c:76
 strcat: overlapping memory areas
-TEST 9: OK: Expected signal at tests/builtin/strcat.c:76
+TEST 9: OK: Expected signal at tests/builtin/strcat.c:77
 strcat: overlapping memory areas
-TEST 10: OK: Expected signal at tests/builtin/strcat.c:77
+TEST 10: OK: Expected signal at tests/builtin/strcat.c:78
 strcat: overlapping memory areas
-TEST 11: OK: Expected signal at tests/builtin/strcat.c:78
-TEST 12: OK: Expected execution at tests/builtin/strcat.c:79
-TEST 13: OK: Expected execution at tests/builtin/strcat.c:92
+TEST 11: OK: Expected signal at tests/builtin/strcat.c:79
+TEST 12: OK: Expected execution at tests/builtin/strcat.c:80
+TEST 13: OK: Expected execution at tests/builtin/strcat.c:93
 strncat: insufficient space in destination string, available: 8 bytes, requires at least 9 bytes
-TEST 14: OK: Expected signal at tests/builtin/strcat.c:93
+TEST 14: OK: Expected signal at tests/builtin/strcat.c:94
 strcat: destination string string unallocated
-TEST 15: OK: Expected signal at tests/builtin/strcat.c:94
+TEST 15: OK: Expected signal at tests/builtin/strcat.c:95
 strncat: source string string unallocated
-TEST 16: OK: Expected signal at tests/builtin/strcat.c:95
+TEST 16: OK: Expected signal at tests/builtin/strcat.c:96
 strcat: destination string string unallocated
-TEST 17: OK: Expected signal at tests/builtin/strcat.c:96
+TEST 17: OK: Expected signal at tests/builtin/strcat.c:97
 strncat: source string string unallocated
-TEST 18: OK: Expected signal at tests/builtin/strcat.c:97
+TEST 18: OK: Expected signal at tests/builtin/strcat.c:98
 strcat: destination string string is not writable
-TEST 19: OK: Expected signal at tests/builtin/strcat.c:98
+TEST 19: OK: Expected signal at tests/builtin/strcat.c:99
 strcat: overlapping memory areas
-TEST 20: OK: Expected signal at tests/builtin/strcat.c:100
+TEST 20: OK: Expected signal at tests/builtin/strcat.c:101
 strncat: insufficient space in destination string, available: 6 bytes, requires at least 7 bytes
-TEST 21: OK: Expected signal at tests/builtin/strcat.c:101
+TEST 21: OK: Expected signal at tests/builtin/strcat.c:102
 strcat: overlapping memory areas
-TEST 22: OK: Expected signal at tests/builtin/strcat.c:102
+TEST 22: OK: Expected signal at tests/builtin/strcat.c:103
diff --git a/src/plugins/e-acsl/tests/builtin/oracle_dev/strcmp.e-acsl.err.log b/src/plugins/e-acsl/tests/builtin/oracle_dev/strcmp.e-acsl.err.log
index 82deb8dc09ef4a5467c9f9ee838ddab9048c16aa..104a9c03779e69c077a4761cc48a336e37f97f30 100644
--- a/src/plugins/e-acsl/tests/builtin/oracle_dev/strcmp.e-acsl.err.log
+++ b/src/plugins/e-acsl/tests/builtin/oracle_dev/strcmp.e-acsl.err.log
@@ -1,36 +1,36 @@
-TEST 1: OK: Expected execution at tests/builtin/strcmp.c:29
-TEST 2: OK: Expected execution at tests/builtin/strcmp.c:30
-TEST 3: OK: Expected execution at tests/builtin/strcmp.c:31
+TEST 1: OK: Expected execution at tests/builtin/strcmp.c:31
+TEST 2: OK: Expected execution at tests/builtin/strcmp.c:32
+TEST 3: OK: Expected execution at tests/builtin/strcmp.c:33
 strcmp: string 1 string not NUL-terminated
-TEST 4: OK: Expected signal at tests/builtin/strcmp.c:34
+TEST 4: OK: Expected signal at tests/builtin/strcmp.c:36
 strcmp: string 2 string not NUL-terminated
-TEST 5: OK: Expected signal at tests/builtin/strcmp.c:37
+TEST 5: OK: Expected signal at tests/builtin/strcmp.c:39
 strcmp: string 1 string not NUL-terminated
-TEST 6: OK: Expected signal at tests/builtin/strcmp.c:39
+TEST 6: OK: Expected signal at tests/builtin/strcmp.c:41
 strcmp: string 2 string not NUL-terminated
-TEST 7: OK: Expected signal at tests/builtin/strcmp.c:42
+TEST 7: OK: Expected signal at tests/builtin/strcmp.c:44
 strcmp: string 2 string unallocated
-TEST 8: OK: Expected signal at tests/builtin/strcmp.c:44
+TEST 8: OK: Expected signal at tests/builtin/strcmp.c:46
 strcmp: string 1 string unallocated
-TEST 9: OK: Expected signal at tests/builtin/strcmp.c:45
+TEST 9: OK: Expected signal at tests/builtin/strcmp.c:47
 strcmp: string 1 string unallocated
-TEST 10: OK: Expected signal at tests/builtin/strcmp.c:50
+TEST 10: OK: Expected signal at tests/builtin/strcmp.c:52
 strcmp: string 2 string unallocated
-TEST 11: OK: Expected signal at tests/builtin/strcmp.c:51
-TEST 12: OK: Expected execution at tests/builtin/strcmp.c:61
-TEST 13: OK: Expected execution at tests/builtin/strcmp.c:62
-TEST 14: OK: Expected execution at tests/builtin/strcmp.c:63
-TEST 15: OK: Expected execution at tests/builtin/strcmp.c:65
-TEST 16: OK: Expected execution at tests/builtin/strcmp.c:66
-TEST 17: OK: Expected execution at tests/builtin/strcmp.c:70
-TEST 18: OK: Expected execution at tests/builtin/strcmp.c:73
-TEST 19: OK: Expected execution at tests/builtin/strcmp.c:75
-TEST 20: OK: Expected execution at tests/builtin/strcmp.c:78
+TEST 11: OK: Expected signal at tests/builtin/strcmp.c:53
+TEST 12: OK: Expected execution at tests/builtin/strcmp.c:63
+TEST 13: OK: Expected execution at tests/builtin/strcmp.c:64
+TEST 14: OK: Expected execution at tests/builtin/strcmp.c:65
+TEST 15: OK: Expected execution at tests/builtin/strcmp.c:67
+TEST 16: OK: Expected execution at tests/builtin/strcmp.c:68
+TEST 17: OK: Expected execution at tests/builtin/strcmp.c:72
+TEST 18: OK: Expected execution at tests/builtin/strcmp.c:75
+TEST 19: OK: Expected execution at tests/builtin/strcmp.c:77
+TEST 20: OK: Expected execution at tests/builtin/strcmp.c:80
 strncmp: string 2 string has insufficient length
-TEST 21: OK: Expected signal at tests/builtin/strcmp.c:81
+TEST 21: OK: Expected signal at tests/builtin/strcmp.c:83
 strncmp: string 2 string has insufficient length
-TEST 22: OK: Expected signal at tests/builtin/strcmp.c:84
+TEST 22: OK: Expected signal at tests/builtin/strcmp.c:86
 strncmp: string 2 string has insufficient length
-TEST 23: OK: Expected signal at tests/builtin/strcmp.c:85
+TEST 23: OK: Expected signal at tests/builtin/strcmp.c:87
 strncmp: string 1 string has insufficient length
-TEST 24: OK: Expected signal at tests/builtin/strcmp.c:88
+TEST 24: OK: Expected signal at tests/builtin/strcmp.c:90
diff --git a/src/plugins/e-acsl/tests/builtin/oracle_dev/strcpy.e-acsl.err.log b/src/plugins/e-acsl/tests/builtin/oracle_dev/strcpy.e-acsl.err.log
index cd7ff4907a56d31da2a7b2cefc26b45b92bbb3f3..41e9c691476a0fbb2a792a366d1144c2fd9abcb2 100644
--- a/src/plugins/e-acsl/tests/builtin/oracle_dev/strcpy.e-acsl.err.log
+++ b/src/plugins/e-acsl/tests/builtin/oracle_dev/strcpy.e-acsl.err.log
@@ -1,27 +1,27 @@
-TEST 1: OK: Expected execution at tests/builtin/strcpy.c:56
-TEST 2: OK: Expected execution at tests/builtin/strcpy.c:57
+TEST 1: OK: Expected execution at tests/builtin/strcpy.c:58
+TEST 2: OK: Expected execution at tests/builtin/strcpy.c:59
 strlen: insufficient space in destination string, at least 5 bytes required
-TEST 3: OK: Expected signal at tests/builtin/strcpy.c:58
+TEST 3: OK: Expected signal at tests/builtin/strcpy.c:60
 strlen: destination string space unallocated or cannot be written
-TEST 4: OK: Expected signal at tests/builtin/strcpy.c:59
+TEST 4: OK: Expected signal at tests/builtin/strcpy.c:61
 strlen: destination string space unallocated or cannot be written
-TEST 5: OK: Expected signal at tests/builtin/strcpy.c:60
-TEST 6: OK: Expected execution at tests/builtin/strcpy.c:61
+TEST 5: OK: Expected signal at tests/builtin/strcpy.c:62
+TEST 6: OK: Expected execution at tests/builtin/strcpy.c:63
 strcpy: overlapping memory areas
-TEST 7: OK: Expected signal at tests/builtin/strcpy.c:62
-TEST 8: OK: Expected execution at tests/builtin/strcpy.c:63
+TEST 7: OK: Expected signal at tests/builtin/strcpy.c:64
+TEST 8: OK: Expected execution at tests/builtin/strcpy.c:65
 strcpy: overlapping memory areas
-TEST 9: OK: Expected signal at tests/builtin/strcpy.c:64
-TEST 10: OK: Expected execution at tests/builtin/strcpy.c:67
+TEST 9: OK: Expected signal at tests/builtin/strcpy.c:66
+TEST 10: OK: Expected execution at tests/builtin/strcpy.c:69
 strncpy: insufficient space in destination string , at least 6 bytes required
-TEST 11: OK: Expected signal at tests/builtin/strcpy.c:68
+TEST 11: OK: Expected signal at tests/builtin/strcpy.c:70
 strncpy: destination string  space unallocated or cannot be written
-TEST 12: OK: Expected signal at tests/builtin/strcpy.c:69
+TEST 12: OK: Expected signal at tests/builtin/strcpy.c:71
 strncpy: destination string  space unallocated or cannot be written
-TEST 13: OK: Expected signal at tests/builtin/strcpy.c:70
-TEST 14: OK: Expected execution at tests/builtin/strcpy.c:71
+TEST 13: OK: Expected signal at tests/builtin/strcpy.c:72
+TEST 14: OK: Expected execution at tests/builtin/strcpy.c:73
 strncpy: overlapping memory areas
-TEST 15: OK: Expected signal at tests/builtin/strcpy.c:72
-TEST 16: OK: Expected execution at tests/builtin/strcpy.c:73
+TEST 15: OK: Expected signal at tests/builtin/strcpy.c:74
+TEST 16: OK: Expected execution at tests/builtin/strcpy.c:75
 strncpy: overlapping memory areas
-TEST 17: OK: Expected signal at tests/builtin/strcpy.c:74
+TEST 17: OK: Expected signal at tests/builtin/strcpy.c:76
diff --git a/src/plugins/e-acsl/tests/builtin/oracle_dev/strlen.e-acsl.err.log b/src/plugins/e-acsl/tests/builtin/oracle_dev/strlen.e-acsl.err.log
index 12fc549bbd1f81e6d55a9ff66150154bf9fcbc34..14e39ec1624fd245220305b5ae9bb3445a220c38 100644
--- a/src/plugins/e-acsl/tests/builtin/oracle_dev/strlen.e-acsl.err.log
+++ b/src/plugins/e-acsl/tests/builtin/oracle_dev/strlen.e-acsl.err.log
@@ -1,10 +1,10 @@
-TEST 1: OK: Expected execution at tests/builtin/strlen.c:21
-TEST 2: OK: Expected execution at tests/builtin/strlen.c:22
-TEST 3: OK: Expected execution at tests/builtin/strlen.c:23
-TEST 4: OK: Expected execution at tests/builtin/strlen.c:24
+TEST 1: OK: Expected execution at tests/builtin/strlen.c:23
+TEST 2: OK: Expected execution at tests/builtin/strlen.c:24
+TEST 3: OK: Expected execution at tests/builtin/strlen.c:25
+TEST 4: OK: Expected execution at tests/builtin/strlen.c:26
 strlen: input string not NUL-terminated
-TEST 5: OK: Expected signal at tests/builtin/strlen.c:29
+TEST 5: OK: Expected signal at tests/builtin/strlen.c:31
 strlen: input string not NUL-terminated
-TEST 6: OK: Expected signal at tests/builtin/strlen.c:31
+TEST 6: OK: Expected signal at tests/builtin/strlen.c:33
 strlen: input string unallocated
-TEST 7: OK: Expected signal at tests/builtin/strlen.c:33
+TEST 7: OK: Expected signal at tests/builtin/strlen.c:35
diff --git a/src/plugins/e-acsl/tests/builtin/strcat.c b/src/plugins/e-acsl/tests/builtin/strcat.c
index 1e9c506bcc3a393d79f8112fe2b0abc559b44031..d8bd751af84661e01e3ff675eddba729d9fa622a 100644
--- a/src/plugins/e-acsl/tests/builtin/strcat.c
+++ b/src/plugins/e-acsl/tests/builtin/strcat.c
@@ -1,9 +1,10 @@
 /* run.config
-   COMMENT: Test `strcat` and `strncat` E-ACSL built-ins
+ COMMENT: Test `strcat` and `strncat` E-ACSL built-ins
+ DEPS: @PTESTS_DEPS@ utils/signalled.h
    STDOPT: +"-eva-precision=1"
 */
 
-#include "../utils/signalled.h"
+#include "utils/signalled.h"
 #include <stdlib.h>
 #include <string.h>
 
diff --git a/src/plugins/e-acsl/tests/builtin/strcmp.c b/src/plugins/e-acsl/tests/builtin/strcmp.c
index add8cc87f8972b6ee3aec792ec31c91878021d23..e90d1b7f2ea4613ea6d98a8654bf78d02f1ff586 100644
--- a/src/plugins/e-acsl/tests/builtin/strcmp.c
+++ b/src/plugins/e-acsl/tests/builtin/strcmp.c
@@ -1,8 +1,10 @@
 /* run.config
-   COMMENT: Test `strcmp` and `strncmp` E-ACSL built-ins
+ COMMENT: Test `strcmp` and `strncmp` E-ACSL built-ins
+ DEPS: @PTESTS_DEPS@ utils/signalled.h
+   STDOPT:
 */
 
-#include "../utils/signalled.h"
+#include "utils/signalled.h"
 #include <stdlib.h>
 #include <string.h>
 
diff --git a/src/plugins/e-acsl/tests/builtin/strcpy.c b/src/plugins/e-acsl/tests/builtin/strcpy.c
index 64a0571c23ad5177247836e1cbd210196447f9a5..44e8b5f81106f3025f08100ba72c70c8987ed65e 100644
--- a/src/plugins/e-acsl/tests/builtin/strcpy.c
+++ b/src/plugins/e-acsl/tests/builtin/strcpy.c
@@ -1,8 +1,10 @@
 /* run.config
-   COMMENT: Test `strcpy` and `strncpy` E-ACSL built-ins
+ COMMENT: Test `strcpy` and `strncpy` E-ACSL built-ins
+ DEPS: @PTESTS_DEPS@ utils/signalled.h
+   STDOPT:
 */
 
-#include "../utils/signalled.h"
+#include "utils/signalled.h"
 #include <stdlib.h>
 #include <string.h>
 
diff --git a/src/plugins/e-acsl/tests/builtin/strlen.c b/src/plugins/e-acsl/tests/builtin/strlen.c
index b7ef400329cd543aedbe5277f2db0e6cb1b1b791..556734a33c04696ac9b9262f3ae248a1c64df366 100644
--- a/src/plugins/e-acsl/tests/builtin/strlen.c
+++ b/src/plugins/e-acsl/tests/builtin/strlen.c
@@ -1,8 +1,10 @@
 /* run.config
-   COMMENT: Test `strlen` E-ACSL built-ins
+ COMMENT: Test `strlen` E-ACSL built-ins
+ DEPS: @PTESTS_DEPS@ utils/signalled.h
+   STDOPT:
 */
 
-#include "../utils/signalled.h"
+#include "utils/signalled.h"
 #include <stdlib.h>
 #include <string.h>
 
diff --git a/src/plugins/e-acsl/tests/builtin/utils b/src/plugins/e-acsl/tests/builtin/utils
new file mode 120000
index 0000000000000000000000000000000000000000..19985ba50b51e1b7741a400a0b24ee16739553af
--- /dev/null
+++ b/src/plugins/e-acsl/tests/builtin/utils
@@ -0,0 +1 @@
+../utils/
\ No newline at end of file
diff --git a/src/plugins/e-acsl/tests/format/fprintf.c b/src/plugins/e-acsl/tests/format/fprintf.c
index 41f91017210623d6199c28c04a5db79b2be7f384..0ad4326e664141bc2d524b21c0550f16b16ef10c 100644
--- a/src/plugins/e-acsl/tests/format/fprintf.c
+++ b/src/plugins/e-acsl/tests/format/fprintf.c
@@ -3,7 +3,7 @@
    STDOPT: +"-eva-precision=1"
 */
 
-#include "../utils/signalled.h"
+#include "utils/signalled.h"
 #include <stdio.h>
 #include <stdlib.h>
 
diff --git a/src/plugins/e-acsl/tests/format/printf.c b/src/plugins/e-acsl/tests/format/printf.c
index 4b4c505ef0766a749f193a70695e519cff1b3fa0..c1ddba8d5eabf8e0a8db97d538cef13a6ba71859 100644
--- a/src/plugins/e-acsl/tests/format/printf.c
+++ b/src/plugins/e-acsl/tests/format/printf.c
@@ -6,7 +6,7 @@
    MACRO: ROOT_EACSL_GCC_OPTS_EXT @ROOT_EACSL_GCC_OPTS_EXT@ -e "-Wno-maybe-uninitialized"
 */
 
-#include "../utils/signalled.h"
+#include "utils/signalled.h"
 #include <limits.h>
 #include <signal.h>
 #include <stddef.h>
diff --git a/src/plugins/e-acsl/tests/format/utils b/src/plugins/e-acsl/tests/format/utils
new file mode 120000
index 0000000000000000000000000000000000000000..19985ba50b51e1b7741a400a0b24ee16739553af
--- /dev/null
+++ b/src/plugins/e-acsl/tests/format/utils
@@ -0,0 +1 @@
+../utils/
\ No newline at end of file
diff --git a/src/plugins/e-acsl/tests/special/e-acsl-no-assert-print-data.c b/src/plugins/e-acsl/tests/special/e-acsl-no-assert-print-data.c
index fea3dee8c454c325388a8d59f192f4e42e6f5773..33a928aa5023fbcb6a0f1c95b7483a1e2f4e5580 100644
--- a/src/plugins/e-acsl/tests/special/e-acsl-no-assert-print-data.c
+++ b/src/plugins/e-acsl/tests/special/e-acsl-no-assert-print-data.c
@@ -1,6 +1,6 @@
 /* run.config
    COMMENT: test assertion failure without printing assertion data
-   LOG: gen_@PTEST_NAME@.c
+
    STDOPT: #"-e-acsl-no-assert-print-data"
 */
 /* run.config_dev
diff --git a/src/plugins/e-acsl/tests/test_config.in b/src/plugins/e-acsl/tests/test_config.in
index 55b9f357b3475c0e31946b0b09f162c70913b614..9ea7fff16b9e76eaf6059d66e8481b0c6df3d8bc 100644
--- a/src/plugins/e-acsl/tests/test_config.in
+++ b/src/plugins/e-acsl/tests/test_config.in
@@ -2,17 +2,22 @@ MACRO: DEST @PTEST_RESULT@/gen_@PTEST_NAME@
 MACRO: MACHDEP -machdep gcc_x86_64
 MACRO: GLOBAL @MACHDEP@ -remove-unused-specified-functions -verbose 0 -no-unicode
 
-MACRO: EACSL -e-acsl -e-acsl-share ./share/e-acsl -e-acsl-verbose 1
+MACRO: EACSL -e-acsl -e-acsl-share @PTEST_SHARE_DIR@/e-acsl -e-acsl-verbose 1
 MACRO: EVA -eva -eva-no-alloc-returns-null -eva-no-results -eva-no-print -eva-warn-key libc:unsupported-spec=inactive -eva-warn-key loop-unroll:auto=inactive
 
 MACRO: EVENTUALLY -print -ocode @DEST@.c
 
 PLUGIN: E_ACSL eva,scope,variadic rtegen
 
-LIBS: ../E_ACSL_test
+LIBS: @PTEST_SUITE_DIR@/../E_ACSL_test
 LOG: gen_@PTEST_NAME@.c
-OPT: @GLOBAL@ @EACSL@ -then-last @EVA@ @EVENTUALLY@
-FILTER:@SEDCMD@ -e "s|[a-zA-Z/\\]\+frama_c_project_e-acsl_[a-z0-9]*|PROJECT_FILE|" -e "s|$FRAMAC_SHARE|FRAMAC_SHARE|g" -e "s|../../share|FRAMAC_SHARE|g" -e "s|./share/e-acsl|FRAMAC_SHARE/e-acsl|g" -e "s|share/e-acsl|FRAMAC_SHARE/e-acsl|g"
+
 COMMENT: This regex works around the tendency of Frama-C to transform
 COMMENT: absolute path into relative ones whenever the file is not too far
 COMMENT: away from cwd.
+FILTER:@SEDCMD@ -e "s|[a-zA-Z/\\]\+frama_c_project_e-acsl_[a-z0-9]*|PROJECT_FILE|" -e "s|$FRAMAC_SHARE|FRAMAC_SHARE|g" -e "s|../../share|FRAMAC_SHARE|g" -e "s|@PTEST_SHARE_DIR@/e-acsl|FRAMAC_SHARE/e-acsl|g" -e "s|share/e-acsl|FRAMAC_SHARE/e-acsl|g"
+
+COMMENT: The dependency to the plugin share directory has not to be explicited
+DEPS:
+
+OPT: @GLOBAL@ @EACSL@ -then-last @EVA@ @EVENTUALLY@
diff --git a/src/plugins/e-acsl/tests/test_config_dev.in b/src/plugins/e-acsl/tests/test_config_dev.in
index eefa60c7fb94b292a05dcf9d11fc8ace5e8f7706..ca8f3b14da0cd423cf8f14b321c2d59eaf29a3cb 100644
--- a/src/plugins/e-acsl/tests/test_config_dev.in
+++ b/src/plugins/e-acsl/tests/test_config_dev.in
@@ -4,18 +4,25 @@ MACRO: EACSL_ERR @PTEST_NAME@.e-acsl.err.log
 
 COMMENT: Default options for `e-acsl-gcc.sh`
 MACRO: ROOT_EACSL_GCC_MISC_OPTS -q -X --no-assert-print-data
+
 COMMENT: Default options for the frama-c invocation
 MACRO: ROOT_EACSL_GCC_FC_EXTRA -journal-disable -verbose 0
 
 PLUGIN: E_ACSL eva,scope,variadic rtegen
 
-EXEC: LOG @EACSL_ERR@ ./tests/wrapper.sh "@frama-c-exe@" "@PTEST_RESULT@" "@PTEST_NAME@" "@PTEST_FILE@" "@EACSL_ERR@" "@ROOT_EACSL_GCC_MISC_OPTS@ @ROOT_EACSL_GCC_OPTS_EXT@" "@PTEST_DEFAULT_OPTIONS@ @PTEST_LOAD_OPTIONS@ @ROOT_EACSL_GCC_FC_EXTRA@ @ROOT_EACSL_GCC_FC_EXTRA_EXT@" "@ROOT_EACSL_EXEC_FILTER@"
+COMMENT: The dependency to the plugin share directory has not to be explicited
+DEPS: @PTEST_SUITE_DIR@/../wrapper.sh
+
+EXEC: LOG @EACSL_ERR@ @PTEST_SUITE_DIR@/../wrapper.sh "@frama-c-exe@" "@PTEST_RESULT@" "@PTEST_NAME@" "@PTEST_FILE@" "@EACSL_ERR@" "@ROOT_EACSL_GCC_MISC_OPTS@ @ROOT_EACSL_GCC_OPTS_EXT@" "@PTEST_DEFAULT_OPTIONS@ @PTEST_LOAD_OPTIONS@ @ROOT_EACSL_GCC_FC_EXTRA@ @ROOT_EACSL_GCC_FC_EXTRA_EXT@" "@ROOT_EACSL_EXEC_FILTER@"
 
 COMMENT: These next macros can be redefined in a test file
+
 COMMENT: Define the following macro in a test to pass extra options to the frama-c invocation
 MACRO: ROOT_EACSL_GCC_FC_EXTRA_EXT
+
 COMMENT: Define the following macro in a test to pass extra options to `e-acsl-gcc.sh`
 MACRO: ROOT_EACSL_GCC_OPTS_EXT
+
 COMMENT: Define the following macro in a test to filter the output of the test execution
 COMMENT: You can chain several filters by separating commands with |. However sed cannot
 COMMENT: use | as a delimiter, please use / or another character instead.
diff --git a/src/plugins/wp/Changelog b/src/plugins/wp/Changelog
index a331ea9f31b98427e2b0b62ef51d134fefe84c43..0da478f24ee96dd84251cc6b669007284fdcad64 100644
--- a/src/plugins/wp/Changelog
+++ b/src/plugins/wp/Changelog
@@ -24,6 +24,12 @@
 Plugin WP <next-release>
 ########################
 
+- TIP         [2022-01-05] New tactic Clear: remove hypothesis
+-* WP         [2022-01-05] Fix loop invariant order
+- WP          [2022-01-05] Weaken check loop invariant
+- TIP         [2021-11-30] Extended Split tactic: can split in hypotheses, can
+                           split conjunctions into multiple hypotheses.
+- WP          [2021-11-08] Removed legacy WP engine and option -wp-legacy
 
 #########################
 Plugin WP 24.0 (Chromium)
diff --git a/src/plugins/wp/Makefile.in b/src/plugins/wp/Makefile.in
index afc9ef27123cc365fa69e9ac81b39ccb9a6b8468..72ad09daf3b043ff114ba3ab2f89fdfc1681c145 100644
--- a/src/plugins/wp/Makefile.in
+++ b/src/plugins/wp/Makefile.in
@@ -86,7 +86,7 @@ PLUGIN_CMO:= \
 	CfgCompiler StmtSemantics \
 	VCS script proof wpo wpReport \
 	Footprint Tactical Strategy \
-	TacSplit TacChoice TacRange TacInduction \
+	TacClear TacSplit TacChoice TacRange TacInduction \
 	TacArray TacCompound TacUnfold \
 	TacHavoc TacInstance TacLemma \
 	TacFilter TacCut WpTac TacNormalForm \
diff --git a/src/plugins/wp/TacClear.ml b/src/plugins/wp/TacClear.ml
new file mode 100644
index 0000000000000000000000000000000000000000..62492909112d90a938b3be35e092e682a0a44e40
--- /dev/null
+++ b/src/plugins/wp/TacClear.ml
@@ -0,0 +1,41 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of WP plug-in of Frama-C.                           *)
+(*                                                                        *)
+(*  Copyright (C) 2007-2021                                               *)
+(*    CEA (Commissariat a l'energie atomique et aux energies              *)
+(*         alternatives)                                                  *)
+(*                                                                        *)
+(*  you can redistribute it and/or modify it under the terms of the GNU   *)
+(*  Lesser General Public License as published by the Free Software       *)
+(*  Foundation, version 2.1.                                              *)
+(*                                                                        *)
+(*  It is distributed in the hope that it will be useful,                 *)
+(*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *)
+(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *)
+(*  GNU Lesser General Public License for more details.                   *)
+(*                                                                        *)
+(*  See the GNU Lesser General Public License version 2.1                 *)
+(*  for more details (enclosed in the file licenses/LGPLv2.1).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Tactical
+
+class clear =
+  object(_)
+    inherit Tactical.make ~id:"Wp.clear"
+        ~title:"Clear"
+        ~descr:"Remove Hypothesis"
+        ~params:[]
+
+    method select _feedback sel =
+      match sel with
+      | Clause(Step step) ->
+          let removed = [ "Cleared hypothesis", Conditions.Have Lang.F.p_true] in
+          Applicable (Tactical.replace ~at:step.id removed)
+      | _ ->
+          Not_applicable
+  end
+
+let tactical = Tactical.export (new clear)
diff --git a/src/plugins/wp/TacClear.mli b/src/plugins/wp/TacClear.mli
new file mode 100644
index 0000000000000000000000000000000000000000..acb995cfacab566b1dc65c462e712aaf119d6590
--- /dev/null
+++ b/src/plugins/wp/TacClear.mli
@@ -0,0 +1,29 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of WP plug-in of Frama-C.                           *)
+(*                                                                        *)
+(*  Copyright (C) 2007-2021                                               *)
+(*    CEA (Commissariat a l'energie atomique et aux energies              *)
+(*         alternatives)                                                  *)
+(*                                                                        *)
+(*  you can redistribute it and/or modify it under the terms of the GNU   *)
+(*  Lesser General Public License as published by the Free Software       *)
+(*  Foundation, version 2.1.                                              *)
+(*                                                                        *)
+(*  It is distributed in the hope that it will be useful,                 *)
+(*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *)
+(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *)
+(*  GNU Lesser General Public License for more details.                   *)
+(*                                                                        *)
+(*  See the GNU Lesser General Public License version 2.1                 *)
+(*  for more details (enclosed in the file licenses/LGPLv2.1).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(** Built-in Range Tactical (auto-registered) *)
+
+open Tactical
+
+val tactical : tactical
+
+(**************************************************************************)
diff --git a/src/plugins/wp/TacFilter.ml b/src/plugins/wp/TacFilter.ml
index bf7340bc36ceddd0e43d346dc84dc74704060c5d..8d356dbe149835105e1b369841af681c4f511a0a 100644
--- a/src/plugins/wp/TacFilter.ml
+++ b/src/plugins/wp/TacFilter.ml
@@ -36,7 +36,7 @@ class filter =
   object(self)
     inherit Tactical.make ~id:"Wp.filter"
         ~title:"Filter"
-        ~descr:"Erase Hypotheses"
+        ~descr:"Dependent Erasure of Hypotheses"
         ~params:[panti]
 
     method select feedback _sel =
diff --git a/src/plugins/wp/cfgAnnot.ml b/src/plugins/wp/cfgAnnot.ml
index 0f78e501ffe8a0f7d23cf8ef0ade268282a85eea..6e114cdf7e7e3c43ddc2711387d58f28241c2a5a 100644
--- a/src/plugins/wp/cfgAnnot.ml
+++ b/src/plugins/wp/cfgAnnot.ml
@@ -468,29 +468,27 @@ let mk_variant_properties kf s ca v =
   let vdecr = Logic_const.prel ~loc (Rlt, v, vcurr) in
   (vpos_id, vpos), (vdecr_id, vdecr)
 
+type loop_hypothesis =
+  | NoHyp
+  | Check of WpPropId.prop_id
+  | Always of WpPropId.prop_id
+
+type loop_invariant = {
+  loop_hyp : loop_hypothesis ;
+  loop_est : WpPropId.prop_id option ;
+  loop_ind : WpPropId.prop_id option ;
+  loop_pred : Cil_types.predicate ;
+}
+
 type loop_contract = {
   loop_terminates: predicate option;
-  (* to be verified at loop entry *)
-  loop_established: WpPropId.pred_info list;
-  (* to be assumed for loop current *)
-  loop_invariants: WpPropId.pred_info list;
+  loop_invariants : loop_invariant list ;
   (* to be proved after loop invariants *)
   loop_smoke: WpPropId.pred_info list;
-  (* to be verified after loop body *)
-  loop_preserved: WpPropId.pred_info list;
   (* assigned by loop body *)
   loop_assigns: WpPropId.assigns_full_info list;
 }
 
-let reverse_loop_contract l = {
-  loop_terminates = l.loop_terminates ;
-  loop_established = List.rev l.loop_established ;
-  loop_invariants = List.rev l.loop_invariants ;
-  loop_preserved = List.rev l.loop_preserved ;
-  loop_assigns = List.rev l.loop_assigns ;
-  loop_smoke = List.rev l.loop_smoke ;
-}
-
 let default_assigns stmt l =
   { l with
     loop_assigns =
@@ -508,22 +506,24 @@ module LoopContract = WpContext.StaticGenerator(CodeKey)
         let normalize_annot (i,p) = i, normalize_pred p in
         let normalize_assigns w = NormAtLabels.preproc_assigns labels w in
         default_assigns stmt @@
-        reverse_loop_contract @@
         Annotations.fold_code_annot
           begin fun _emitter ca l ->
             match ca.annot_content with
             | AInvariant(_,true,inv) ->
-                let p = normalize_pred inv.tp_statement in
                 let g_hyp = WpPropId.mk_inv_hyp_id kf stmt ca in
                 let g_est, g_ind = WpPropId.mk_loop_inv kf stmt ca in
                 let admit = Logic_utils.use_predicate inv.tp_kind in
                 let verif = Logic_utils.verify_predicate inv.tp_kind in
-                let use flag id p ps = if flag then (id,p) :: ps else ps in
+                let loop_hyp = if admit then Always g_hyp else Check g_hyp in
+                let use flag id = if flag then Some id else None in
+                let inv =
+                  { loop_pred = normalize_pred inv.tp_statement ;
+                    loop_hyp ;
+                    loop_est = use verif g_est ;
+                    loop_ind = use verif g_ind ; }
+                in
                 { l with
-                  loop_established = use verif g_est p l.loop_established ;
-                  loop_invariants  = use admit g_hyp p l.loop_invariants ;
-                  loop_preserved   = use verif g_ind p l.loop_preserved ;
-                }
+                  loop_invariants  = inv :: l.loop_invariants ; }
             | AVariant(term, None) ->
                 let vpos , vdec =
                   mk_variant_properties kf stmt ca term in
@@ -539,11 +539,14 @@ module LoopContract = WpContext.StaticGenerator(CodeKey)
                     Logic_const.pimplies (t, v)
                   end else v
                 in
+                let mk_inv (i, p) =
+                  let i, p = intro_terminates @@ normalize_annot (i, p) in
+                  { loop_pred = p ;
+                    loop_hyp = NoHyp ; loop_est = None ; loop_ind = Some i }
+                in
                 { l with loop_terminates = None ;
-                         loop_preserved =
-                           intro_terminates (normalize_annot vdec) ::
-                           intro_terminates (normalize_annot vpos) ::
-                           l.loop_preserved }
+                         loop_invariants =
+                           mk_inv vdec :: mk_inv vpos :: l.loop_invariants }
             | AAssigns(_,WritesAny) ->
                 let asgn = WpPropId.mk_loop_any_assigns_info stmt in
                 { l with loop_assigns = asgn :: l.loop_assigns }
@@ -559,9 +562,7 @@ module LoopContract = WpContext.StaticGenerator(CodeKey)
             | _ -> l
           end stmt {
           loop_terminates = Some Logic_const.pfalse ;
-          loop_established = [] ;
           loop_invariants = [] ;
-          loop_preserved = [] ;
           loop_smoke = [] ;
           loop_assigns = [] ;
         }
diff --git a/src/plugins/wp/cfgAnnot.mli b/src/plugins/wp/cfgAnnot.mli
index 4d246683c330953432587370ff67cf0f8025ddd1..53c1c4659e4eee89d24c38360ef7b054af202a9d 100644
--- a/src/plugins/wp/cfgAnnot.mli
+++ b/src/plugins/wp/cfgAnnot.mli
@@ -78,16 +78,23 @@ val get_stmt_assigns : kernel_function -> stmt -> assigns_full_info list
 (* --- Property Accessors : Loop Contracts                                --- *)
 (* -------------------------------------------------------------------------- *)
 
+type loop_hypothesis =
+  | NoHyp
+  | Check of WpPropId.prop_id
+  | Always of WpPropId.prop_id
+
+type loop_invariant = {
+  loop_hyp : loop_hypothesis ;
+  loop_est : WpPropId.prop_id option ;
+  loop_ind : WpPropId.prop_id option ;
+  loop_pred : Cil_types.predicate ;
+}
+
 type loop_contract = {
   loop_terminates: predicate option;
-  (** to be verified at loop entry *)
-  loop_established: pred_info list;
-  (** to be assumed for loop current *)
-  loop_invariants: pred_info list;
+  loop_invariants: loop_invariant list;
   (** to be proved after loop invariants *)
   loop_smoke: pred_info list;
-  (** to be verified after loop body *)
-  loop_preserved: pred_info list;
   (** assigned by loop body *)
   loop_assigns: assigns_full_info list;
 }
diff --git a/src/plugins/wp/cfgCalculus.ml b/src/plugins/wp/cfgCalculus.ml
index 1d86603585d87124ecca7353fe0ff08ca1f6736f..4fba7b07405c29adbe274cefd5e4695299d724c2 100644
--- a/src/plugins/wp/cfgCalculus.ml
+++ b/src/plugins/wp/cfgCalculus.ml
@@ -182,8 +182,8 @@ struct
         then W.add_assigns env.we ai w
         else w
 
-  let use_property env (p : WpPropId.pred_info) w =
-    if is_selected ~goal:false env p then W.add_hyp env.we p w else w
+  let use_property ?for_pid env (p : WpPropId.pred_info) w =
+    if is_selected ~goal:false env p then W.add_hyp ?for_pid env.we p w else w
 
   let prove_property env (p : WpPropId.pred_info) w =
     if is_selected ~goal:true env p then W.add_goal env.we p w else w
@@ -259,14 +259,37 @@ struct
       | None, _ | _, None -> w (* no terminates goal or nothing to prove *)
       | Some t, Some prop -> prove_subproperty env t prop s FromCode w
     in
+    let prove_invariant env pid pred w =
+      match pid with None -> w | Some pid -> prove_property env (pid, pred) w
+    in
+    let assume_invariant env (hyp: CfgAnnot.loop_hypothesis) pred ind w =
+      match hyp with
+      | NoHyp -> w
+      | Check pid -> use_property ?for_pid:ind env (pid, pred) w
+      | Always pid -> use_property env (pid, pred) w
+    in
+    let established env CfgAnnot.{ loop_hyp; loop_ind; loop_est; loop_pred } w =
+      prove_invariant env loop_est loop_pred @@
+      assume_invariant env loop_hyp loop_pred loop_ind w
+    in
+    let loop_current_hyp env CfgAnnot.{ loop_hyp ; loop_ind ; loop_pred } w =
+      assume_invariant env loop_hyp loop_pred loop_ind w
+    in
+    let preserved env CfgAnnot.{ loop_hyp ; loop_ind ; loop_pred } w =
+      prove_invariant env loop_ind loop_pred @@
+      begin match loop_hyp with
+        | CfgAnnot.Always pid -> use_property env (pid, loop_pred)
+        | _ -> Extlib.id (* we never assume this one for checks *)
+      end w
+    in
     insert_terminates @@
-    List.fold_right (prove_property env) lc.loop_established @@
+    List.fold_right (established env) lc.loop_invariants @@
     List.fold_right (use_assigns env) lc.loop_assigns @@
     W.label env.we None (Clabels.loop_current s) @@
-    List.fold_right (use_property env) lc.loop_invariants @@
+    List.fold_right (loop_current_hyp env) lc.loop_invariants @@
     List.fold_right (prove_property env) lc.loop_smoke @@
     let q =
-      List.fold_right (prove_property env) lc.loop_preserved @@
+      List.fold_right (preserved env) lc.loop_invariants @@
       List.fold_right (prove_assigns env) lc.loop_assigns @@
       W.empty in
     ( Vhash.replace env.wp a (Some q) ; successors env a )
diff --git a/src/plugins/wp/cfgDump.ml b/src/plugins/wp/cfgDump.ml
index c15ac2a858f54f23f3ab69d5e3649e0dbf8c49ab..c38b30c4127d6bf3949afa58487cfdeaaab2c9c4 100644
--- a/src/plugins/wp/cfgDump.ml
+++ b/src/plugins/wp/cfgDump.ml
@@ -89,12 +89,17 @@ let new_env ?lvars kf : t_env = ignore lvars ; kf
 
 let add_axiom _p _l = ()
 
-let add_hyp _env (pid,pred) k =
+let add_hyp ?for_pid _env (pid,pred) k =
+  ignore(for_pid);
   let u = node () in
   if Wp_parameters.debug_atleast 1 then
-    Format.fprintf !out "  %a [ color=green , label=\"Assume %a\" ] ;@." pretty u Printer.pp_predicate pred
+    Format.fprintf !out "  %a [ color=green , label=\"Assume %a%a\"] ;@."
+      pretty u Printer.pp_predicate pred
+      (Pretty_utils.pp_opt ~pre:" for" WpPropId.pretty) for_pid
   else
-    Format.fprintf !out "  %a [ color=green , label=\"Assume %a\" ] ;@." pretty u WpPropId.pp_propid pid ;
+    Format.fprintf !out "  %a [ color=green , label=\"Assume %a%a\"] ;@."
+      pretty u WpPropId.pp_propid pid
+      (Pretty_utils.pp_opt ~pre:" for" WpPropId.pretty) for_pid ;
   link u k ; u
 
 let add_goal env (pid,pred) k =
diff --git a/src/plugins/wp/cfgInfos.ml b/src/plugins/wp/cfgInfos.ml
index 1ff5c4f7a9b5e692fb3b65ff1cc72244eb49ceea..c3fa404c7e5b3c500ed9b1893c1f0c304c660950 100644
--- a/src/plugins/wp/cfgInfos.ml
+++ b/src/plugins/wp/cfgInfos.ml
@@ -400,8 +400,11 @@ let loop_contract_pids kf stmt =
         | WpPropId.NoAssignsInfo | AssignsAny _ -> l
         | AssignsLocations (pid, _) -> pid :: l
       in
-      List.fold_right (fun (pid,_) l -> pid :: l) invs.loop_established @@
-      List.fold_right (fun (pid,_) l -> pid :: l) invs.loop_preserved @@
+      let verif_fold CfgAnnot.{ loop_est ; loop_ind } l =
+        let l = Option.fold ~none:l ~some:(fun i -> i :: l) loop_est in
+        Option.fold ~none:l ~some:(fun i -> i :: l) loop_ind
+      in
+      List.fold_right verif_fold invs.loop_invariants @@
       List.fold_right add_assigns invs.loop_assigns []
   | _ -> []
 
diff --git a/src/plugins/wp/cfgWP.ml b/src/plugins/wp/cfgWP.ml
index 7c5edf076e143af3de5c65afa06401a88a5fa86b..97c136c1d4f285c2cc0117b7d9dd115951496e90 100644
--- a/src/plugins/wp/cfgWP.ml
+++ b/src/plugins/wp/cfgWP.ml
@@ -484,7 +484,7 @@ struct
 
   let add_axiom _id _l = ()
 
-  let add_hyp wenv (hpid,predicate) wp = in_wenv wenv wp
+  let add_hyp ?for_pid wenv (hpid,predicate) wp = in_wenv wenv wp
       (fun env wp ->
          let outcome = Warning.catch
              ~severe:false ~effect:"Skip hypothesis"
@@ -493,7 +493,11 @@ struct
            | Warning.Result(warn,p) -> warn , [p]
            | Warning.Failed warn -> warn , []
          in
-         let vcs = gmap (assume_vc ~hpid ~warn hs) wp.vcs in
+         let assume_vc target vcs = match for_pid with
+           | Some id when not @@ PropId.equal id (TARGET.prop_id target) -> vcs
+           | _ -> Splitter.map (assume_vc ~hpid ~warn hs) vcs
+         in
+         let vcs = Gmap.mapi assume_vc wp.vcs in
          { wp with vcs = vcs })
 
   let add_goal wenv (gpid,predicate) wp = in_wenv wenv wp
diff --git a/src/plugins/wp/doc/manual/wp_plugin.tex b/src/plugins/wp/doc/manual/wp_plugin.tex
index bd11618cab799e9a36358a40b27274bc1eaad2db..c79c2da273021c4edd4880c5f0d4036010e71e3c 100644
--- a/src/plugins/wp/doc/manual/wp_plugin.tex
+++ b/src/plugins/wp/doc/manual/wp_plugin.tex
@@ -288,6 +288,11 @@ The user can select a hypothesis $H$, and change the goal to $\neg H$:
 
 $$ \TACTIC{\Delta,H\models\,G}{\Delta\models\,\neg H} $$
 
+\paragraph{Clear} Remove Hypothesis\\
+The user can select a hypothesis $H$, and remove it from the context:
+
+$$ \TACTIC{\Delta,H\models\,G}{\Delta\models\,G} $$
+
 \paragraph{Choice} Select a Goal Alternative\\
 When the goal is a disjunction, the user select one alternative and discard the others:
 $$ \TACTIC{\Delta\models\,\Gamma,G}{\Delta\models\,G} $$
@@ -301,7 +306,7 @@ $$ \TACTIC{ a = b }{ \bigwedge a.f_i = b.f_i } $$
 The user select a hypothesis (typically, a negation) and swap it with the goal.
 $$ \TACTIC{\Delta,H\models\,G}{\Delta,\neg G\models\,\neg H} $$
 
-\paragraph{Cut} Use Intermerdiate Hypothesis
+\paragraph{Cut} Use Intermediate Hypothesis
 The user introduce a new clause $C$ with the composer to prove the goal. There two variants of the tactic, made available by a menu in the tactic panel.
 
 The \textsf{Modus-Ponens} variant where the clause $C$ is used as an intermediate proof step:
@@ -322,10 +327,16 @@ $$\TACTIC{\Delta\models\,G}{%
 \paragraph{Definition} Unfold predicate and logic function definition\\
 The user simply select a term $f(e_1,\ldots,e_n)$ or a predicate $P(e_1,\ldots,e_n)$ which is replaced by its definition, when available.
 
-\paragraph{Filter} Erase Hypotheses \\
-The tactic is always applicable. It removes hypotheses from the goal on a variable used basis. When variables are compounds (record and arrays) a finer heuristics is used to detect which parts of the variable is relevant. A transitive closure of dependencies is also used. However, it is always possible that too many hypotheses are removed.
+\paragraph{Filter} Dependent Erasure of Hypotheses \\
+The tactic is always applicable. It removes hypotheses from the goal on a
+variable used basis. When variables are compounds (record and arrays) a finer
+heuristic is used to detect which parts of the variable is relevant. A
+transitive closure of dependencies is also used. However, it is always
+possible that too many hypotheses are removed.
 
-The tactic also have a variant where only hypotheses \emph{not relevant} to the goal are retained. This is useful to find absurd hypotheses that are completely disjoint from the goal.
+The tactic also have a variant where only hypotheses \emph{not relevant} to the
+goal are retained. This is useful to find absurd hypotheses that are completely
+disjoint from the goal.
 
 \paragraph{Instance} Instantiate properties\\
 The user selects a hypothesis with one or several $\forall$ quantifiers, or an $\exists$ quantified goal. Then, with the composer, the use choose to instantiate one or several of the quantified parameters. In case of $\forall$ quantifier over integer, a range of values can be instantiated instead.
diff --git a/src/plugins/wp/mcfg.mli b/src/plugins/wp/mcfg.mli
index 3ecd5a5f9a2ae8fe6549d4ba40fd9eaec575d988..3afad69feed2e4d4e6fcd96525a437f27dfd6306 100644
--- a/src/plugins/wp/mcfg.mli
+++ b/src/plugins/wp/mcfg.mli
@@ -65,7 +65,8 @@ module type S = sig
   val new_env : ?lvars:Cil_types.logic_var list -> kernel_function -> t_env
 
   val add_axiom : WpPropId.prop_id -> LogicUsage.logic_lemma -> unit
-  val add_hyp  : t_env -> WpPropId.pred_info -> t_prop -> t_prop
+  val add_hyp :
+    ?for_pid:WpPropId.prop_id -> t_env -> WpPropId.pred_info -> t_prop -> t_prop
   val add_goal : t_env -> WpPropId.pred_info -> t_prop -> t_prop
   val add_subgoal : t_env -> WpPropId.pred_info -> ?deps:Property.Set.t ->
     predicate -> stmt -> WpPropId.effect_source -> t_prop -> t_prop
diff --git a/src/plugins/wp/tests/test_config b/src/plugins/wp/tests/test_config
index 122bc50aadc0af5e1a21b2b2baf4703d6955ef59..da153c620d01ac5748f1fb26e4d9998e24888f3a 100644
--- a/src/plugins/wp/tests/test_config
+++ b/src/plugins/wp/tests/test_config
@@ -1,3 +1,3 @@
 PLUGIN: wp
-CMD: @frama-c@ -wp -wp-prover none -wp-print -wp-share ./share -wp-msg-key shell -wp-warn-key "pedantic-assigns=inactive"
+CMD: @frama-c@ -wp -wp-prover none -wp-print -wp-share @PTEST_SHARE_DIR@ -wp-msg-key shell -wp-warn-key "pedantic-assigns=inactive"
 OPT:
diff --git a/src/plugins/wp/tests/test_config_qualif b/src/plugins/wp/tests/test_config_qualif
index f0225eb3f9a0c31d90b77761394778c3a2268793..e92f71e312cedfa7a4d3d316991f7904c32d185d 100644
--- a/src/plugins/wp/tests/test_config_qualif
+++ b/src/plugins/wp/tests/test_config_qualif
@@ -1,3 +1,3 @@
 PLUGIN: wp
-CMD: @frama-c@ -wp -wp-par 1 -wp-share ./share -wp-msg-key shell -wp-warn-key pedantic-assigns=inactive -wp-report tests/qualif.report -wp-session @PTEST_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.@PTEST_NUMBER@.session -wp-cache-env -wp-cache replay @PTEST_FILE@ -wp-coq-timeout 120
+CMD: @frama-c@ -wp -wp-par 1 -wp-share @PTEST_SHARE_DIR@ -wp-msg-key shell -wp-warn-key pedantic-assigns=inactive -wp-report @PTEST_SUITE_DIR@/../qualif.report -wp-session @PTEST_SUITE_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.@PTEST_NUMBER@.session -wp-cache-env -wp-cache replay @PTEST_FILE@ -wp-coq-timeout 120
 OPT:
diff --git a/src/plugins/wp/tests/why3/test_config_qualif b/src/plugins/wp/tests/why3/test_config_qualif
index 48852719d4ee76c5006f7ed9ac20a998041f34f0..40a46bc821a47c59715d800508aabd855a13f2e1 100644
--- a/src/plugins/wp/tests/why3/test_config_qualif
+++ b/src/plugins/wp/tests/why3/test_config_qualif
@@ -1,4 +1,5 @@
 FILEREG: .*\.why
-CMD: why3 -L ./share/why3 prove -P alt-ergo
+CMD: why3 -L @PTEST_SHARE_DIR@/why3 prove -P alt-ergo
 OPT:
+COMMENT: the filter remove the information about time and steps
 FILTER: sed -e 's|\(.*\)\( (.*)\)|\1|'
diff --git a/src/plugins/wp/tests/wp/cfg_loop_deps.i b/src/plugins/wp/tests/wp/cfg_loop_deps.i
new file mode 100644
index 0000000000000000000000000000000000000000..537e37e06e6d4fc08b01e368e69f20c03fd01fe0
--- /dev/null
+++ b/src/plugins/wp/tests/wp/cfg_loop_deps.i
@@ -0,0 +1,26 @@
+/* run.config_qualif
+   DONTRUN:
+*/
+
+/*@ axiomatic Ax {
+      predicate P(integer i);
+      predicate Q(integer i);
+      predicate R(integer i);
+      predicate S(integer i);
+      predicate W(integer i);
+  }
+*/
+
+int x ;
+
+void function(void){
+  int i = 0;
+  /*@ loop invariant       Inv_P  : P(i) ;
+    @ check loop invariant Check_Q: Q(i);
+    @ admit loop invariant Admit_R: R(i);
+    @ loop invariant       Inv_S  : S(i);
+    @ loop assigns i ; */
+  while(i < 10) i++ ;
+
+  //@ check W(i);
+}
diff --git a/src/plugins/wp/tests/wp/oracle/cfg_loop_deps.res.oracle b/src/plugins/wp/tests/wp/oracle/cfg_loop_deps.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..eaea88097a769e4b15c6e6f1d7153f52f137b0c9
--- /dev/null
+++ b/src/plugins/wp/tests/wp/oracle/cfg_loop_deps.res.oracle
@@ -0,0 +1,135 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp/cfg_loop_deps.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function function
+------------------------------------------------------------
+
+Goal Preservation of Invariant 'Check_Q' (file tests/wp/cfg_loop_deps.i, line 19):
+Let x = 1 + i.
+Assume {
+  Type: is_sint32(i) /\ is_sint32(x).
+  (* Invariant 'Inv_P' *)
+  Have: P_P(0).
+  (* Invariant 'Check_Q' *)
+  Have: P_Q(0).
+  (* Invariant 'Admit_R' *)
+  Have: P_R(0).
+  (* Invariant 'Inv_S' *)
+  Have: P_S(0).
+  (* Invariant 'Inv_P' *)
+  Have: P_P(i).
+  (* Invariant 'Check_Q' *)
+  Have: P_Q(i).
+  (* Invariant 'Admit_R' *)
+  Have: P_R(i).
+  (* Invariant 'Inv_S' *)
+  Have: P_S(i).
+  (* Then *)
+  Have: i <= 9.
+  (* Invariant 'Inv_P' *)
+  Have: P_P(x).
+}
+Prove: P_Q(x).
+
+------------------------------------------------------------
+
+Goal Establishment of Invariant 'Check_Q' (file tests/wp/cfg_loop_deps.i, line 19):
+Assume { (* Invariant 'Inv_P' *) Have: P_P(0). }
+Prove: P_Q(0).
+
+------------------------------------------------------------
+
+Goal Preservation of Invariant 'Inv_P' (file tests/wp/cfg_loop_deps.i, line 18):
+Let x = 1 + i.
+Assume {
+  Type: is_sint32(i) /\ is_sint32(x).
+  (* Invariant 'Inv_P' *)
+  Have: P_P(0).
+  (* Invariant 'Admit_R' *)
+  Have: P_R(0).
+  (* Invariant 'Inv_S' *)
+  Have: P_S(0).
+  (* Invariant 'Inv_P' *)
+  Have: P_P(i).
+  (* Invariant 'Admit_R' *)
+  Have: P_R(i).
+  (* Invariant 'Inv_S' *)
+  Have: P_S(i).
+  (* Then *)
+  Have: i <= 9.
+}
+Prove: P_P(x).
+
+------------------------------------------------------------
+
+Goal Establishment of Invariant 'Inv_P' (file tests/wp/cfg_loop_deps.i, line 18):
+Prove: P_P(0).
+
+------------------------------------------------------------
+
+Goal Preservation of Invariant 'Inv_S' (file tests/wp/cfg_loop_deps.i, line 21):
+Let x = 1 + i.
+Assume {
+  Type: is_sint32(i) /\ is_sint32(x).
+  (* Invariant 'Inv_P' *)
+  Have: P_P(0).
+  (* Invariant 'Admit_R' *)
+  Have: P_R(0).
+  (* Invariant 'Inv_S' *)
+  Have: P_S(0).
+  (* Invariant 'Inv_P' *)
+  Have: P_P(i).
+  (* Invariant 'Admit_R' *)
+  Have: P_R(i).
+  (* Invariant 'Inv_S' *)
+  Have: P_S(i).
+  (* Then *)
+  Have: i <= 9.
+  (* Invariant 'Inv_P' *)
+  Have: P_P(x).
+  (* Invariant 'Admit_R' *)
+  Have: P_R(x).
+}
+Prove: P_S(x).
+
+------------------------------------------------------------
+
+Goal Establishment of Invariant 'Inv_S' (file tests/wp/cfg_loop_deps.i, line 21):
+Assume {
+  (* Invariant 'Inv_P' *)
+  Have: P_P(0).
+  (* Invariant 'Admit_R' *)
+  Have: P_R(0).
+}
+Prove: P_S(0).
+
+------------------------------------------------------------
+
+Goal Check (file tests/wp/cfg_loop_deps.i, line 25):
+Assume {
+  Type: is_sint32(i).
+  (* Invariant 'Inv_P' *)
+  Have: P_P(0).
+  (* Invariant 'Admit_R' *)
+  Have: P_R(0).
+  (* Invariant 'Inv_S' *)
+  Have: P_S(0).
+  (* Invariant 'Inv_P' *)
+  Have: P_P(i).
+  (* Invariant 'Admit_R' *)
+  Have: P_R(i).
+  (* Invariant 'Inv_S' *)
+  Have: P_S(i).
+  (* Else *)
+  Have: 10 <= i.
+}
+Prove: P_W(i).
+
+------------------------------------------------------------
+
+Goal Loop assigns (file tests/wp/cfg_loop_deps.i, line 22):
+Prove: true.
+
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memtyped.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memtyped.res.oracle
index 0b80f09a455e7c134e68840a4d7978c549798dce..5df442f16465ad9fdeec361d5332edca31bb4662 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memtyped.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memtyped.res.oracle
@@ -178,23 +178,7 @@ Prove: true.
 
 Goal Loop assigns 'CHECK' (3/3):
 Effect at line 139
-Assume {
-  Type: is_sint32(i_1) /\ is_sint32(i).
-  (* Heap *)
-  Type: (region(G_glob_82) <= 0) /\ (region(pg_0.base) <= 0) /\
-      linked(Malloc_0).
-  (* Goal *)
-  When: !invalid(Malloc_0, shift_sint32(shiftfield_F1_S_a(pg_0), i), 1).
-  (* Invariant 'CHECK' *)
-  Have: (0 <= i_1) /\ (i_1 <= 10).
-  (* Else *)
-  Have: 10 <= i_1.
-  (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
-  (* Then *)
-  Have: i <= 9.
-}
-Prove: (-1) <= i.
+Prove: true.
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -242,22 +226,7 @@ Prove: true.
 
 Goal Loop assigns 'CHECK' (3/3):
 Effect at line 115
-Assume {
-  Type: is_sint32(i_1) /\ is_sint32(i).
-  (* Heap *)
-  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
-  (* Goal *)
-  When: !invalid(Malloc_0, shift_sint32(shiftfield_F1_S_a(s), i), 1).
-  (* Invariant *)
-  Have: (0 <= i_1) /\ (i_1 <= 10).
-  (* Else *)
-  Have: 10 <= i_1.
-  (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
-  (* Then *)
-  Have: i <= 9.
-}
-Prove: (-1) <= i.
+Prove: true.
 
 ------------------------------------------------------------
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memvar.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memvar.res.oracle
index 4de0de53912a6e0648a9b3c96317d751d6de734d..1a36e609928f6a30e364d1ed25e3b2c652edf8fd 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memvar.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memvar.res.oracle
@@ -71,6 +71,8 @@ Assume {
        (forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) -> (v[i_2]=true)))))).
   (* Else *)
   Have: 10 <= i.
+  (* Invariant 'CHECK' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 <= 9) -> (v[i_2]=true))).
   (* Loop assigns 'CHECK' *)
   Have: ((s.F1_S_i) = 0) /\
       (forall i_2 : Z. ((i_2 != 0) -> ((i_2 != 2) -> ((i_2 != 4) ->
@@ -153,12 +155,21 @@ Assume {
        (forall i_5 : Z. ((0 <= i_5) -> ((i_5 < i_2) -> (v[i_5]=true)))))).
   (* Else *)
   Have: 10 <= i_2.
+  (* Invariant 'CHECK' *)
+  Have: forall i_5 : Z. ((0 <= i_5) -> ((i_5 <= 9) -> (v[i_5]=true))).
   (* Loop assigns 'CHECK' *)
   Have: ((s.F1_S_i) = 0) /\
       (forall i_5 : Z. ((i_5 != 0) -> ((i_5 != 2) -> ((i_5 != 4) ->
        ((0 <= i_5) -> ((i_5 <= 9) -> ((s.F1_S_a)[i_5] = v_1[i_5]))))))).
   (* Then *)
   Have: i_3 <= 9.
+  If i_3 = 0
+  Else {
+    Have: s = s_1.
+    If i_3 = 2
+    Then { Have: s_1 = s_2. }
+    Else { Have: s_1 = s_3. }
+  }
 }
 Prove: ((i != 0) /\ (i != 2) /\ (i != 4)) \/
     (exists i_5 : Z. (i_5 <= i_1) /\ (i_1 <= i_5) /\
@@ -304,6 +315,8 @@ Assume {
        (forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) -> (v[i_2]=true)))))).
   (* Else *)
   Have: 10 <= i_1.
+  (* Invariant 'CHECK' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 <= 9) -> (v[i_2]=true))).
   (* Loop assigns 'CHECK' *)
   Have: ((s.F1_S_i) = 0) /\
       (forall i_2 : Z. ((0 <= i_2) -> ((i_2 <= 9) ->
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/assigns_path.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/assigns_path.res.oracle
index c9a28cfb2ae210a0e5e3161fef820e7c1f8ff088..aeadb33fdec257c54d7d16ee7da53541f3edca10 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/assigns_path.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/assigns_path.res.oracle
@@ -19,12 +19,14 @@ Assume {
   (* Goal *)
   When: (0 <= i) /\ (i < n).
   (* Pre-condition *)
-  Have: (0 <= n) /\ (n <= 3).
+  Have: n <= 3.
   (* Invariant *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (Mint_0[shift_sint32(b, i_2)] = v[i_2]))).
+  Have: 0 <= n.
   (* Invariant *)
   Have: (0 <= i_1) /\ (i_1 <= n).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
+      (Mint_0[shift_sint32(b, i_2)] = v[i_2]))).
   (* Else *)
   Have: n <= i_1.
 }
@@ -38,12 +40,14 @@ Assume {
   (* Heap *)
   Type: region(b.base) <= 0.
   (* Pre-condition *)
-  Have: (0 <= n) /\ (n <= 3).
+  Have: n <= 3.
   (* Invariant *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (Mint_0[shift_sint32(b, i_1)] = v[i_1]))).
+  Have: 0 <= n.
   (* Invariant *)
   Have: (0 <= i) /\ (i <= n).
+  (* Invariant *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (Mint_0[shift_sint32(b, i_1)] = v[i_1]))).
   (* Then *)
   Have: i < n.
 }
@@ -64,14 +68,18 @@ Assume {
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 <= i).
   (* Pre-condition *)
-  Have: (0 <= n) /\ (n <= 3).
+  Have: n <= 3.
   (* Invariant *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (Mint_0[shift_sint32(b, i_2)] = v[i_2]))).
+  Have: 0 <= n.
   (* Invariant *)
   Have: (0 <= i) /\ (i <= n).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
+      (Mint_0[shift_sint32(b, i_2)] = v[i_2]))).
   (* Then *)
   Have: i < n.
+  (* Invariant *)
+  Have: (-1) <= i.
 }
 Prove: v[i <- Mint_0[shift_sint32(b, i)]][i_1] = Mint_0[shift_sint32(b, i_1)].
 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/axioms.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/axioms.res.oracle
index 0c033d5c37fae577aebb1c8b28c0890fd146820a..5fd1352b896d217838ce2c61aeb0cc57101a7141 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/axioms.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/axioms.res.oracle
@@ -10,6 +10,7 @@ Goal Post-condition 'P,todo' in 'f':
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
 Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let x_1 = 1 + b.
 Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i).
   (* Heap *)
@@ -18,11 +19,13 @@ Assume {
   Have: valid_rw(Malloc_0, a_1, 1 + b - a).
   (* Pre-condition *)
   Have: a <= b.
+  (* Invariant 'Index' *)
+  Have: a <= x_1.
+  (* Invariant 'Index' *)
+  Have: (a <= i) /\ (i <= x_1).
   (* Invariant 'Positive' *)
   Have: forall i_1 : Z. ((a <= i_1) -> ((i_1 < i) ->
       (0 < a_2[shift_sint32(t, i_1)]))).
-  (* Invariant 'Index' *)
-  Have: (a <= i) /\ (i <= (1 + b)).
   (* Else *)
   Have: b < i.
 }
@@ -34,6 +37,7 @@ Goal Post-condition 'Q' in 'f':
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
 Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let x_1 = 1 + b.
 Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i).
   (* Heap *)
@@ -42,11 +46,13 @@ Assume {
   Have: valid_rw(Malloc_0, a_1, 1 + b - a).
   (* Pre-condition *)
   Have: a <= b.
+  (* Invariant 'Index' *)
+  Have: a <= x_1.
+  (* Invariant 'Index' *)
+  Have: (a <= i) /\ (i <= x_1).
   (* Invariant 'Positive' *)
   Have: forall i_1 : Z. ((a <= i_1) -> ((i_1 < i) ->
       (0 < a_2[shift_sint32(t, i_1)]))).
-  (* Invariant 'Index' *)
-  Have: (a <= i) /\ (i <= (1 + b)).
   (* Else *)
   Have: b < i.
 }
@@ -57,24 +63,27 @@ Prove: P_Q(Malloc_0, a_2, t, a, b).
 Goal Preservation of Invariant 'Index' (file tests/wp_acsl/axioms.i, line 30):
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
-Let x_1 = 1 + i.
+Let x_1 = 1 + b.
+Let x_2 = 1 + i.
 Assume {
-  Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i) /\ is_sint32(x_1).
+  Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i) /\ is_sint32(x_2).
   (* Heap *)
   Type: (region(t.base) <= 0) /\ linked(Malloc_0).
   (* Pre-condition *)
   Have: valid_rw(Malloc_0, a_1, 1 + b - a).
   (* Pre-condition *)
   Have: a <= b.
+  (* Invariant 'Index' *)
+  Have: a <= x_1.
+  (* Invariant 'Index' *)
+  Have: (a <= i) /\ (i <= x_1).
   (* Invariant 'Positive' *)
   Have: forall i_1 : Z. ((a <= i_1) -> ((i_1 < i) ->
       (0 < havoc(Mint_undef_0, Mint_0, a_1, i - a)[shift_sint32(t, i_1)]))).
-  (* Invariant 'Index' *)
-  Have: (a <= i) /\ (i <= (1 + b)).
   (* Then *)
   Have: i <= b.
 }
-Prove: a <= x_1.
+Prove: a <= x_2.
 
 ------------------------------------------------------------
 
@@ -93,11 +102,13 @@ Prove: a <= (1 + b).
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Positive' (file tests/wp_acsl/axioms.i, line 31):
+Let x = 1 + i.
 Let a_1 = shift_sint32(t, a).
-Let x = -a.
+Let x_1 = -a.
 Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let x_2 = 1 + b.
 Assume {
-  Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i) /\ is_sint32(1 + i).
+  Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i) /\ is_sint32(x).
   (* Heap *)
   Type: (region(t.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
@@ -106,13 +117,17 @@ Assume {
   Have: valid_rw(Malloc_0, a_1, 1 + b - a).
   (* Pre-condition *)
   Have: a <= b.
+  (* Invariant 'Index' *)
+  Have: a <= x_2.
+  (* Invariant 'Index' *)
+  Have: (a <= i) /\ (i <= x_2).
   (* Invariant 'Positive' *)
   Have: forall i_2 : Z. ((a <= i_2) -> ((i_2 < i) ->
       (0 < a_2[shift_sint32(t, i_2)]))).
-  (* Invariant 'Index' *)
-  Have: (a <= i) /\ (i <= (1 + b)).
   (* Then *)
   Have: i <= b.
+  (* Invariant 'Index' *)
+  Have: a <= x.
 }
 Prove: 0 < a_2[shift_sint32(t, i) <- 1][shift_sint32(t, i_1)].
 
@@ -138,33 +153,44 @@ Goal Loop assigns (file tests/wp_acsl/axioms.i, line 32) (3/3):
 Effect at line 34
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
-Let a_2 = shift_sint32(t, i).
+Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let a_3 = shift_sint32(t, i).
+Let x_1 = 1 + i.
+Let x_2 = 1 + b.
 Assume {
-  Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i) /\ is_sint32(1 + i).
+  Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i) /\ is_sint32(x_1).
   (* Heap *)
   Type: (region(t.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
-  When: !invalid(Malloc_0, a_2, 1).
+  When: !invalid(Malloc_0, a_3, 1).
   (* Pre-condition *)
   Have: valid_rw(Malloc_0, a_1, 1 + b - a).
   (* Pre-condition *)
   Have: a <= b.
+  (* Invariant 'Index' *)
+  Have: a <= x_2.
+  (* Invariant 'Index' *)
+  Have: (a <= i) /\ (i <= x_2).
   (* Invariant 'Positive' *)
   Have: forall i_1 : Z. ((a <= i_1) -> ((i_1 < i) ->
-      (0 < havoc(Mint_undef_0, Mint_0, a_1, i - a)[shift_sint32(t, i_1)]))).
-  (* Invariant 'Index' *)
-  Have: (a <= i) /\ (i <= (1 + b)).
+      (0 < a_2[shift_sint32(t, i_1)]))).
   (* Then *)
   Have: i <= b.
+  (* Invariant 'Index' *)
+  Have: a <= x_1.
+  (* Invariant 'Positive' *)
+  Have: forall i_1 : Z. ((i_1 <= i) -> ((a <= i_1) ->
+      (0 < a_2[a_3 <- 1][shift_sint32(t, i_1)]))).
 }
-Prove: included(a_2, 1, a_1, 1 + i - a).
+Prove: included(a_3, 1, a_1, 1 + i - a).
 
 ------------------------------------------------------------
 
 Goal Assigns 'todo' in 'f':
 Effect at line 34
+Let x = 1 + b.
 Let a_1 = shift_sint32(t, a).
-Let x = -a.
+Let x_1 = -a.
 Assume {
   Have: a < i.
   Have: !invalid(Malloc_0, a_1, i - a).
@@ -175,7 +201,9 @@ Assume {
   Have: valid_rw(Malloc_0, a_1, 1 + b - a).
   (* Pre-condition *)
   Have: a <= b.
+  (* Invariant 'Index' *)
+  Have: a <= x.
 }
-Prove: i <= (1 + b).
+Prove: i <= x.
 
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing.res.oracle
index 9455596589a8251499921bc9d809de03f2277ff9..4a107de7f65b85f4e0234c466cff9d0d699d5508 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing.res.oracle
@@ -7,38 +7,38 @@
 ------------------------------------------------------------
 
 Goal Post-condition (file tests/wp_acsl/chunk_typing.i, line 15) in 'function':
-Let a = shift_sint8(i8_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, 10).
-Let a_2 = shift_uint8(u8_0, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, 10).
-Let a_4 = shift_sint16(i16_0, 0).
-Let a_5 = havoc(Mint_undef_1, Mint_1, a_4, 10).
-Let a_6 = shift_uint16(u16_0, 0).
-Let a_7 = havoc(Mint_undef_2, Mint_2, a_6, 10).
-Let a_8 = shift_sint32(i32_0, 0).
-Let a_9 = havoc(Mint_undef_3, Mint_3, a_8, 10).
-Let a_10 = shift_uint32(u32_0, 0).
-Let a_11 = havoc(Mint_undef_4, Mint_4, a_10, 10).
-Let a_12 = shift_sint64(i64_0, 0).
-Let a_13 = havoc(Mint_undef_5, Mint_5, a_12, 10).
-Let a_14 = shift_uint64(u64_0, 0).
-Let a_15 = havoc(Mint_undef_6, Mint_6, a_14, 10).
-Let a_16 = a_1[shift_sint8(i8_0, i)].
-Let a_17 = a_3[shift_uint8(u8_0, i)].
-Let a_18 = a_5[shift_sint16(i16_0, i)].
-Let a_19 = a_7[shift_uint16(u16_0, i)].
-Let a_20 = a_9[shift_sint32(i32_0, i)].
-Let a_21 = a_11[shift_uint32(u32_0, i)].
-Let a_22 = a_13[shift_sint64(i64_0, i)].
+Let a = shift_uint64(u64_0, 0).
+Let a_1 = havoc(Mint_undef_6, Mint_6, a, 10).
+Let a_2 = shift_sint64(i64_0, 0).
+Let a_3 = havoc(Mint_undef_5, Mint_5, a_2, 10).
+Let a_4 = shift_uint32(u32_0, 0).
+Let a_5 = havoc(Mint_undef_4, Mint_4, a_4, 10).
+Let a_6 = shift_sint32(i32_0, 0).
+Let a_7 = havoc(Mint_undef_3, Mint_3, a_6, 10).
+Let a_8 = shift_uint16(u16_0, 0).
+Let a_9 = havoc(Mint_undef_2, Mint_2, a_8, 10).
+Let a_10 = shift_sint16(i16_0, 0).
+Let a_11 = havoc(Mint_undef_1, Mint_1, a_10, 10).
+Let a_12 = shift_uint8(u8_0, 0).
+Let a_13 = havoc(Mint_undef_0, Mint_0, a_12, 10).
+Let a_14 = shift_sint8(i8_0, 0).
+Let a_15 = havoc(Mchar_undef_0, Mchar_0, a_14, 10).
+Let a_16 = a_15[shift_sint8(i8_0, i)].
+Let a_17 = a_13[shift_uint8(u8_0, i)].
+Let a_18 = a_11[shift_sint16(i16_0, i)].
+Let a_19 = a_9[shift_uint16(u16_0, i)].
+Let a_20 = a_7[shift_sint32(i32_0, i)].
+Let a_21 = a_5[shift_uint32(u32_0, i)].
+Let a_22 = a_3[shift_sint64(i64_0, i)].
 Assume {
   Type: IsArray_sint8(x) /\ is_sint16_chunk(Mint_1) /\
       is_sint32_chunk(Mint_3) /\ is_sint64_chunk(Mint_5) /\
       is_sint8_chunk(Mchar_0) /\ is_uint16_chunk(Mint_2) /\
       is_uint32_chunk(Mint_4) /\ is_uint64_chunk(Mint_6) /\
-      is_uint8_chunk(Mint_0) /\ is_sint32(i_1) /\ is_sint16_chunk(a_5) /\
-      is_sint32_chunk(a_9) /\ is_sint64_chunk(a_13) /\ is_sint8_chunk(a_1) /\
-      is_uint16_chunk(a_7) /\ is_uint32_chunk(a_11) /\
-      is_uint64_chunk(a_15) /\ is_uint8_chunk(a_3).
+      is_uint8_chunk(Mint_0) /\ is_sint32(i_1) /\ is_sint16_chunk(a_11) /\
+      is_sint32_chunk(a_7) /\ is_sint64_chunk(a_3) /\ is_sint8_chunk(a_15) /\
+      is_uint16_chunk(a_9) /\ is_uint32_chunk(a_5) /\ is_uint64_chunk(a_1) /\
+      is_uint8_chunk(a_13).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -50,42 +50,42 @@ Assume {
   (* Initializer *)
   Init: forall i_2 : Z. ((0 <= i_2) -> ((i_2 <= 9) -> (x[i_2] = 0))).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_4, 10) /\ valid_rw(Malloc_0, a_8, 10) /\
-      valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a, 10) /\
-      valid_rw(Malloc_0, a_6, 10) /\ valid_rw(Malloc_0, a_10, 10) /\
-      valid_rw(Malloc_0, a_14, 10) /\ valid_rw(Malloc_0, a_2, 10).
+  Have: valid_rw(Malloc_0, a_10, 10) /\ valid_rw(Malloc_0, a_6, 10) /\
+      valid_rw(Malloc_0, a_2, 10) /\ valid_rw(Malloc_0, a_14, 10) /\
+      valid_rw(Malloc_0, a_8, 10) /\ valid_rw(Malloc_0, a_4, 10) /\
+      valid_rw(Malloc_0, a, 10) /\ valid_rw(Malloc_0, a_12, 10).
   (* Invariant *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_15[shift_uint64(u64_0, i_2)] = 8))).
+  Have: (0 <= i_1) /\ (i_1 <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_13[shift_sint64(i64_0, i_2)] = 7))).
+      (a_15[shift_sint8(i8_0, i_2)] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_11[shift_uint32(u32_0, i_2)] = 6))).
+      (a_13[shift_uint8(u8_0, i_2)] = 2))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_9[shift_sint32(i32_0, i_2)] = 5))).
+      (a_11[shift_sint16(i16_0, i_2)] = 3))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_7[shift_uint16(u16_0, i_2)] = 4))).
+      (a_9[shift_uint16(u16_0, i_2)] = 4))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_5[shift_sint16(i16_0, i_2)] = 3))).
+      (a_7[shift_sint32(i32_0, i_2)] = 5))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_3[shift_uint8(u8_0, i_2)] = 2))).
+      (a_5[shift_uint32(u32_0, i_2)] = 6))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_1[shift_sint8(i8_0, i_2)] = 1))).
+      (a_3[shift_sint64(i64_0, i_2)] = 7))).
   (* Invariant *)
-  Have: (0 <= i_1) /\ (i_1 <= 10).
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
+      (a_1[shift_uint64(u64_0, i_2)] = 8))).
   (* Else *)
   Have: 10 <= i_1.
 }
 Prove: (a_16 = (1 + x[i])) /\ (a_17 = (1 + a_16)) /\ (a_18 = (1 + a_17)) /\
     (a_19 = (1 + a_18)) /\ (a_20 = (1 + a_19)) /\ (a_21 = (1 + a_20)) /\
-    (a_22 = (1 + a_21)) /\ (a_15[shift_uint64(u64_0, i)] = (1 + a_22)).
+    (a_22 = (1 + a_21)) /\ (a_1[shift_uint64(u64_0, i)] = (1 + a_22)).
 
 ------------------------------------------------------------
 
@@ -98,35 +98,35 @@ Let a_4 = shift_uint16(u16_0, i).
 Let a_5 = shift_sint16(i16_0, i).
 Let a_6 = shift_uint8(u8_0, i).
 Let a_7 = shift_sint8(i8_0, i).
-Let a_8 = shift_sint8(i8_0, 0).
-Let a_9 = havoc(Mchar_undef_0, Mchar_0, a_8, 10).
-Let a_10 = shift_uint8(u8_0, 0).
-Let a_11 = havoc(Mint_undef_6, Mint_6, a_10, 10).
-Let a_12 = shift_sint16(i16_0, 0).
-Let a_13 = havoc(Mint_undef_0, Mint_0, a_12, 10).
-Let a_14 = shift_uint16(u16_0, 0).
-Let a_15 = havoc(Mint_undef_3, Mint_3, a_14, 10).
-Let a_16 = shift_sint32(i32_0, 0).
-Let a_17 = havoc(Mint_undef_1, Mint_1, a_16, 10).
-Let a_18 = shift_uint32(u32_0, 0).
-Let a_19 = havoc(Mint_undef_4, Mint_4, a_18, 10).
-Let a_20 = shift_sint64(i64_0, 0).
-Let a_21 = havoc(Mint_undef_2, Mint_2, a_20, 10).
-Let a_22 = shift_uint64(u64_0, 0).
-Let a_23 = havoc(Mint_undef_5, Mint_5, a_22, 10).
+Let a_8 = shift_uint64(u64_0, 0).
+Let a_9 = havoc(Mint_undef_5, Mint_5, a_8, 10).
+Let a_10 = shift_sint64(i64_0, 0).
+Let a_11 = havoc(Mint_undef_2, Mint_2, a_10, 10).
+Let a_12 = shift_uint32(u32_0, 0).
+Let a_13 = havoc(Mint_undef_4, Mint_4, a_12, 10).
+Let a_14 = shift_sint32(i32_0, 0).
+Let a_15 = havoc(Mint_undef_1, Mint_1, a_14, 10).
+Let a_16 = shift_uint16(u16_0, 0).
+Let a_17 = havoc(Mint_undef_3, Mint_3, a_16, 10).
+Let a_18 = shift_sint16(i16_0, 0).
+Let a_19 = havoc(Mint_undef_0, Mint_0, a_18, 10).
+Let a_20 = shift_uint8(u8_0, 0).
+Let a_21 = havoc(Mint_undef_6, Mint_6, a_20, 10).
+Let a_22 = shift_sint8(i8_0, 0).
+Let a_23 = havoc(Mchar_undef_0, Mchar_0, a_22, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_3) /\ is_uint32_chunk(Mint_4) /\
       is_uint64_chunk(Mint_5) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint32(1 + i) /\ is_sint16_chunk(a_13) /\ is_sint32_chunk(a_17) /\
-      is_sint64_chunk(a_21) /\ is_sint8_chunk(a_9) /\
-      is_uint16_chunk(a_15) /\ is_uint32_chunk(a_19) /\
-      is_uint64_chunk(a_23) /\ is_uint8_chunk(a_11) /\
-      is_sint16_chunk(a_13[a_5 <- 3]) /\ is_sint32_chunk(a_17[a_3 <- 5]) /\
-      is_sint64_chunk(a_21[a_1 <- 7]) /\ is_sint8_chunk(a_9[a_7 <- 1]) /\
-      is_uint16_chunk(a_15[a_4 <- 4]) /\ is_uint32_chunk(a_19[a_2 <- 6]) /\
-      is_uint64_chunk(a_23[a <- 8]) /\ is_uint8_chunk(a_11[a_6 <- 2]).
+      is_sint32(1 + i) /\ is_sint16_chunk(a_19) /\ is_sint32_chunk(a_15) /\
+      is_sint64_chunk(a_11) /\ is_sint8_chunk(a_23) /\
+      is_uint16_chunk(a_17) /\ is_uint32_chunk(a_13) /\
+      is_uint64_chunk(a_9) /\ is_uint8_chunk(a_21) /\
+      is_sint16_chunk(a_19[a_5 <- 3]) /\ is_sint32_chunk(a_15[a_3 <- 5]) /\
+      is_sint64_chunk(a_11[a_1 <- 7]) /\ is_sint8_chunk(a_23[a_7 <- 1]) /\
+      is_uint16_chunk(a_17[a_4 <- 4]) /\ is_uint32_chunk(a_13[a_2 <- 6]) /\
+      is_uint64_chunk(a_9[a <- 8]) /\ is_uint8_chunk(a_21[a_6 <- 2]).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -134,36 +134,36 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a_16, 10) /\
-      valid_rw(Malloc_0, a_20, 10) /\ valid_rw(Malloc_0, a_8, 10) /\
-      valid_rw(Malloc_0, a_14, 10) /\ valid_rw(Malloc_0, a_18, 10) /\
-      valid_rw(Malloc_0, a_22, 10) /\ valid_rw(Malloc_0, a_10, 10).
+  Have: valid_rw(Malloc_0, a_18, 10) /\ valid_rw(Malloc_0, a_14, 10) /\
+      valid_rw(Malloc_0, a_10, 10) /\ valid_rw(Malloc_0, a_22, 10) /\
+      valid_rw(Malloc_0, a_16, 10) /\ valid_rw(Malloc_0, a_12, 10) /\
+      valid_rw(Malloc_0, a_8, 10) /\ valid_rw(Malloc_0, a_20, 10).
   (* Invariant *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_23[shift_uint64(u64_0, i_1)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_21[shift_sint64(i64_0, i_1)] = 7))).
+      (a_23[shift_sint8(i8_0, i_1)] = 1))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_19[shift_uint32(u32_0, i_1)] = 6))).
+      (a_21[shift_uint8(u8_0, i_1)] = 2))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_17[shift_sint32(i32_0, i_1)] = 5))).
+      (a_19[shift_sint16(i16_0, i_1)] = 3))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_15[shift_uint16(u16_0, i_1)] = 4))).
+      (a_17[shift_uint16(u16_0, i_1)] = 4))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_13[shift_sint16(i16_0, i_1)] = 3))).
+      (a_15[shift_sint32(i32_0, i_1)] = 5))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_11[shift_uint8(u8_0, i_1)] = 2))).
+      (a_13[shift_uint32(u32_0, i_1)] = 6))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_9[shift_sint8(i8_0, i_1)] = 1))).
+      (a_11[shift_sint64(i64_0, i_1)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_9[shift_uint64(u64_0, i_1)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
@@ -203,36 +203,36 @@ Let a_4 = shift_uint16(u16_0, i).
 Let a_5 = shift_sint16(i16_0, i).
 Let a_6 = shift_uint8(u8_0, i).
 Let a_7 = shift_sint8(i8_0, i).
-Let a_8 = shift_sint8(i8_0, 0).
-Let a_9 = havoc(Mchar_undef_0, Mchar_0, a_8, 10).
-Let a_10 = shift_uint8(u8_0, 0).
-Let a_11 = havoc(Mint_undef_6, Mint_6, a_10, 10).
-Let a_12 = shift_sint16(i16_0, 0).
-Let a_13 = havoc(Mint_undef_0, Mint_0, a_12, 10).
-Let a_14 = shift_uint16(u16_0, 0).
-Let a_15 = havoc(Mint_undef_3, Mint_3, a_14, 10).
-Let a_16 = shift_sint32(i32_0, 0).
-Let a_17 = havoc(Mint_undef_1, Mint_1, a_16, 10).
-Let a_18 = shift_uint32(u32_0, 0).
-Let a_19 = havoc(Mint_undef_4, Mint_4, a_18, 10).
-Let a_20 = shift_sint64(i64_0, 0).
-Let a_21 = havoc(Mint_undef_2, Mint_2, a_20, 10).
-Let a_22 = shift_uint64(u64_0, 0).
-Let a_23 = havoc(Mint_undef_5, Mint_5, a_22, 10).
-Let a_24 = a_9[a_7 <- 1].
+Let a_8 = shift_uint64(u64_0, 0).
+Let a_9 = havoc(Mint_undef_5, Mint_5, a_8, 10).
+Let a_10 = shift_sint64(i64_0, 0).
+Let a_11 = havoc(Mint_undef_2, Mint_2, a_10, 10).
+Let a_12 = shift_uint32(u32_0, 0).
+Let a_13 = havoc(Mint_undef_4, Mint_4, a_12, 10).
+Let a_14 = shift_sint32(i32_0, 0).
+Let a_15 = havoc(Mint_undef_1, Mint_1, a_14, 10).
+Let a_16 = shift_uint16(u16_0, 0).
+Let a_17 = havoc(Mint_undef_3, Mint_3, a_16, 10).
+Let a_18 = shift_sint16(i16_0, 0).
+Let a_19 = havoc(Mint_undef_0, Mint_0, a_18, 10).
+Let a_20 = shift_uint8(u8_0, 0).
+Let a_21 = havoc(Mint_undef_6, Mint_6, a_20, 10).
+Let a_22 = shift_sint8(i8_0, 0).
+Let a_23 = havoc(Mchar_undef_0, Mchar_0, a_22, 10).
+Let a_24 = a_23[a_7 <- 1].
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_3) /\ is_uint32_chunk(Mint_4) /\
       is_uint64_chunk(Mint_5) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint32(1 + i) /\ is_sint16_chunk(a_13) /\ is_sint32_chunk(a_17) /\
-      is_sint64_chunk(a_21) /\ is_sint8_chunk(a_9) /\
-      is_uint16_chunk(a_15) /\ is_uint32_chunk(a_19) /\
-      is_uint64_chunk(a_23) /\ is_uint8_chunk(a_11) /\
-      is_sint16_chunk(a_13[a_5 <- 3]) /\ is_sint32_chunk(a_17[a_3 <- 5]) /\
-      is_sint64_chunk(a_21[a_1 <- 7]) /\ is_sint8_chunk(a_24) /\
-      is_uint16_chunk(a_15[a_4 <- 4]) /\ is_uint32_chunk(a_19[a_2 <- 6]) /\
-      is_uint64_chunk(a_23[a <- 8]) /\ is_uint8_chunk(a_11[a_6 <- 2]).
+      is_sint32(1 + i) /\ is_sint16_chunk(a_19) /\ is_sint32_chunk(a_15) /\
+      is_sint64_chunk(a_11) /\ is_sint8_chunk(a_23) /\
+      is_uint16_chunk(a_17) /\ is_uint32_chunk(a_13) /\
+      is_uint64_chunk(a_9) /\ is_uint8_chunk(a_21) /\
+      is_sint16_chunk(a_19[a_5 <- 3]) /\ is_sint32_chunk(a_15[a_3 <- 5]) /\
+      is_sint64_chunk(a_11[a_1 <- 7]) /\ is_sint8_chunk(a_24) /\
+      is_uint16_chunk(a_17[a_4 <- 4]) /\ is_uint32_chunk(a_13[a_2 <- 6]) /\
+      is_uint64_chunk(a_9[a <- 8]) /\ is_uint8_chunk(a_21[a_6 <- 2]).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -240,38 +240,38 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 <= i).
+  When: (i_1 <= i) /\ (0 <= i_1).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a_16, 10) /\
-      valid_rw(Malloc_0, a_20, 10) /\ valid_rw(Malloc_0, a_8, 10) /\
-      valid_rw(Malloc_0, a_14, 10) /\ valid_rw(Malloc_0, a_18, 10) /\
-      valid_rw(Malloc_0, a_22, 10) /\ valid_rw(Malloc_0, a_10, 10).
+  Have: valid_rw(Malloc_0, a_18, 10) /\ valid_rw(Malloc_0, a_14, 10) /\
+      valid_rw(Malloc_0, a_10, 10) /\ valid_rw(Malloc_0, a_22, 10) /\
+      valid_rw(Malloc_0, a_16, 10) /\ valid_rw(Malloc_0, a_12, 10) /\
+      valid_rw(Malloc_0, a_8, 10) /\ valid_rw(Malloc_0, a_20, 10).
   (* Invariant *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_23[shift_uint64(u64_0, i_2)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_21[shift_sint64(i64_0, i_2)] = 7))).
+      (a_23[shift_sint8(i8_0, i_2)] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_19[shift_uint32(u32_0, i_2)] = 6))).
+      (a_21[shift_uint8(u8_0, i_2)] = 2))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_17[shift_sint32(i32_0, i_2)] = 5))).
+      (a_19[shift_sint16(i16_0, i_2)] = 3))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_15[shift_uint16(u16_0, i_2)] = 4))).
+      (a_17[shift_uint16(u16_0, i_2)] = 4))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_13[shift_sint16(i16_0, i_2)] = 3))).
+      (a_15[shift_sint32(i32_0, i_2)] = 5))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_11[shift_uint8(u8_0, i_2)] = 2))).
+      (a_13[shift_uint32(u32_0, i_2)] = 6))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_9[shift_sint8(i8_0, i_2)] = 1))).
+      (a_11[shift_sint64(i64_0, i_2)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
+      (a_9[shift_uint64(u64_0, i_2)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
@@ -292,6 +292,8 @@ Assume {
   Have: valid_rw(Malloc_0, a, 1).
   (* Assertion 'rte,signed_overflow' *)
   Have: i <= 2147483646.
+  (* Invariant *)
+  Have: (-1) <= i.
 }
 Prove: a_24[shift_sint8(i8_0, i_1)] = 1.
 
@@ -303,44 +305,45 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant (file tests/wp_acsl/chunk_typing.i, line 33):
-Let a = shift_uint64(u64_0, i).
-Let a_1 = shift_sint64(i64_0, i).
-Let a_2 = shift_uint32(u32_0, i).
-Let a_3 = shift_sint32(i32_0, i).
-Let a_4 = shift_uint16(u16_0, i).
-Let a_5 = shift_sint16(i16_0, i).
-Let a_6 = shift_uint8(u8_0, i).
-Let a_7 = shift_sint8(i8_0, i).
-Let a_8 = shift_sint8(i8_0, 0).
-Let a_9 = havoc(Mchar_undef_0, Mchar_0, a_8, 10).
-Let a_10 = shift_uint8(u8_0, 0).
-Let a_11 = havoc(Mint_undef_0, Mint_0, a_10, 10).
-Let a_12 = shift_sint16(i16_0, 0).
-Let a_13 = havoc(Mint_undef_1, Mint_1, a_12, 10).
-Let a_14 = shift_uint16(u16_0, 0).
-Let a_15 = havoc(Mint_undef_4, Mint_4, a_14, 10).
-Let a_16 = shift_sint32(i32_0, 0).
-Let a_17 = havoc(Mint_undef_2, Mint_2, a_16, 10).
-Let a_18 = shift_uint32(u32_0, 0).
-Let a_19 = havoc(Mint_undef_5, Mint_5, a_18, 10).
-Let a_20 = shift_sint64(i64_0, 0).
-Let a_21 = havoc(Mint_undef_3, Mint_3, a_20, 10).
-Let a_22 = shift_uint64(u64_0, 0).
-Let a_23 = havoc(Mint_undef_6, Mint_6, a_22, 10).
-Let a_24 = a_11[a_6 <- 2].
+Let a = shift_sint8(i8_0, 0).
+Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, 10).
+Let a_2 = shift_sint8(i8_0, i).
+Let a_3 = a_1[a_2 <- 1].
+Let a_4 = shift_uint64(u64_0, i).
+Let a_5 = shift_sint64(i64_0, i).
+Let a_6 = shift_uint32(u32_0, i).
+Let a_7 = shift_sint32(i32_0, i).
+Let a_8 = shift_uint16(u16_0, i).
+Let a_9 = shift_sint16(i16_0, i).
+Let a_10 = shift_uint8(u8_0, i).
+Let a_11 = shift_uint64(u64_0, 0).
+Let a_12 = havoc(Mint_undef_6, Mint_6, a_11, 10).
+Let a_13 = shift_sint64(i64_0, 0).
+Let a_14 = havoc(Mint_undef_3, Mint_3, a_13, 10).
+Let a_15 = shift_uint32(u32_0, 0).
+Let a_16 = havoc(Mint_undef_5, Mint_5, a_15, 10).
+Let a_17 = shift_sint32(i32_0, 0).
+Let a_18 = havoc(Mint_undef_2, Mint_2, a_17, 10).
+Let a_19 = shift_uint16(u16_0, 0).
+Let a_20 = havoc(Mint_undef_4, Mint_4, a_19, 10).
+Let a_21 = shift_sint16(i16_0, 0).
+Let a_22 = havoc(Mint_undef_1, Mint_1, a_21, 10).
+Let a_23 = shift_uint8(u8_0, 0).
+Let a_24 = havoc(Mint_undef_0, Mint_0, a_23, 10).
+Let a_25 = a_24[a_10 <- 2].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_2) /\
       is_sint64_chunk(Mint_3) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_4) /\ is_uint32_chunk(Mint_5) /\
       is_uint64_chunk(Mint_6) /\ is_uint8_chunk(Mint_0) /\ is_sint32(i) /\
-      is_sint32(1 + i) /\ is_sint16_chunk(a_13) /\ is_sint32_chunk(a_17) /\
-      is_sint64_chunk(a_21) /\ is_sint8_chunk(a_9) /\
-      is_uint16_chunk(a_15) /\ is_uint32_chunk(a_19) /\
-      is_uint64_chunk(a_23) /\ is_uint8_chunk(a_11) /\
-      is_sint16_chunk(a_13[a_5 <- 3]) /\ is_sint32_chunk(a_17[a_3 <- 5]) /\
-      is_sint64_chunk(a_21[a_1 <- 7]) /\ is_sint8_chunk(a_9[a_7 <- 1]) /\
-      is_uint16_chunk(a_15[a_4 <- 4]) /\ is_uint32_chunk(a_19[a_2 <- 6]) /\
-      is_uint64_chunk(a_23[a <- 8]) /\ is_uint8_chunk(a_24).
+      is_sint32(1 + i) /\ is_sint16_chunk(a_22) /\ is_sint32_chunk(a_18) /\
+      is_sint64_chunk(a_14) /\ is_sint8_chunk(a_1) /\
+      is_uint16_chunk(a_20) /\ is_uint32_chunk(a_16) /\
+      is_uint64_chunk(a_12) /\ is_uint8_chunk(a_24) /\
+      is_sint16_chunk(a_22[a_9 <- 3]) /\ is_sint32_chunk(a_18[a_7 <- 5]) /\
+      is_sint64_chunk(a_14[a_5 <- 7]) /\ is_sint8_chunk(a_3) /\
+      is_uint16_chunk(a_20[a_8 <- 4]) /\ is_uint32_chunk(a_16[a_6 <- 6]) /\
+      is_uint64_chunk(a_12[a_4 <- 8]) /\ is_uint8_chunk(a_25).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -348,60 +351,65 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 <= i).
+  When: (i_1 <= i) /\ (0 <= i_1).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a_16, 10) /\
-      valid_rw(Malloc_0, a_20, 10) /\ valid_rw(Malloc_0, a_8, 10) /\
-      valid_rw(Malloc_0, a_14, 10) /\ valid_rw(Malloc_0, a_18, 10) /\
-      valid_rw(Malloc_0, a_22, 10) /\ valid_rw(Malloc_0, a_10, 10).
+  Have: valid_rw(Malloc_0, a_21, 10) /\ valid_rw(Malloc_0, a_17, 10) /\
+      valid_rw(Malloc_0, a_13, 10) /\ valid_rw(Malloc_0, a, 10) /\
+      valid_rw(Malloc_0, a_19, 10) /\ valid_rw(Malloc_0, a_15, 10) /\
+      valid_rw(Malloc_0, a_11, 10) /\ valid_rw(Malloc_0, a_23, 10).
   (* Invariant *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_23[shift_uint64(u64_0, i_2)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_21[shift_sint64(i64_0, i_2)] = 7))).
+      (a_1[shift_sint8(i8_0, i_2)] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_19[shift_uint32(u32_0, i_2)] = 6))).
+      (a_24[shift_uint8(u8_0, i_2)] = 2))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_17[shift_sint32(i32_0, i_2)] = 5))).
+      (a_22[shift_sint16(i16_0, i_2)] = 3))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_15[shift_uint16(u16_0, i_2)] = 4))).
+      (a_20[shift_uint16(u16_0, i_2)] = 4))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_13[shift_sint16(i16_0, i_2)] = 3))).
+      (a_18[shift_sint32(i32_0, i_2)] = 5))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_11[shift_uint8(u8_0, i_2)] = 2))).
+      (a_16[shift_uint32(u32_0, i_2)] = 6))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_9[shift_sint8(i8_0, i_2)] = 1))).
+      (a_14[shift_sint64(i64_0, i_2)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
+      (a_12[shift_uint64(u64_0, i_2)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_7, 1).
+  Have: valid_rw(Malloc_0, a_2, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_6, 1).
+  Have: valid_rw(Malloc_0, a_10, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_5, 1).
+  Have: valid_rw(Malloc_0, a_9, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_4, 1).
+  Have: valid_rw(Malloc_0, a_8, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_3, 1).
+  Have: valid_rw(Malloc_0, a_7, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_2, 1).
+  Have: valid_rw(Malloc_0, a_6, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_1, 1).
+  Have: valid_rw(Malloc_0, a_5, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a, 1).
+  Have: valid_rw(Malloc_0, a_4, 1).
   (* Assertion 'rte,signed_overflow' *)
   Have: i <= 2147483646.
+  (* Invariant *)
+  Have: (-1) <= i.
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_3[shift_sint8(i8_0, i_2)] = 1))).
 }
-Prove: a_24[shift_uint8(u8_0, i_1)] = 2.
+Prove: a_25[shift_uint8(u8_0, i_1)] = 2.
 
 ------------------------------------------------------------
 
@@ -411,44 +419,46 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant (file tests/wp_acsl/chunk_typing.i, line 34):
-Let a = shift_uint64(u64_0, i).
-Let a_1 = shift_sint64(i64_0, i).
-Let a_2 = shift_uint32(u32_0, i).
-Let a_3 = shift_sint32(i32_0, i).
-Let a_4 = shift_uint16(u16_0, i).
-Let a_5 = shift_sint16(i16_0, i).
-Let a_6 = shift_uint8(u8_0, i).
-Let a_7 = shift_sint8(i8_0, i).
-Let a_8 = shift_sint8(i8_0, 0).
-Let a_9 = havoc(Mchar_undef_0, Mchar_0, a_8, 10).
-Let a_10 = shift_uint8(u8_0, 0).
-Let a_11 = havoc(Mint_undef_6, Mint_6, a_10, 10).
-Let a_12 = shift_sint16(i16_0, 0).
-Let a_13 = havoc(Mint_undef_0, Mint_0, a_12, 10).
-Let a_14 = shift_uint16(u16_0, 0).
-Let a_15 = havoc(Mint_undef_3, Mint_3, a_14, 10).
-Let a_16 = shift_sint32(i32_0, 0).
-Let a_17 = havoc(Mint_undef_1, Mint_1, a_16, 10).
+Let a = shift_uint8(u8_0, 0).
+Let a_1 = havoc(Mint_undef_6, Mint_6, a, 10).
+Let a_2 = shift_uint8(u8_0, i).
+Let a_3 = a_1[a_2 <- 2].
+Let a_4 = shift_sint8(i8_0, 0).
+Let a_5 = havoc(Mchar_undef_0, Mchar_0, a_4, 10).
+Let a_6 = shift_sint8(i8_0, i).
+Let a_7 = a_5[a_6 <- 1].
+Let a_8 = shift_uint64(u64_0, i).
+Let a_9 = shift_sint64(i64_0, i).
+Let a_10 = shift_uint32(u32_0, i).
+Let a_11 = shift_sint32(i32_0, i).
+Let a_12 = shift_uint16(u16_0, i).
+Let a_13 = shift_sint16(i16_0, i).
+Let a_14 = shift_uint64(u64_0, 0).
+Let a_15 = havoc(Mint_undef_5, Mint_5, a_14, 10).
+Let a_16 = shift_sint64(i64_0, 0).
+Let a_17 = havoc(Mint_undef_2, Mint_2, a_16, 10).
 Let a_18 = shift_uint32(u32_0, 0).
 Let a_19 = havoc(Mint_undef_4, Mint_4, a_18, 10).
-Let a_20 = shift_sint64(i64_0, 0).
-Let a_21 = havoc(Mint_undef_2, Mint_2, a_20, 10).
-Let a_22 = shift_uint64(u64_0, 0).
-Let a_23 = havoc(Mint_undef_5, Mint_5, a_22, 10).
-Let a_24 = a_13[a_5 <- 3].
+Let a_20 = shift_sint32(i32_0, 0).
+Let a_21 = havoc(Mint_undef_1, Mint_1, a_20, 10).
+Let a_22 = shift_uint16(u16_0, 0).
+Let a_23 = havoc(Mint_undef_3, Mint_3, a_22, 10).
+Let a_24 = shift_sint16(i16_0, 0).
+Let a_25 = havoc(Mint_undef_0, Mint_0, a_24, 10).
+Let a_26 = a_25[a_13 <- 3].
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_3) /\ is_uint32_chunk(Mint_4) /\
       is_uint64_chunk(Mint_5) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint32(1 + i) /\ is_sint16_chunk(a_13) /\ is_sint32_chunk(a_17) /\
-      is_sint64_chunk(a_21) /\ is_sint8_chunk(a_9) /\
-      is_uint16_chunk(a_15) /\ is_uint32_chunk(a_19) /\
-      is_uint64_chunk(a_23) /\ is_uint8_chunk(a_11) /\
-      is_sint16_chunk(a_24) /\ is_sint32_chunk(a_17[a_3 <- 5]) /\
-      is_sint64_chunk(a_21[a_1 <- 7]) /\ is_sint8_chunk(a_9[a_7 <- 1]) /\
-      is_uint16_chunk(a_15[a_4 <- 4]) /\ is_uint32_chunk(a_19[a_2 <- 6]) /\
-      is_uint64_chunk(a_23[a <- 8]) /\ is_uint8_chunk(a_11[a_6 <- 2]).
+      is_sint32(1 + i) /\ is_sint16_chunk(a_25) /\ is_sint32_chunk(a_21) /\
+      is_sint64_chunk(a_17) /\ is_sint8_chunk(a_5) /\
+      is_uint16_chunk(a_23) /\ is_uint32_chunk(a_19) /\
+      is_uint64_chunk(a_15) /\ is_uint8_chunk(a_1) /\
+      is_sint16_chunk(a_26) /\ is_sint32_chunk(a_21[a_11 <- 5]) /\
+      is_sint64_chunk(a_17[a_9 <- 7]) /\ is_sint8_chunk(a_7) /\
+      is_uint16_chunk(a_23[a_12 <- 4]) /\ is_uint32_chunk(a_19[a_10 <- 6]) /\
+      is_uint64_chunk(a_15[a_8 <- 8]) /\ is_uint8_chunk(a_3).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -456,60 +466,68 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 <= i).
+  When: (i_1 <= i) /\ (0 <= i_1).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a_16, 10) /\
-      valid_rw(Malloc_0, a_20, 10) /\ valid_rw(Malloc_0, a_8, 10) /\
-      valid_rw(Malloc_0, a_14, 10) /\ valid_rw(Malloc_0, a_18, 10) /\
-      valid_rw(Malloc_0, a_22, 10) /\ valid_rw(Malloc_0, a_10, 10).
+  Have: valid_rw(Malloc_0, a_24, 10) /\ valid_rw(Malloc_0, a_20, 10) /\
+      valid_rw(Malloc_0, a_16, 10) /\ valid_rw(Malloc_0, a_4, 10) /\
+      valid_rw(Malloc_0, a_22, 10) /\ valid_rw(Malloc_0, a_18, 10) /\
+      valid_rw(Malloc_0, a_14, 10) /\ valid_rw(Malloc_0, a, 10).
   (* Invariant *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_23[shift_uint64(u64_0, i_2)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_21[shift_sint64(i64_0, i_2)] = 7))).
+      (a_5[shift_sint8(i8_0, i_2)] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_19[shift_uint32(u32_0, i_2)] = 6))).
+      (a_1[shift_uint8(u8_0, i_2)] = 2))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_17[shift_sint32(i32_0, i_2)] = 5))).
+      (a_25[shift_sint16(i16_0, i_2)] = 3))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_15[shift_uint16(u16_0, i_2)] = 4))).
+      (a_23[shift_uint16(u16_0, i_2)] = 4))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_13[shift_sint16(i16_0, i_2)] = 3))).
+      (a_21[shift_sint32(i32_0, i_2)] = 5))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_11[shift_uint8(u8_0, i_2)] = 2))).
+      (a_19[shift_uint32(u32_0, i_2)] = 6))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_9[shift_sint8(i8_0, i_2)] = 1))).
+      (a_17[shift_sint64(i64_0, i_2)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
+      (a_15[shift_uint64(u64_0, i_2)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_7, 1).
-  (* Assertion 'rte,mem_access' *)
   Have: valid_rw(Malloc_0, a_6, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_5, 1).
+  Have: valid_rw(Malloc_0, a_2, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_4, 1).
+  Have: valid_rw(Malloc_0, a_13, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_3, 1).
+  Have: valid_rw(Malloc_0, a_12, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_2, 1).
+  Have: valid_rw(Malloc_0, a_11, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_1, 1).
+  Have: valid_rw(Malloc_0, a_10, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a, 1).
+  Have: valid_rw(Malloc_0, a_9, 1).
+  (* Assertion 'rte,mem_access' *)
+  Have: valid_rw(Malloc_0, a_8, 1).
   (* Assertion 'rte,signed_overflow' *)
   Have: i <= 2147483646.
+  (* Invariant *)
+  Have: (-1) <= i.
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_7[shift_sint8(i8_0, i_2)] = 1))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_3[shift_uint8(u8_0, i_2)] = 2))).
 }
-Prove: a_24[shift_sint16(i16_0, i_1)] = 3.
+Prove: a_26[shift_sint16(i16_0, i_1)] = 3.
 
 ------------------------------------------------------------
 
@@ -519,44 +537,47 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant (file tests/wp_acsl/chunk_typing.i, line 35):
-Let a = shift_uint64(u64_0, i).
-Let a_1 = shift_sint64(i64_0, i).
-Let a_2 = shift_uint32(u32_0, i).
-Let a_3 = shift_sint32(i32_0, i).
-Let a_4 = shift_uint16(u16_0, i).
-Let a_5 = shift_sint16(i16_0, i).
+Let a = shift_sint16(i16_0, 0).
+Let a_1 = havoc(Mint_undef_1, Mint_1, a, 10).
+Let a_2 = shift_sint16(i16_0, i).
+Let a_3 = a_1[a_2 <- 3].
+Let a_4 = shift_uint8(u8_0, 0).
+Let a_5 = havoc(Mint_undef_6, Mint_6, a_4, 10).
 Let a_6 = shift_uint8(u8_0, i).
-Let a_7 = shift_sint8(i8_0, i).
+Let a_7 = a_5[a_6 <- 2].
 Let a_8 = shift_sint8(i8_0, 0).
 Let a_9 = havoc(Mchar_undef_0, Mchar_0, a_8, 10).
-Let a_10 = shift_uint8(u8_0, 0).
-Let a_11 = havoc(Mint_undef_6, Mint_6, a_10, 10).
-Let a_12 = shift_sint16(i16_0, 0).
-Let a_13 = havoc(Mint_undef_1, Mint_1, a_12, 10).
-Let a_14 = shift_uint16(u16_0, 0).
-Let a_15 = havoc(Mint_undef_0, Mint_0, a_14, 10).
-Let a_16 = shift_sint32(i32_0, 0).
-Let a_17 = havoc(Mint_undef_2, Mint_2, a_16, 10).
-Let a_18 = shift_uint32(u32_0, 0).
-Let a_19 = havoc(Mint_undef_4, Mint_4, a_18, 10).
-Let a_20 = shift_sint64(i64_0, 0).
-Let a_21 = havoc(Mint_undef_3, Mint_3, a_20, 10).
-Let a_22 = shift_uint64(u64_0, 0).
-Let a_23 = havoc(Mint_undef_5, Mint_5, a_22, 10).
-Let a_24 = a_15[a_4 <- 4].
+Let a_10 = shift_sint8(i8_0, i).
+Let a_11 = a_9[a_10 <- 1].
+Let a_12 = shift_uint64(u64_0, i).
+Let a_13 = shift_sint64(i64_0, i).
+Let a_14 = shift_uint32(u32_0, i).
+Let a_15 = shift_sint32(i32_0, i).
+Let a_16 = shift_uint16(u16_0, i).
+Let a_17 = shift_uint64(u64_0, 0).
+Let a_18 = havoc(Mint_undef_5, Mint_5, a_17, 10).
+Let a_19 = shift_sint64(i64_0, 0).
+Let a_20 = havoc(Mint_undef_3, Mint_3, a_19, 10).
+Let a_21 = shift_uint32(u32_0, 0).
+Let a_22 = havoc(Mint_undef_4, Mint_4, a_21, 10).
+Let a_23 = shift_sint32(i32_0, 0).
+Let a_24 = havoc(Mint_undef_2, Mint_2, a_23, 10).
+Let a_25 = shift_uint16(u16_0, 0).
+Let a_26 = havoc(Mint_undef_0, Mint_0, a_25, 10).
+Let a_27 = a_26[a_16 <- 4].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_2) /\
       is_sint64_chunk(Mint_3) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_0) /\ is_uint32_chunk(Mint_4) /\
       is_uint64_chunk(Mint_5) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint32(1 + i) /\ is_sint16_chunk(a_13) /\ is_sint32_chunk(a_17) /\
-      is_sint64_chunk(a_21) /\ is_sint8_chunk(a_9) /\
-      is_uint16_chunk(a_15) /\ is_uint32_chunk(a_19) /\
-      is_uint64_chunk(a_23) /\ is_uint8_chunk(a_11) /\
-      is_sint16_chunk(a_13[a_5 <- 3]) /\ is_sint32_chunk(a_17[a_3 <- 5]) /\
-      is_sint64_chunk(a_21[a_1 <- 7]) /\ is_sint8_chunk(a_9[a_7 <- 1]) /\
-      is_uint16_chunk(a_24) /\ is_uint32_chunk(a_19[a_2 <- 6]) /\
-      is_uint64_chunk(a_23[a <- 8]) /\ is_uint8_chunk(a_11[a_6 <- 2]).
+      is_sint32(1 + i) /\ is_sint16_chunk(a_1) /\ is_sint32_chunk(a_24) /\
+      is_sint64_chunk(a_20) /\ is_sint8_chunk(a_9) /\
+      is_uint16_chunk(a_26) /\ is_uint32_chunk(a_22) /\
+      is_uint64_chunk(a_18) /\ is_uint8_chunk(a_5) /\ is_sint16_chunk(a_3) /\
+      is_sint32_chunk(a_24[a_15 <- 5]) /\ is_sint64_chunk(a_20[a_13 <- 7]) /\
+      is_sint8_chunk(a_11) /\ is_uint16_chunk(a_27) /\
+      is_uint32_chunk(a_22[a_14 <- 6]) /\ is_uint64_chunk(a_18[a_12 <- 8]) /\
+      is_uint8_chunk(a_7).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -564,60 +585,71 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 <= i).
+  When: (i_1 <= i) /\ (0 <= i_1).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a_16, 10) /\
-      valid_rw(Malloc_0, a_20, 10) /\ valid_rw(Malloc_0, a_8, 10) /\
-      valid_rw(Malloc_0, a_14, 10) /\ valid_rw(Malloc_0, a_18, 10) /\
-      valid_rw(Malloc_0, a_22, 10) /\ valid_rw(Malloc_0, a_10, 10).
+  Have: valid_rw(Malloc_0, a, 10) /\ valid_rw(Malloc_0, a_23, 10) /\
+      valid_rw(Malloc_0, a_19, 10) /\ valid_rw(Malloc_0, a_8, 10) /\
+      valid_rw(Malloc_0, a_25, 10) /\ valid_rw(Malloc_0, a_21, 10) /\
+      valid_rw(Malloc_0, a_17, 10) /\ valid_rw(Malloc_0, a_4, 10).
   (* Invariant *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_23[shift_uint64(u64_0, i_2)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_21[shift_sint64(i64_0, i_2)] = 7))).
+      (a_9[shift_sint8(i8_0, i_2)] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_19[shift_uint32(u32_0, i_2)] = 6))).
+      (a_5[shift_uint8(u8_0, i_2)] = 2))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_17[shift_sint32(i32_0, i_2)] = 5))).
+      (a_1[shift_sint16(i16_0, i_2)] = 3))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_15[shift_uint16(u16_0, i_2)] = 4))).
+      (a_26[shift_uint16(u16_0, i_2)] = 4))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_13[shift_sint16(i16_0, i_2)] = 3))).
+      (a_24[shift_sint32(i32_0, i_2)] = 5))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_11[shift_uint8(u8_0, i_2)] = 2))).
+      (a_22[shift_uint32(u32_0, i_2)] = 6))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_9[shift_sint8(i8_0, i_2)] = 1))).
+      (a_20[shift_sint64(i64_0, i_2)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
+      (a_18[shift_uint64(u64_0, i_2)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_7, 1).
+  Have: valid_rw(Malloc_0, a_10, 1).
   (* Assertion 'rte,mem_access' *)
   Have: valid_rw(Malloc_0, a_6, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_5, 1).
+  Have: valid_rw(Malloc_0, a_2, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_4, 1).
+  Have: valid_rw(Malloc_0, a_16, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_3, 1).
+  Have: valid_rw(Malloc_0, a_15, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_2, 1).
+  Have: valid_rw(Malloc_0, a_14, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_1, 1).
+  Have: valid_rw(Malloc_0, a_13, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a, 1).
+  Have: valid_rw(Malloc_0, a_12, 1).
   (* Assertion 'rte,signed_overflow' *)
   Have: i <= 2147483646.
+  (* Invariant *)
+  Have: (-1) <= i.
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_11[shift_sint8(i8_0, i_2)] = 1))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_7[shift_uint8(u8_0, i_2)] = 2))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_3[shift_sint16(i16_0, i_2)] = 3))).
 }
-Prove: a_24[shift_uint16(u16_0, i_1)] = 4.
+Prove: a_27[shift_uint16(u16_0, i_1)] = 4.
 
 ------------------------------------------------------------
 
@@ -627,44 +659,48 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant (file tests/wp_acsl/chunk_typing.i, line 36):
-Let a = shift_uint64(u64_0, i).
-Let a_1 = shift_sint64(i64_0, i).
-Let a_2 = shift_uint32(u32_0, i).
-Let a_3 = shift_sint32(i32_0, i).
-Let a_4 = shift_uint16(u16_0, i).
-Let a_5 = shift_sint16(i16_0, i).
-Let a_6 = shift_uint8(u8_0, i).
-Let a_7 = shift_sint8(i8_0, i).
-Let a_8 = shift_sint8(i8_0, 0).
-Let a_9 = havoc(Mchar_undef_0, Mchar_0, a_8, 10).
-Let a_10 = shift_uint8(u8_0, 0).
-Let a_11 = havoc(Mint_undef_6, Mint_6, a_10, 10).
-Let a_12 = shift_sint16(i16_0, 0).
-Let a_13 = havoc(Mint_undef_1, Mint_1, a_12, 10).
-Let a_14 = shift_uint16(u16_0, 0).
-Let a_15 = havoc(Mint_undef_3, Mint_3, a_14, 10).
-Let a_16 = shift_sint32(i32_0, 0).
-Let a_17 = havoc(Mint_undef_0, Mint_0, a_16, 10).
-Let a_18 = shift_uint32(u32_0, 0).
-Let a_19 = havoc(Mint_undef_4, Mint_4, a_18, 10).
-Let a_20 = shift_sint64(i64_0, 0).
-Let a_21 = havoc(Mint_undef_2, Mint_2, a_20, 10).
-Let a_22 = shift_uint64(u64_0, 0).
-Let a_23 = havoc(Mint_undef_5, Mint_5, a_22, 10).
-Let a_24 = a_17[a_3 <- 5].
+Let a = shift_uint16(u16_0, 0).
+Let a_1 = havoc(Mint_undef_3, Mint_3, a, 10).
+Let a_2 = shift_uint16(u16_0, i).
+Let a_3 = a_1[a_2 <- 4].
+Let a_4 = shift_sint16(i16_0, 0).
+Let a_5 = havoc(Mint_undef_1, Mint_1, a_4, 10).
+Let a_6 = shift_sint16(i16_0, i).
+Let a_7 = a_5[a_6 <- 3].
+Let a_8 = shift_uint8(u8_0, 0).
+Let a_9 = havoc(Mint_undef_6, Mint_6, a_8, 10).
+Let a_10 = shift_uint8(u8_0, i).
+Let a_11 = a_9[a_10 <- 2].
+Let a_12 = shift_sint8(i8_0, 0).
+Let a_13 = havoc(Mchar_undef_0, Mchar_0, a_12, 10).
+Let a_14 = shift_sint8(i8_0, i).
+Let a_15 = a_13[a_14 <- 1].
+Let a_16 = shift_uint64(u64_0, i).
+Let a_17 = shift_sint64(i64_0, i).
+Let a_18 = shift_uint32(u32_0, i).
+Let a_19 = shift_sint32(i32_0, i).
+Let a_20 = shift_uint64(u64_0, 0).
+Let a_21 = havoc(Mint_undef_5, Mint_5, a_20, 10).
+Let a_22 = shift_sint64(i64_0, 0).
+Let a_23 = havoc(Mint_undef_2, Mint_2, a_22, 10).
+Let a_24 = shift_uint32(u32_0, 0).
+Let a_25 = havoc(Mint_undef_4, Mint_4, a_24, 10).
+Let a_26 = shift_sint32(i32_0, 0).
+Let a_27 = havoc(Mint_undef_0, Mint_0, a_26, 10).
+Let a_28 = a_27[a_19 <- 5].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_0) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_3) /\ is_uint32_chunk(Mint_4) /\
       is_uint64_chunk(Mint_5) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint32(1 + i) /\ is_sint16_chunk(a_13) /\ is_sint32_chunk(a_17) /\
-      is_sint64_chunk(a_21) /\ is_sint8_chunk(a_9) /\
-      is_uint16_chunk(a_15) /\ is_uint32_chunk(a_19) /\
-      is_uint64_chunk(a_23) /\ is_uint8_chunk(a_11) /\
-      is_sint16_chunk(a_13[a_5 <- 3]) /\ is_sint32_chunk(a_24) /\
-      is_sint64_chunk(a_21[a_1 <- 7]) /\ is_sint8_chunk(a_9[a_7 <- 1]) /\
-      is_uint16_chunk(a_15[a_4 <- 4]) /\ is_uint32_chunk(a_19[a_2 <- 6]) /\
-      is_uint64_chunk(a_23[a <- 8]) /\ is_uint8_chunk(a_11[a_6 <- 2]).
+      is_sint32(1 + i) /\ is_sint16_chunk(a_5) /\ is_sint32_chunk(a_27) /\
+      is_sint64_chunk(a_23) /\ is_sint8_chunk(a_13) /\
+      is_uint16_chunk(a_1) /\ is_uint32_chunk(a_25) /\
+      is_uint64_chunk(a_21) /\ is_uint8_chunk(a_9) /\ is_sint16_chunk(a_7) /\
+      is_sint32_chunk(a_28) /\ is_sint64_chunk(a_23[a_17 <- 7]) /\
+      is_sint8_chunk(a_15) /\ is_uint16_chunk(a_3) /\
+      is_uint32_chunk(a_25[a_18 <- 6]) /\ is_uint64_chunk(a_21[a_16 <- 8]) /\
+      is_uint8_chunk(a_11).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -672,60 +708,74 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 <= i).
+  When: (i_1 <= i) /\ (0 <= i_1).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a_16, 10) /\
-      valid_rw(Malloc_0, a_20, 10) /\ valid_rw(Malloc_0, a_8, 10) /\
-      valid_rw(Malloc_0, a_14, 10) /\ valid_rw(Malloc_0, a_18, 10) /\
-      valid_rw(Malloc_0, a_22, 10) /\ valid_rw(Malloc_0, a_10, 10).
+  Have: valid_rw(Malloc_0, a_4, 10) /\ valid_rw(Malloc_0, a_26, 10) /\
+      valid_rw(Malloc_0, a_22, 10) /\ valid_rw(Malloc_0, a_12, 10) /\
+      valid_rw(Malloc_0, a, 10) /\ valid_rw(Malloc_0, a_24, 10) /\
+      valid_rw(Malloc_0, a_20, 10) /\ valid_rw(Malloc_0, a_8, 10).
   (* Invariant *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_23[shift_uint64(u64_0, i_2)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_21[shift_sint64(i64_0, i_2)] = 7))).
+      (a_13[shift_sint8(i8_0, i_2)] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_19[shift_uint32(u32_0, i_2)] = 6))).
+      (a_9[shift_uint8(u8_0, i_2)] = 2))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_17[shift_sint32(i32_0, i_2)] = 5))).
+      (a_5[shift_sint16(i16_0, i_2)] = 3))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_15[shift_uint16(u16_0, i_2)] = 4))).
+      (a_1[shift_uint16(u16_0, i_2)] = 4))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_13[shift_sint16(i16_0, i_2)] = 3))).
+      (a_27[shift_sint32(i32_0, i_2)] = 5))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_11[shift_uint8(u8_0, i_2)] = 2))).
+      (a_25[shift_uint32(u32_0, i_2)] = 6))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_9[shift_sint8(i8_0, i_2)] = 1))).
+      (a_23[shift_sint64(i64_0, i_2)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
+      (a_21[shift_uint64(u64_0, i_2)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_7, 1).
+  Have: valid_rw(Malloc_0, a_14, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_6, 1).
+  Have: valid_rw(Malloc_0, a_10, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_5, 1).
+  Have: valid_rw(Malloc_0, a_6, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_4, 1).
+  Have: valid_rw(Malloc_0, a_2, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_3, 1).
+  Have: valid_rw(Malloc_0, a_19, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_2, 1).
+  Have: valid_rw(Malloc_0, a_18, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_1, 1).
+  Have: valid_rw(Malloc_0, a_17, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a, 1).
+  Have: valid_rw(Malloc_0, a_16, 1).
   (* Assertion 'rte,signed_overflow' *)
   Have: i <= 2147483646.
+  (* Invariant *)
+  Have: (-1) <= i.
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_15[shift_sint8(i8_0, i_2)] = 1))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_11[shift_uint8(u8_0, i_2)] = 2))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_7[shift_sint16(i16_0, i_2)] = 3))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_3[shift_uint16(u16_0, i_2)] = 4))).
 }
-Prove: a_24[shift_sint32(i32_0, i_1)] = 5.
+Prove: a_28[shift_sint32(i32_0, i_1)] = 5.
 
 ------------------------------------------------------------
 
@@ -735,44 +785,49 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant (file tests/wp_acsl/chunk_typing.i, line 37):
-Let a = shift_uint64(u64_0, i).
-Let a_1 = shift_sint64(i64_0, i).
-Let a_2 = shift_uint32(u32_0, i).
-Let a_3 = shift_sint32(i32_0, i).
-Let a_4 = shift_uint16(u16_0, i).
-Let a_5 = shift_sint16(i16_0, i).
-Let a_6 = shift_uint8(u8_0, i).
-Let a_7 = shift_sint8(i8_0, i).
-Let a_8 = shift_sint8(i8_0, 0).
-Let a_9 = havoc(Mchar_undef_0, Mchar_0, a_8, 10).
-Let a_10 = shift_uint8(u8_0, 0).
-Let a_11 = havoc(Mint_undef_6, Mint_6, a_10, 10).
-Let a_12 = shift_sint16(i16_0, 0).
-Let a_13 = havoc(Mint_undef_1, Mint_1, a_12, 10).
-Let a_14 = shift_uint16(u16_0, 0).
-Let a_15 = havoc(Mint_undef_4, Mint_4, a_14, 10).
-Let a_16 = shift_sint32(i32_0, 0).
-Let a_17 = havoc(Mint_undef_2, Mint_2, a_16, 10).
-Let a_18 = shift_uint32(u32_0, 0).
-Let a_19 = havoc(Mint_undef_0, Mint_0, a_18, 10).
-Let a_20 = shift_sint64(i64_0, 0).
-Let a_21 = havoc(Mint_undef_3, Mint_3, a_20, 10).
-Let a_22 = shift_uint64(u64_0, 0).
-Let a_23 = havoc(Mint_undef_5, Mint_5, a_22, 10).
-Let a_24 = a_19[a_2 <- 6].
+Let a = shift_sint32(i32_0, 0).
+Let a_1 = havoc(Mint_undef_2, Mint_2, a, 10).
+Let a_2 = shift_sint32(i32_0, i).
+Let a_3 = a_1[a_2 <- 5].
+Let a_4 = shift_uint16(u16_0, 0).
+Let a_5 = havoc(Mint_undef_4, Mint_4, a_4, 10).
+Let a_6 = shift_uint16(u16_0, i).
+Let a_7 = a_5[a_6 <- 4].
+Let a_8 = shift_sint16(i16_0, 0).
+Let a_9 = havoc(Mint_undef_1, Mint_1, a_8, 10).
+Let a_10 = shift_sint16(i16_0, i).
+Let a_11 = a_9[a_10 <- 3].
+Let a_12 = shift_uint8(u8_0, 0).
+Let a_13 = havoc(Mint_undef_6, Mint_6, a_12, 10).
+Let a_14 = shift_uint8(u8_0, i).
+Let a_15 = a_13[a_14 <- 2].
+Let a_16 = shift_sint8(i8_0, 0).
+Let a_17 = havoc(Mchar_undef_0, Mchar_0, a_16, 10).
+Let a_18 = shift_sint8(i8_0, i).
+Let a_19 = a_17[a_18 <- 1].
+Let a_20 = shift_uint64(u64_0, i).
+Let a_21 = shift_sint64(i64_0, i).
+Let a_22 = shift_uint32(u32_0, i).
+Let a_23 = shift_uint64(u64_0, 0).
+Let a_24 = havoc(Mint_undef_5, Mint_5, a_23, 10).
+Let a_25 = shift_sint64(i64_0, 0).
+Let a_26 = havoc(Mint_undef_3, Mint_3, a_25, 10).
+Let a_27 = shift_uint32(u32_0, 0).
+Let a_28 = havoc(Mint_undef_0, Mint_0, a_27, 10).
+Let a_29 = a_28[a_22 <- 6].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_2) /\
       is_sint64_chunk(Mint_3) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_4) /\ is_uint32_chunk(Mint_0) /\
       is_uint64_chunk(Mint_5) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint32(1 + i) /\ is_sint16_chunk(a_13) /\ is_sint32_chunk(a_17) /\
-      is_sint64_chunk(a_21) /\ is_sint8_chunk(a_9) /\
-      is_uint16_chunk(a_15) /\ is_uint32_chunk(a_19) /\
-      is_uint64_chunk(a_23) /\ is_uint8_chunk(a_11) /\
-      is_sint16_chunk(a_13[a_5 <- 3]) /\ is_sint32_chunk(a_17[a_3 <- 5]) /\
-      is_sint64_chunk(a_21[a_1 <- 7]) /\ is_sint8_chunk(a_9[a_7 <- 1]) /\
-      is_uint16_chunk(a_15[a_4 <- 4]) /\ is_uint32_chunk(a_24) /\
-      is_uint64_chunk(a_23[a <- 8]) /\ is_uint8_chunk(a_11[a_6 <- 2]).
+      is_sint32(1 + i) /\ is_sint16_chunk(a_9) /\ is_sint32_chunk(a_1) /\
+      is_sint64_chunk(a_26) /\ is_sint8_chunk(a_17) /\
+      is_uint16_chunk(a_5) /\ is_uint32_chunk(a_28) /\
+      is_uint64_chunk(a_24) /\ is_uint8_chunk(a_13) /\
+      is_sint16_chunk(a_11) /\ is_sint32_chunk(a_3) /\
+      is_sint64_chunk(a_26[a_21 <- 7]) /\ is_sint8_chunk(a_19) /\
+      is_uint16_chunk(a_7) /\ is_uint32_chunk(a_29) /\
+      is_uint64_chunk(a_24[a_20 <- 8]) /\ is_uint8_chunk(a_15).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -780,60 +835,77 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 <= i).
+  When: (i_1 <= i) /\ (0 <= i_1).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a_16, 10) /\
-      valid_rw(Malloc_0, a_20, 10) /\ valid_rw(Malloc_0, a_8, 10) /\
-      valid_rw(Malloc_0, a_14, 10) /\ valid_rw(Malloc_0, a_18, 10) /\
-      valid_rw(Malloc_0, a_22, 10) /\ valid_rw(Malloc_0, a_10, 10).
+  Have: valid_rw(Malloc_0, a_8, 10) /\ valid_rw(Malloc_0, a, 10) /\
+      valid_rw(Malloc_0, a_25, 10) /\ valid_rw(Malloc_0, a_16, 10) /\
+      valid_rw(Malloc_0, a_4, 10) /\ valid_rw(Malloc_0, a_27, 10) /\
+      valid_rw(Malloc_0, a_23, 10) /\ valid_rw(Malloc_0, a_12, 10).
   (* Invariant *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_23[shift_uint64(u64_0, i_2)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_21[shift_sint64(i64_0, i_2)] = 7))).
+      (a_17[shift_sint8(i8_0, i_2)] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_19[shift_uint32(u32_0, i_2)] = 6))).
+      (a_13[shift_uint8(u8_0, i_2)] = 2))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_17[shift_sint32(i32_0, i_2)] = 5))).
+      (a_9[shift_sint16(i16_0, i_2)] = 3))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_15[shift_uint16(u16_0, i_2)] = 4))).
+      (a_5[shift_uint16(u16_0, i_2)] = 4))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_13[shift_sint16(i16_0, i_2)] = 3))).
+      (a_1[shift_sint32(i32_0, i_2)] = 5))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_11[shift_uint8(u8_0, i_2)] = 2))).
+      (a_28[shift_uint32(u32_0, i_2)] = 6))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_9[shift_sint8(i8_0, i_2)] = 1))).
+      (a_26[shift_sint64(i64_0, i_2)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
+      (a_24[shift_uint64(u64_0, i_2)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_7, 1).
+  Have: valid_rw(Malloc_0, a_18, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_6, 1).
+  Have: valid_rw(Malloc_0, a_14, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_5, 1).
-  (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_4, 1).
+  Have: valid_rw(Malloc_0, a_10, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_3, 1).
+  Have: valid_rw(Malloc_0, a_6, 1).
   (* Assertion 'rte,mem_access' *)
   Have: valid_rw(Malloc_0, a_2, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_1, 1).
+  Have: valid_rw(Malloc_0, a_22, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a, 1).
+  Have: valid_rw(Malloc_0, a_21, 1).
+  (* Assertion 'rte,mem_access' *)
+  Have: valid_rw(Malloc_0, a_20, 1).
   (* Assertion 'rte,signed_overflow' *)
   Have: i <= 2147483646.
+  (* Invariant *)
+  Have: (-1) <= i.
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_19[shift_sint8(i8_0, i_2)] = 1))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_15[shift_uint8(u8_0, i_2)] = 2))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_11[shift_sint16(i16_0, i_2)] = 3))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_7[shift_uint16(u16_0, i_2)] = 4))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_3[shift_sint32(i32_0, i_2)] = 5))).
 }
-Prove: a_24[shift_uint32(u32_0, i_1)] = 6.
+Prove: a_29[shift_uint32(u32_0, i_1)] = 6.
 
 ------------------------------------------------------------
 
@@ -843,44 +915,50 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant (file tests/wp_acsl/chunk_typing.i, line 38):
-Let a = shift_uint64(u64_0, i).
-Let a_1 = shift_sint64(i64_0, i).
+Let a = shift_uint32(u32_0, 0).
+Let a_1 = havoc(Mint_undef_4, Mint_4, a, 10).
 Let a_2 = shift_uint32(u32_0, i).
-Let a_3 = shift_sint32(i32_0, i).
-Let a_4 = shift_uint16(u16_0, i).
-Let a_5 = shift_sint16(i16_0, i).
-Let a_6 = shift_uint8(u8_0, i).
-Let a_7 = shift_sint8(i8_0, i).
-Let a_8 = shift_sint8(i8_0, 0).
-Let a_9 = havoc(Mchar_undef_0, Mchar_0, a_8, 10).
-Let a_10 = shift_uint8(u8_0, 0).
-Let a_11 = havoc(Mint_undef_6, Mint_6, a_10, 10).
+Let a_3 = a_1[a_2 <- 6].
+Let a_4 = shift_sint32(i32_0, 0).
+Let a_5 = havoc(Mint_undef_2, Mint_2, a_4, 10).
+Let a_6 = shift_sint32(i32_0, i).
+Let a_7 = a_5[a_6 <- 5].
+Let a_8 = shift_uint16(u16_0, 0).
+Let a_9 = havoc(Mint_undef_3, Mint_3, a_8, 10).
+Let a_10 = shift_uint16(u16_0, i).
+Let a_11 = a_9[a_10 <- 4].
 Let a_12 = shift_sint16(i16_0, 0).
 Let a_13 = havoc(Mint_undef_1, Mint_1, a_12, 10).
-Let a_14 = shift_uint16(u16_0, 0).
-Let a_15 = havoc(Mint_undef_3, Mint_3, a_14, 10).
-Let a_16 = shift_sint32(i32_0, 0).
-Let a_17 = havoc(Mint_undef_2, Mint_2, a_16, 10).
-Let a_18 = shift_uint32(u32_0, 0).
-Let a_19 = havoc(Mint_undef_4, Mint_4, a_18, 10).
-Let a_20 = shift_sint64(i64_0, 0).
-Let a_21 = havoc(Mint_undef_0, Mint_0, a_20, 10).
-Let a_22 = shift_uint64(u64_0, 0).
-Let a_23 = havoc(Mint_undef_5, Mint_5, a_22, 10).
-Let a_24 = a_21[a_1 <- 7].
+Let a_14 = shift_sint16(i16_0, i).
+Let a_15 = a_13[a_14 <- 3].
+Let a_16 = shift_uint8(u8_0, 0).
+Let a_17 = havoc(Mint_undef_6, Mint_6, a_16, 10).
+Let a_18 = shift_uint8(u8_0, i).
+Let a_19 = a_17[a_18 <- 2].
+Let a_20 = shift_sint8(i8_0, 0).
+Let a_21 = havoc(Mchar_undef_0, Mchar_0, a_20, 10).
+Let a_22 = shift_sint8(i8_0, i).
+Let a_23 = a_21[a_22 <- 1].
+Let a_24 = shift_uint64(u64_0, i).
+Let a_25 = shift_sint64(i64_0, i).
+Let a_26 = shift_uint64(u64_0, 0).
+Let a_27 = havoc(Mint_undef_5, Mint_5, a_26, 10).
+Let a_28 = shift_sint64(i64_0, 0).
+Let a_29 = havoc(Mint_undef_0, Mint_0, a_28, 10).
+Let a_30 = a_29[a_25 <- 7].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_2) /\
       is_sint64_chunk(Mint_0) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_3) /\ is_uint32_chunk(Mint_4) /\
       is_uint64_chunk(Mint_5) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint32(1 + i) /\ is_sint16_chunk(a_13) /\ is_sint32_chunk(a_17) /\
-      is_sint64_chunk(a_21) /\ is_sint8_chunk(a_9) /\
-      is_uint16_chunk(a_15) /\ is_uint32_chunk(a_19) /\
-      is_uint64_chunk(a_23) /\ is_uint8_chunk(a_11) /\
-      is_sint16_chunk(a_13[a_5 <- 3]) /\ is_sint32_chunk(a_17[a_3 <- 5]) /\
-      is_sint64_chunk(a_24) /\ is_sint8_chunk(a_9[a_7 <- 1]) /\
-      is_uint16_chunk(a_15[a_4 <- 4]) /\ is_uint32_chunk(a_19[a_2 <- 6]) /\
-      is_uint64_chunk(a_23[a <- 8]) /\ is_uint8_chunk(a_11[a_6 <- 2]).
+      is_sint32(1 + i) /\ is_sint16_chunk(a_13) /\ is_sint32_chunk(a_5) /\
+      is_sint64_chunk(a_29) /\ is_sint8_chunk(a_21) /\
+      is_uint16_chunk(a_9) /\ is_uint32_chunk(a_1) /\
+      is_uint64_chunk(a_27) /\ is_uint8_chunk(a_17) /\
+      is_sint16_chunk(a_15) /\ is_sint32_chunk(a_7) /\
+      is_sint64_chunk(a_30) /\ is_sint8_chunk(a_23) /\
+      is_uint16_chunk(a_11) /\ is_uint32_chunk(a_3) /\
+      is_uint64_chunk(a_27[a_24 <- 8]) /\ is_uint8_chunk(a_19).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -888,60 +966,80 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 <= i).
+  When: (i_1 <= i) /\ (0 <= i_1).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a_16, 10) /\
-      valid_rw(Malloc_0, a_20, 10) /\ valid_rw(Malloc_0, a_8, 10) /\
-      valid_rw(Malloc_0, a_14, 10) /\ valid_rw(Malloc_0, a_18, 10) /\
-      valid_rw(Malloc_0, a_22, 10) /\ valid_rw(Malloc_0, a_10, 10).
+  Have: valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a_4, 10) /\
+      valid_rw(Malloc_0, a_28, 10) /\ valid_rw(Malloc_0, a_20, 10) /\
+      valid_rw(Malloc_0, a_8, 10) /\ valid_rw(Malloc_0, a, 10) /\
+      valid_rw(Malloc_0, a_26, 10) /\ valid_rw(Malloc_0, a_16, 10).
   (* Invariant *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_23[shift_uint64(u64_0, i_2)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_21[shift_sint64(i64_0, i_2)] = 7))).
+      (a_21[shift_sint8(i8_0, i_2)] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_19[shift_uint32(u32_0, i_2)] = 6))).
+      (a_17[shift_uint8(u8_0, i_2)] = 2))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_17[shift_sint32(i32_0, i_2)] = 5))).
+      (a_13[shift_sint16(i16_0, i_2)] = 3))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_15[shift_uint16(u16_0, i_2)] = 4))).
+      (a_9[shift_uint16(u16_0, i_2)] = 4))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_13[shift_sint16(i16_0, i_2)] = 3))).
+      (a_5[shift_sint32(i32_0, i_2)] = 5))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_11[shift_uint8(u8_0, i_2)] = 2))).
+      (a_1[shift_uint32(u32_0, i_2)] = 6))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_9[shift_sint8(i8_0, i_2)] = 1))).
+      (a_29[shift_sint64(i64_0, i_2)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
+      (a_27[shift_uint64(u64_0, i_2)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_7, 1).
+  Have: valid_rw(Malloc_0, a_22, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_6, 1).
+  Have: valid_rw(Malloc_0, a_18, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_5, 1).
+  Have: valid_rw(Malloc_0, a_14, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_4, 1).
+  Have: valid_rw(Malloc_0, a_10, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_3, 1).
+  Have: valid_rw(Malloc_0, a_6, 1).
   (* Assertion 'rte,mem_access' *)
   Have: valid_rw(Malloc_0, a_2, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_1, 1).
+  Have: valid_rw(Malloc_0, a_25, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a, 1).
+  Have: valid_rw(Malloc_0, a_24, 1).
   (* Assertion 'rte,signed_overflow' *)
   Have: i <= 2147483646.
+  (* Invariant *)
+  Have: (-1) <= i.
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_23[shift_sint8(i8_0, i_2)] = 1))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_19[shift_uint8(u8_0, i_2)] = 2))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_15[shift_sint16(i16_0, i_2)] = 3))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_11[shift_uint16(u16_0, i_2)] = 4))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_7[shift_sint32(i32_0, i_2)] = 5))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_3[shift_uint32(u32_0, i_2)] = 6))).
 }
-Prove: a_24[shift_sint64(i64_0, i_1)] = 7.
+Prove: a_30[shift_sint64(i64_0, i_1)] = 7.
 
 ------------------------------------------------------------
 
@@ -951,44 +1049,51 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant (file tests/wp_acsl/chunk_typing.i, line 39):
-Let a = shift_uint64(u64_0, i).
-Let a_1 = shift_sint64(i64_0, i).
-Let a_2 = shift_uint32(u32_0, i).
-Let a_3 = shift_sint32(i32_0, i).
-Let a_4 = shift_uint16(u16_0, i).
-Let a_5 = shift_sint16(i16_0, i).
-Let a_6 = shift_uint8(u8_0, i).
-Let a_7 = shift_sint8(i8_0, i).
-Let a_8 = shift_sint8(i8_0, 0).
-Let a_9 = havoc(Mchar_undef_0, Mchar_0, a_8, 10).
-Let a_10 = shift_uint8(u8_0, 0).
-Let a_11 = havoc(Mint_undef_6, Mint_6, a_10, 10).
-Let a_12 = shift_sint16(i16_0, 0).
-Let a_13 = havoc(Mint_undef_1, Mint_1, a_12, 10).
-Let a_14 = shift_uint16(u16_0, 0).
-Let a_15 = havoc(Mint_undef_4, Mint_4, a_14, 10).
-Let a_16 = shift_sint32(i32_0, 0).
-Let a_17 = havoc(Mint_undef_2, Mint_2, a_16, 10).
-Let a_18 = shift_uint32(u32_0, 0).
-Let a_19 = havoc(Mint_undef_5, Mint_5, a_18, 10).
-Let a_20 = shift_sint64(i64_0, 0).
-Let a_21 = havoc(Mint_undef_3, Mint_3, a_20, 10).
-Let a_22 = shift_uint64(u64_0, 0).
-Let a_23 = havoc(Mint_undef_0, Mint_0, a_22, 10).
-Let a_24 = a_23[a <- 8].
+Let a = shift_sint64(i64_0, 0).
+Let a_1 = havoc(Mint_undef_3, Mint_3, a, 10).
+Let a_2 = shift_sint64(i64_0, i).
+Let a_3 = a_1[a_2 <- 7].
+Let a_4 = shift_uint32(u32_0, 0).
+Let a_5 = havoc(Mint_undef_5, Mint_5, a_4, 10).
+Let a_6 = shift_uint32(u32_0, i).
+Let a_7 = a_5[a_6 <- 6].
+Let a_8 = shift_sint32(i32_0, 0).
+Let a_9 = havoc(Mint_undef_2, Mint_2, a_8, 10).
+Let a_10 = shift_sint32(i32_0, i).
+Let a_11 = a_9[a_10 <- 5].
+Let a_12 = shift_uint16(u16_0, 0).
+Let a_13 = havoc(Mint_undef_4, Mint_4, a_12, 10).
+Let a_14 = shift_uint16(u16_0, i).
+Let a_15 = a_13[a_14 <- 4].
+Let a_16 = shift_sint16(i16_0, 0).
+Let a_17 = havoc(Mint_undef_1, Mint_1, a_16, 10).
+Let a_18 = shift_sint16(i16_0, i).
+Let a_19 = a_17[a_18 <- 3].
+Let a_20 = shift_uint8(u8_0, 0).
+Let a_21 = havoc(Mint_undef_6, Mint_6, a_20, 10).
+Let a_22 = shift_uint8(u8_0, i).
+Let a_23 = a_21[a_22 <- 2].
+Let a_24 = shift_sint8(i8_0, 0).
+Let a_25 = havoc(Mchar_undef_0, Mchar_0, a_24, 10).
+Let a_26 = shift_sint8(i8_0, i).
+Let a_27 = a_25[a_26 <- 1].
+Let a_28 = shift_uint64(u64_0, i).
+Let a_29 = shift_uint64(u64_0, 0).
+Let a_30 = havoc(Mint_undef_0, Mint_0, a_29, 10).
+Let a_31 = a_30[a_28 <- 8].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_2) /\
       is_sint64_chunk(Mint_3) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_4) /\ is_uint32_chunk(Mint_5) /\
       is_uint64_chunk(Mint_0) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint32(1 + i) /\ is_sint16_chunk(a_13) /\ is_sint32_chunk(a_17) /\
-      is_sint64_chunk(a_21) /\ is_sint8_chunk(a_9) /\
-      is_uint16_chunk(a_15) /\ is_uint32_chunk(a_19) /\
-      is_uint64_chunk(a_23) /\ is_uint8_chunk(a_11) /\
-      is_sint16_chunk(a_13[a_5 <- 3]) /\ is_sint32_chunk(a_17[a_3 <- 5]) /\
-      is_sint64_chunk(a_21[a_1 <- 7]) /\ is_sint8_chunk(a_9[a_7 <- 1]) /\
-      is_uint16_chunk(a_15[a_4 <- 4]) /\ is_uint32_chunk(a_19[a_2 <- 6]) /\
-      is_uint64_chunk(a_24) /\ is_uint8_chunk(a_11[a_6 <- 2]).
+      is_sint32(1 + i) /\ is_sint16_chunk(a_17) /\ is_sint32_chunk(a_9) /\
+      is_sint64_chunk(a_1) /\ is_sint8_chunk(a_25) /\
+      is_uint16_chunk(a_13) /\ is_uint32_chunk(a_5) /\
+      is_uint64_chunk(a_30) /\ is_uint8_chunk(a_21) /\
+      is_sint16_chunk(a_19) /\ is_sint32_chunk(a_11) /\
+      is_sint64_chunk(a_3) /\ is_sint8_chunk(a_27) /\
+      is_uint16_chunk(a_15) /\ is_uint32_chunk(a_7) /\
+      is_uint64_chunk(a_31) /\ is_uint8_chunk(a_23).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -996,60 +1101,83 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 <= i).
+  When: (i_1 <= i) /\ (0 <= i_1).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a_16, 10) /\
-      valid_rw(Malloc_0, a_20, 10) /\ valid_rw(Malloc_0, a_8, 10) /\
-      valid_rw(Malloc_0, a_14, 10) /\ valid_rw(Malloc_0, a_18, 10) /\
-      valid_rw(Malloc_0, a_22, 10) /\ valid_rw(Malloc_0, a_10, 10).
+  Have: valid_rw(Malloc_0, a_16, 10) /\ valid_rw(Malloc_0, a_8, 10) /\
+      valid_rw(Malloc_0, a, 10) /\ valid_rw(Malloc_0, a_24, 10) /\
+      valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a_4, 10) /\
+      valid_rw(Malloc_0, a_29, 10) /\ valid_rw(Malloc_0, a_20, 10).
   (* Invariant *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_23[shift_uint64(u64_0, i_2)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_21[shift_sint64(i64_0, i_2)] = 7))).
+      (a_25[shift_sint8(i8_0, i_2)] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_19[shift_uint32(u32_0, i_2)] = 6))).
+      (a_21[shift_uint8(u8_0, i_2)] = 2))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_17[shift_sint32(i32_0, i_2)] = 5))).
+      (a_17[shift_sint16(i16_0, i_2)] = 3))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_15[shift_uint16(u16_0, i_2)] = 4))).
+      (a_13[shift_uint16(u16_0, i_2)] = 4))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_13[shift_sint16(i16_0, i_2)] = 3))).
+      (a_9[shift_sint32(i32_0, i_2)] = 5))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_11[shift_uint8(u8_0, i_2)] = 2))).
+      (a_5[shift_uint32(u32_0, i_2)] = 6))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_9[shift_sint8(i8_0, i_2)] = 1))).
+      (a_1[shift_sint64(i64_0, i_2)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
+      (a_30[shift_uint64(u64_0, i_2)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_7, 1).
+  Have: valid_rw(Malloc_0, a_26, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_6, 1).
+  Have: valid_rw(Malloc_0, a_22, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_5, 1).
+  Have: valid_rw(Malloc_0, a_18, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_4, 1).
+  Have: valid_rw(Malloc_0, a_14, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_3, 1).
+  Have: valid_rw(Malloc_0, a_10, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_2, 1).
+  Have: valid_rw(Malloc_0, a_6, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a_1, 1).
+  Have: valid_rw(Malloc_0, a_2, 1).
   (* Assertion 'rte,mem_access' *)
-  Have: valid_rw(Malloc_0, a, 1).
+  Have: valid_rw(Malloc_0, a_28, 1).
   (* Assertion 'rte,signed_overflow' *)
   Have: i <= 2147483646.
+  (* Invariant *)
+  Have: (-1) <= i.
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_27[shift_sint8(i8_0, i_2)] = 1))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_23[shift_uint8(u8_0, i_2)] = 2))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_19[shift_sint16(i16_0, i_2)] = 3))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_15[shift_uint16(u16_0, i_2)] = 4))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_11[shift_sint32(i32_0, i_2)] = 5))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_7[shift_uint32(u32_0, i_2)] = 6))).
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_3[shift_sint64(i64_0, i_2)] = 7))).
 }
-Prove: a_24[shift_uint64(u64_0, i_1)] = 8.
+Prove: a_31[shift_uint64(u64_0, i_1)] = 8.
 
 ------------------------------------------------------------
 
@@ -1059,30 +1187,30 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Assertion 'rte,mem_access' (file tests/wp_acsl/chunk_typing.i, line 45):
-Let a = shift_sint8(i8_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, 10).
-Let a_2 = shift_uint8(u8_0, 0).
-Let a_3 = havoc(Mint_undef_6, Mint_6, a_2, 10).
-Let a_4 = shift_sint16(i16_0, 0).
-Let a_5 = havoc(Mint_undef_0, Mint_0, a_4, 10).
-Let a_6 = shift_uint16(u16_0, 0).
-Let a_7 = havoc(Mint_undef_3, Mint_3, a_6, 10).
-Let a_8 = shift_sint32(i32_0, 0).
-Let a_9 = havoc(Mint_undef_1, Mint_1, a_8, 10).
-Let a_10 = shift_uint32(u32_0, 0).
-Let a_11 = havoc(Mint_undef_4, Mint_4, a_10, 10).
-Let a_12 = shift_sint64(i64_0, 0).
-Let a_13 = havoc(Mint_undef_2, Mint_2, a_12, 10).
-Let a_14 = shift_uint64(u64_0, 0).
-Let a_15 = havoc(Mint_undef_5, Mint_5, a_14, 10).
+Let a = shift_uint64(u64_0, 0).
+Let a_1 = havoc(Mint_undef_5, Mint_5, a, 10).
+Let a_2 = shift_sint64(i64_0, 0).
+Let a_3 = havoc(Mint_undef_2, Mint_2, a_2, 10).
+Let a_4 = shift_uint32(u32_0, 0).
+Let a_5 = havoc(Mint_undef_4, Mint_4, a_4, 10).
+Let a_6 = shift_sint32(i32_0, 0).
+Let a_7 = havoc(Mint_undef_1, Mint_1, a_6, 10).
+Let a_8 = shift_uint16(u16_0, 0).
+Let a_9 = havoc(Mint_undef_3, Mint_3, a_8, 10).
+Let a_10 = shift_sint16(i16_0, 0).
+Let a_11 = havoc(Mint_undef_0, Mint_0, a_10, 10).
+Let a_12 = shift_uint8(u8_0, 0).
+Let a_13 = havoc(Mint_undef_6, Mint_6, a_12, 10).
+Let a_14 = shift_sint8(i8_0, 0).
+Let a_15 = havoc(Mchar_undef_0, Mchar_0, a_14, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_3) /\ is_uint32_chunk(Mint_4) /\
       is_uint64_chunk(Mint_5) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint16_chunk(a_5) /\ is_sint32_chunk(a_9) /\
-      is_sint64_chunk(a_13) /\ is_sint8_chunk(a_1) /\ is_uint16_chunk(a_7) /\
-      is_uint32_chunk(a_11) /\ is_uint64_chunk(a_15) /\ is_uint8_chunk(a_3).
+      is_sint16_chunk(a_11) /\ is_sint32_chunk(a_7) /\
+      is_sint64_chunk(a_3) /\ is_sint8_chunk(a_15) /\ is_uint16_chunk(a_9) /\
+      is_uint32_chunk(a_5) /\ is_uint64_chunk(a_1) /\ is_uint8_chunk(a_13).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -1090,36 +1218,36 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_4, 10) /\ valid_rw(Malloc_0, a_8, 10) /\
-      valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a, 10) /\
-      valid_rw(Malloc_0, a_6, 10) /\ valid_rw(Malloc_0, a_10, 10) /\
-      valid_rw(Malloc_0, a_14, 10) /\ valid_rw(Malloc_0, a_2, 10).
+  Have: valid_rw(Malloc_0, a_10, 10) /\ valid_rw(Malloc_0, a_6, 10) /\
+      valid_rw(Malloc_0, a_2, 10) /\ valid_rw(Malloc_0, a_14, 10) /\
+      valid_rw(Malloc_0, a_8, 10) /\ valid_rw(Malloc_0, a_4, 10) /\
+      valid_rw(Malloc_0, a, 10) /\ valid_rw(Malloc_0, a_12, 10).
   (* Invariant *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_15[shift_uint64(u64_0, i_1)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_13[shift_sint64(i64_0, i_1)] = 7))).
+      (a_15[shift_sint8(i8_0, i_1)] = 1))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_11[shift_uint32(u32_0, i_1)] = 6))).
+      (a_13[shift_uint8(u8_0, i_1)] = 2))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_9[shift_sint32(i32_0, i_1)] = 5))).
+      (a_11[shift_sint16(i16_0, i_1)] = 3))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_7[shift_uint16(u16_0, i_1)] = 4))).
+      (a_9[shift_uint16(u16_0, i_1)] = 4))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_5[shift_sint16(i16_0, i_1)] = 3))).
+      (a_7[shift_sint32(i32_0, i_1)] = 5))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_3[shift_uint8(u8_0, i_1)] = 2))).
+      (a_5[shift_uint32(u32_0, i_1)] = 6))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_1[shift_sint8(i8_0, i_1)] = 1))).
+      (a_3[shift_sint64(i64_0, i_1)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_1[shift_uint64(u64_0, i_1)] = 8))).
   (* Then *)
   Have: i <= 9.
 }
@@ -1129,31 +1257,32 @@ Prove: valid_rw(Malloc_0, shift_sint8(i8_0, i), 1).
 
 Goal Assertion 'rte,mem_access' (file tests/wp_acsl/chunk_typing.i, line 46):
 Let a = shift_sint8(i8_0, i).
-Let a_1 = shift_sint8(i8_0, 0).
-Let a_2 = havoc(Mchar_undef_0, Mchar_0, a_1, 10).
-Let a_3 = shift_uint8(u8_0, 0).
-Let a_4 = havoc(Mint_undef_6, Mint_6, a_3, 10).
-Let a_5 = shift_sint16(i16_0, 0).
-Let a_6 = havoc(Mint_undef_0, Mint_0, a_5, 10).
-Let a_7 = shift_uint16(u16_0, 0).
-Let a_8 = havoc(Mint_undef_3, Mint_3, a_7, 10).
-Let a_9 = shift_sint32(i32_0, 0).
-Let a_10 = havoc(Mint_undef_1, Mint_1, a_9, 10).
-Let a_11 = shift_uint32(u32_0, 0).
-Let a_12 = havoc(Mint_undef_4, Mint_4, a_11, 10).
-Let a_13 = shift_sint64(i64_0, 0).
-Let a_14 = havoc(Mint_undef_2, Mint_2, a_13, 10).
-Let a_15 = shift_uint64(u64_0, 0).
-Let a_16 = havoc(Mint_undef_5, Mint_5, a_15, 10).
+Let a_1 = shift_uint64(u64_0, 0).
+Let a_2 = havoc(Mint_undef_5, Mint_5, a_1, 10).
+Let a_3 = shift_sint64(i64_0, 0).
+Let a_4 = havoc(Mint_undef_2, Mint_2, a_3, 10).
+Let a_5 = shift_uint32(u32_0, 0).
+Let a_6 = havoc(Mint_undef_4, Mint_4, a_5, 10).
+Let a_7 = shift_sint32(i32_0, 0).
+Let a_8 = havoc(Mint_undef_1, Mint_1, a_7, 10).
+Let a_9 = shift_uint16(u16_0, 0).
+Let a_10 = havoc(Mint_undef_3, Mint_3, a_9, 10).
+Let a_11 = shift_sint16(i16_0, 0).
+Let a_12 = havoc(Mint_undef_0, Mint_0, a_11, 10).
+Let a_13 = shift_uint8(u8_0, 0).
+Let a_14 = havoc(Mint_undef_6, Mint_6, a_13, 10).
+Let a_15 = shift_sint8(i8_0, 0).
+Let a_16 = havoc(Mchar_undef_0, Mchar_0, a_15, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_3) /\ is_uint32_chunk(Mint_4) /\
       is_uint64_chunk(Mint_5) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint16_chunk(a_6) /\ is_sint32_chunk(a_10) /\
-      is_sint64_chunk(a_14) /\ is_sint8_chunk(a_2) /\ is_uint16_chunk(a_8) /\
-      is_uint32_chunk(a_12) /\ is_uint64_chunk(a_16) /\
-      is_uint8_chunk(a_4) /\ is_sint8_chunk(a_2[a <- 1]).
+      is_sint16_chunk(a_12) /\ is_sint32_chunk(a_8) /\
+      is_sint64_chunk(a_4) /\ is_sint8_chunk(a_16) /\
+      is_uint16_chunk(a_10) /\ is_uint32_chunk(a_6) /\
+      is_uint64_chunk(a_2) /\ is_uint8_chunk(a_14) /\
+      is_sint8_chunk(a_16[a <- 1]).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -1161,36 +1290,36 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_5, 10) /\ valid_rw(Malloc_0, a_9, 10) /\
-      valid_rw(Malloc_0, a_13, 10) /\ valid_rw(Malloc_0, a_1, 10) /\
-      valid_rw(Malloc_0, a_7, 10) /\ valid_rw(Malloc_0, a_11, 10) /\
-      valid_rw(Malloc_0, a_15, 10) /\ valid_rw(Malloc_0, a_3, 10).
+  Have: valid_rw(Malloc_0, a_11, 10) /\ valid_rw(Malloc_0, a_7, 10) /\
+      valid_rw(Malloc_0, a_3, 10) /\ valid_rw(Malloc_0, a_15, 10) /\
+      valid_rw(Malloc_0, a_9, 10) /\ valid_rw(Malloc_0, a_5, 10) /\
+      valid_rw(Malloc_0, a_1, 10) /\ valid_rw(Malloc_0, a_13, 10).
   (* Invariant *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_16[shift_uint64(u64_0, i_1)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_14[shift_sint64(i64_0, i_1)] = 7))).
+      (a_16[shift_sint8(i8_0, i_1)] = 1))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_12[shift_uint32(u32_0, i_1)] = 6))).
+      (a_14[shift_uint8(u8_0, i_1)] = 2))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_10[shift_sint32(i32_0, i_1)] = 5))).
+      (a_12[shift_sint16(i16_0, i_1)] = 3))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_8[shift_uint16(u16_0, i_1)] = 4))).
+      (a_10[shift_uint16(u16_0, i_1)] = 4))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_6[shift_sint16(i16_0, i_1)] = 3))).
+      (a_8[shift_sint32(i32_0, i_1)] = 5))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_4[shift_uint8(u8_0, i_1)] = 2))).
+      (a_6[shift_uint32(u32_0, i_1)] = 6))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_2[shift_sint8(i8_0, i_1)] = 1))).
+      (a_4[shift_sint64(i64_0, i_1)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_2[shift_uint64(u64_0, i_1)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
@@ -1203,32 +1332,32 @@ Prove: valid_rw(Malloc_0, shift_uint8(u8_0, i), 1).
 Goal Assertion 'rte,mem_access' (file tests/wp_acsl/chunk_typing.i, line 47):
 Let a = shift_uint8(u8_0, i).
 Let a_1 = shift_sint8(i8_0, i).
-Let a_2 = shift_sint8(i8_0, 0).
-Let a_3 = havoc(Mchar_undef_0, Mchar_0, a_2, 10).
-Let a_4 = shift_uint8(u8_0, 0).
-Let a_5 = havoc(Mint_undef_6, Mint_6, a_4, 10).
-Let a_6 = shift_sint16(i16_0, 0).
-Let a_7 = havoc(Mint_undef_0, Mint_0, a_6, 10).
-Let a_8 = shift_uint16(u16_0, 0).
-Let a_9 = havoc(Mint_undef_3, Mint_3, a_8, 10).
-Let a_10 = shift_sint32(i32_0, 0).
-Let a_11 = havoc(Mint_undef_1, Mint_1, a_10, 10).
-Let a_12 = shift_uint32(u32_0, 0).
-Let a_13 = havoc(Mint_undef_4, Mint_4, a_12, 10).
-Let a_14 = shift_sint64(i64_0, 0).
-Let a_15 = havoc(Mint_undef_2, Mint_2, a_14, 10).
-Let a_16 = shift_uint64(u64_0, 0).
-Let a_17 = havoc(Mint_undef_5, Mint_5, a_16, 10).
+Let a_2 = shift_uint64(u64_0, 0).
+Let a_3 = havoc(Mint_undef_5, Mint_5, a_2, 10).
+Let a_4 = shift_sint64(i64_0, 0).
+Let a_5 = havoc(Mint_undef_2, Mint_2, a_4, 10).
+Let a_6 = shift_uint32(u32_0, 0).
+Let a_7 = havoc(Mint_undef_4, Mint_4, a_6, 10).
+Let a_8 = shift_sint32(i32_0, 0).
+Let a_9 = havoc(Mint_undef_1, Mint_1, a_8, 10).
+Let a_10 = shift_uint16(u16_0, 0).
+Let a_11 = havoc(Mint_undef_3, Mint_3, a_10, 10).
+Let a_12 = shift_sint16(i16_0, 0).
+Let a_13 = havoc(Mint_undef_0, Mint_0, a_12, 10).
+Let a_14 = shift_uint8(u8_0, 0).
+Let a_15 = havoc(Mint_undef_6, Mint_6, a_14, 10).
+Let a_16 = shift_sint8(i8_0, 0).
+Let a_17 = havoc(Mchar_undef_0, Mchar_0, a_16, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_3) /\ is_uint32_chunk(Mint_4) /\
       is_uint64_chunk(Mint_5) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint16_chunk(a_7) /\ is_sint32_chunk(a_11) /\
-      is_sint64_chunk(a_15) /\ is_sint8_chunk(a_3) /\ is_uint16_chunk(a_9) /\
-      is_uint32_chunk(a_13) /\ is_uint64_chunk(a_17) /\
-      is_uint8_chunk(a_5) /\ is_sint8_chunk(a_3[a_1 <- 1]) /\
-      is_uint8_chunk(a_5[a <- 2]).
+      is_sint16_chunk(a_13) /\ is_sint32_chunk(a_9) /\
+      is_sint64_chunk(a_5) /\ is_sint8_chunk(a_17) /\
+      is_uint16_chunk(a_11) /\ is_uint32_chunk(a_7) /\
+      is_uint64_chunk(a_3) /\ is_uint8_chunk(a_15) /\
+      is_sint8_chunk(a_17[a_1 <- 1]) /\ is_uint8_chunk(a_15[a <- 2]).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -1236,36 +1365,36 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_6, 10) /\ valid_rw(Malloc_0, a_10, 10) /\
-      valid_rw(Malloc_0, a_14, 10) /\ valid_rw(Malloc_0, a_2, 10) /\
-      valid_rw(Malloc_0, a_8, 10) /\ valid_rw(Malloc_0, a_12, 10) /\
-      valid_rw(Malloc_0, a_16, 10) /\ valid_rw(Malloc_0, a_4, 10).
+  Have: valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a_8, 10) /\
+      valid_rw(Malloc_0, a_4, 10) /\ valid_rw(Malloc_0, a_16, 10) /\
+      valid_rw(Malloc_0, a_10, 10) /\ valid_rw(Malloc_0, a_6, 10) /\
+      valid_rw(Malloc_0, a_2, 10) /\ valid_rw(Malloc_0, a_14, 10).
   (* Invariant *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_17[shift_uint64(u64_0, i_1)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_15[shift_sint64(i64_0, i_1)] = 7))).
+      (a_17[shift_sint8(i8_0, i_1)] = 1))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_13[shift_uint32(u32_0, i_1)] = 6))).
+      (a_15[shift_uint8(u8_0, i_1)] = 2))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_11[shift_sint32(i32_0, i_1)] = 5))).
+      (a_13[shift_sint16(i16_0, i_1)] = 3))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_9[shift_uint16(u16_0, i_1)] = 4))).
+      (a_11[shift_uint16(u16_0, i_1)] = 4))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_7[shift_sint16(i16_0, i_1)] = 3))).
+      (a_9[shift_sint32(i32_0, i_1)] = 5))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_5[shift_uint8(u8_0, i_1)] = 2))).
+      (a_7[shift_uint32(u32_0, i_1)] = 6))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_3[shift_sint8(i8_0, i_1)] = 1))).
+      (a_5[shift_sint64(i64_0, i_1)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_3[shift_uint64(u64_0, i_1)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
@@ -1281,33 +1410,33 @@ Goal Assertion 'rte,mem_access' (file tests/wp_acsl/chunk_typing.i, line 48):
 Let a = shift_sint16(i16_0, i).
 Let a_1 = shift_uint8(u8_0, i).
 Let a_2 = shift_sint8(i8_0, i).
-Let a_3 = shift_sint8(i8_0, 0).
-Let a_4 = havoc(Mchar_undef_0, Mchar_0, a_3, 10).
-Let a_5 = shift_uint8(u8_0, 0).
-Let a_6 = havoc(Mint_undef_6, Mint_6, a_5, 10).
-Let a_7 = shift_sint16(i16_0, 0).
-Let a_8 = havoc(Mint_undef_0, Mint_0, a_7, 10).
-Let a_9 = shift_uint16(u16_0, 0).
-Let a_10 = havoc(Mint_undef_3, Mint_3, a_9, 10).
-Let a_11 = shift_sint32(i32_0, 0).
-Let a_12 = havoc(Mint_undef_1, Mint_1, a_11, 10).
-Let a_13 = shift_uint32(u32_0, 0).
-Let a_14 = havoc(Mint_undef_4, Mint_4, a_13, 10).
-Let a_15 = shift_sint64(i64_0, 0).
-Let a_16 = havoc(Mint_undef_2, Mint_2, a_15, 10).
-Let a_17 = shift_uint64(u64_0, 0).
-Let a_18 = havoc(Mint_undef_5, Mint_5, a_17, 10).
+Let a_3 = shift_uint64(u64_0, 0).
+Let a_4 = havoc(Mint_undef_5, Mint_5, a_3, 10).
+Let a_5 = shift_sint64(i64_0, 0).
+Let a_6 = havoc(Mint_undef_2, Mint_2, a_5, 10).
+Let a_7 = shift_uint32(u32_0, 0).
+Let a_8 = havoc(Mint_undef_4, Mint_4, a_7, 10).
+Let a_9 = shift_sint32(i32_0, 0).
+Let a_10 = havoc(Mint_undef_1, Mint_1, a_9, 10).
+Let a_11 = shift_uint16(u16_0, 0).
+Let a_12 = havoc(Mint_undef_3, Mint_3, a_11, 10).
+Let a_13 = shift_sint16(i16_0, 0).
+Let a_14 = havoc(Mint_undef_0, Mint_0, a_13, 10).
+Let a_15 = shift_uint8(u8_0, 0).
+Let a_16 = havoc(Mint_undef_6, Mint_6, a_15, 10).
+Let a_17 = shift_sint8(i8_0, 0).
+Let a_18 = havoc(Mchar_undef_0, Mchar_0, a_17, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_3) /\ is_uint32_chunk(Mint_4) /\
       is_uint64_chunk(Mint_5) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint16_chunk(a_8) /\ is_sint32_chunk(a_12) /\
-      is_sint64_chunk(a_16) /\ is_sint8_chunk(a_4) /\
-      is_uint16_chunk(a_10) /\ is_uint32_chunk(a_14) /\
-      is_uint64_chunk(a_18) /\ is_uint8_chunk(a_6) /\
-      is_sint16_chunk(a_8[a <- 3]) /\ is_sint8_chunk(a_4[a_2 <- 1]) /\
-      is_uint8_chunk(a_6[a_1 <- 2]).
+      is_sint16_chunk(a_14) /\ is_sint32_chunk(a_10) /\
+      is_sint64_chunk(a_6) /\ is_sint8_chunk(a_18) /\
+      is_uint16_chunk(a_12) /\ is_uint32_chunk(a_8) /\
+      is_uint64_chunk(a_4) /\ is_uint8_chunk(a_16) /\
+      is_sint16_chunk(a_14[a <- 3]) /\ is_sint8_chunk(a_18[a_2 <- 1]) /\
+      is_uint8_chunk(a_16[a_1 <- 2]).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -1315,36 +1444,36 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_7, 10) /\ valid_rw(Malloc_0, a_11, 10) /\
-      valid_rw(Malloc_0, a_15, 10) /\ valid_rw(Malloc_0, a_3, 10) /\
-      valid_rw(Malloc_0, a_9, 10) /\ valid_rw(Malloc_0, a_13, 10) /\
-      valid_rw(Malloc_0, a_17, 10) /\ valid_rw(Malloc_0, a_5, 10).
+  Have: valid_rw(Malloc_0, a_13, 10) /\ valid_rw(Malloc_0, a_9, 10) /\
+      valid_rw(Malloc_0, a_5, 10) /\ valid_rw(Malloc_0, a_17, 10) /\
+      valid_rw(Malloc_0, a_11, 10) /\ valid_rw(Malloc_0, a_7, 10) /\
+      valid_rw(Malloc_0, a_3, 10) /\ valid_rw(Malloc_0, a_15, 10).
   (* Invariant *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_18[shift_uint64(u64_0, i_1)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_16[shift_sint64(i64_0, i_1)] = 7))).
+      (a_18[shift_sint8(i8_0, i_1)] = 1))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_14[shift_uint32(u32_0, i_1)] = 6))).
+      (a_16[shift_uint8(u8_0, i_1)] = 2))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_12[shift_sint32(i32_0, i_1)] = 5))).
+      (a_14[shift_sint16(i16_0, i_1)] = 3))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_10[shift_uint16(u16_0, i_1)] = 4))).
+      (a_12[shift_uint16(u16_0, i_1)] = 4))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_8[shift_sint16(i16_0, i_1)] = 3))).
+      (a_10[shift_sint32(i32_0, i_1)] = 5))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_6[shift_uint8(u8_0, i_1)] = 2))).
+      (a_8[shift_uint32(u32_0, i_1)] = 6))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_4[shift_sint8(i8_0, i_1)] = 1))).
+      (a_6[shift_sint64(i64_0, i_1)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_4[shift_uint64(u64_0, i_1)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
@@ -1363,33 +1492,33 @@ Let a = shift_uint16(u16_0, i).
 Let a_1 = shift_sint16(i16_0, i).
 Let a_2 = shift_uint8(u8_0, i).
 Let a_3 = shift_sint8(i8_0, i).
-Let a_4 = shift_sint8(i8_0, 0).
-Let a_5 = havoc(Mchar_undef_0, Mchar_0, a_4, 10).
-Let a_6 = shift_uint8(u8_0, 0).
-Let a_7 = havoc(Mint_undef_6, Mint_6, a_6, 10).
-Let a_8 = shift_sint16(i16_0, 0).
-Let a_9 = havoc(Mint_undef_0, Mint_0, a_8, 10).
-Let a_10 = shift_uint16(u16_0, 0).
-Let a_11 = havoc(Mint_undef_3, Mint_3, a_10, 10).
-Let a_12 = shift_sint32(i32_0, 0).
-Let a_13 = havoc(Mint_undef_1, Mint_1, a_12, 10).
-Let a_14 = shift_uint32(u32_0, 0).
-Let a_15 = havoc(Mint_undef_4, Mint_4, a_14, 10).
-Let a_16 = shift_sint64(i64_0, 0).
-Let a_17 = havoc(Mint_undef_2, Mint_2, a_16, 10).
-Let a_18 = shift_uint64(u64_0, 0).
-Let a_19 = havoc(Mint_undef_5, Mint_5, a_18, 10).
+Let a_4 = shift_uint64(u64_0, 0).
+Let a_5 = havoc(Mint_undef_5, Mint_5, a_4, 10).
+Let a_6 = shift_sint64(i64_0, 0).
+Let a_7 = havoc(Mint_undef_2, Mint_2, a_6, 10).
+Let a_8 = shift_uint32(u32_0, 0).
+Let a_9 = havoc(Mint_undef_4, Mint_4, a_8, 10).
+Let a_10 = shift_sint32(i32_0, 0).
+Let a_11 = havoc(Mint_undef_1, Mint_1, a_10, 10).
+Let a_12 = shift_uint16(u16_0, 0).
+Let a_13 = havoc(Mint_undef_3, Mint_3, a_12, 10).
+Let a_14 = shift_sint16(i16_0, 0).
+Let a_15 = havoc(Mint_undef_0, Mint_0, a_14, 10).
+Let a_16 = shift_uint8(u8_0, 0).
+Let a_17 = havoc(Mint_undef_6, Mint_6, a_16, 10).
+Let a_18 = shift_sint8(i8_0, 0).
+Let a_19 = havoc(Mchar_undef_0, Mchar_0, a_18, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_3) /\ is_uint32_chunk(Mint_4) /\
       is_uint64_chunk(Mint_5) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint16_chunk(a_9) /\ is_sint32_chunk(a_13) /\
-      is_sint64_chunk(a_17) /\ is_sint8_chunk(a_5) /\
-      is_uint16_chunk(a_11) /\ is_uint32_chunk(a_15) /\
-      is_uint64_chunk(a_19) /\ is_uint8_chunk(a_7) /\
-      is_sint16_chunk(a_9[a_1 <- 3]) /\ is_sint8_chunk(a_5[a_3 <- 1]) /\
-      is_uint16_chunk(a_11[a <- 4]) /\ is_uint8_chunk(a_7[a_2 <- 2]).
+      is_sint16_chunk(a_15) /\ is_sint32_chunk(a_11) /\
+      is_sint64_chunk(a_7) /\ is_sint8_chunk(a_19) /\
+      is_uint16_chunk(a_13) /\ is_uint32_chunk(a_9) /\
+      is_uint64_chunk(a_5) /\ is_uint8_chunk(a_17) /\
+      is_sint16_chunk(a_15[a_1 <- 3]) /\ is_sint8_chunk(a_19[a_3 <- 1]) /\
+      is_uint16_chunk(a_13[a <- 4]) /\ is_uint8_chunk(a_17[a_2 <- 2]).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -1397,36 +1526,36 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_8, 10) /\ valid_rw(Malloc_0, a_12, 10) /\
-      valid_rw(Malloc_0, a_16, 10) /\ valid_rw(Malloc_0, a_4, 10) /\
-      valid_rw(Malloc_0, a_10, 10) /\ valid_rw(Malloc_0, a_14, 10) /\
-      valid_rw(Malloc_0, a_18, 10) /\ valid_rw(Malloc_0, a_6, 10).
+  Have: valid_rw(Malloc_0, a_14, 10) /\ valid_rw(Malloc_0, a_10, 10) /\
+      valid_rw(Malloc_0, a_6, 10) /\ valid_rw(Malloc_0, a_18, 10) /\
+      valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a_8, 10) /\
+      valid_rw(Malloc_0, a_4, 10) /\ valid_rw(Malloc_0, a_16, 10).
   (* Invariant *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_19[shift_uint64(u64_0, i_1)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_17[shift_sint64(i64_0, i_1)] = 7))).
+      (a_19[shift_sint8(i8_0, i_1)] = 1))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_15[shift_uint32(u32_0, i_1)] = 6))).
+      (a_17[shift_uint8(u8_0, i_1)] = 2))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_13[shift_sint32(i32_0, i_1)] = 5))).
+      (a_15[shift_sint16(i16_0, i_1)] = 3))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_11[shift_uint16(u16_0, i_1)] = 4))).
+      (a_13[shift_uint16(u16_0, i_1)] = 4))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_9[shift_sint16(i16_0, i_1)] = 3))).
+      (a_11[shift_sint32(i32_0, i_1)] = 5))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_7[shift_uint8(u8_0, i_1)] = 2))).
+      (a_9[shift_uint32(u32_0, i_1)] = 6))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_5[shift_sint8(i8_0, i_1)] = 1))).
+      (a_7[shift_sint64(i64_0, i_1)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_5[shift_uint64(u64_0, i_1)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
@@ -1448,34 +1577,34 @@ Let a_1 = shift_uint16(u16_0, i).
 Let a_2 = shift_sint16(i16_0, i).
 Let a_3 = shift_uint8(u8_0, i).
 Let a_4 = shift_sint8(i8_0, i).
-Let a_5 = shift_sint8(i8_0, 0).
-Let a_6 = havoc(Mchar_undef_0, Mchar_0, a_5, 10).
-Let a_7 = shift_uint8(u8_0, 0).
-Let a_8 = havoc(Mint_undef_6, Mint_6, a_7, 10).
-Let a_9 = shift_sint16(i16_0, 0).
-Let a_10 = havoc(Mint_undef_0, Mint_0, a_9, 10).
-Let a_11 = shift_uint16(u16_0, 0).
-Let a_12 = havoc(Mint_undef_3, Mint_3, a_11, 10).
-Let a_13 = shift_sint32(i32_0, 0).
-Let a_14 = havoc(Mint_undef_1, Mint_1, a_13, 10).
-Let a_15 = shift_uint32(u32_0, 0).
-Let a_16 = havoc(Mint_undef_4, Mint_4, a_15, 10).
-Let a_17 = shift_sint64(i64_0, 0).
-Let a_18 = havoc(Mint_undef_2, Mint_2, a_17, 10).
-Let a_19 = shift_uint64(u64_0, 0).
-Let a_20 = havoc(Mint_undef_5, Mint_5, a_19, 10).
+Let a_5 = shift_uint64(u64_0, 0).
+Let a_6 = havoc(Mint_undef_5, Mint_5, a_5, 10).
+Let a_7 = shift_sint64(i64_0, 0).
+Let a_8 = havoc(Mint_undef_2, Mint_2, a_7, 10).
+Let a_9 = shift_uint32(u32_0, 0).
+Let a_10 = havoc(Mint_undef_4, Mint_4, a_9, 10).
+Let a_11 = shift_sint32(i32_0, 0).
+Let a_12 = havoc(Mint_undef_1, Mint_1, a_11, 10).
+Let a_13 = shift_uint16(u16_0, 0).
+Let a_14 = havoc(Mint_undef_3, Mint_3, a_13, 10).
+Let a_15 = shift_sint16(i16_0, 0).
+Let a_16 = havoc(Mint_undef_0, Mint_0, a_15, 10).
+Let a_17 = shift_uint8(u8_0, 0).
+Let a_18 = havoc(Mint_undef_6, Mint_6, a_17, 10).
+Let a_19 = shift_sint8(i8_0, 0).
+Let a_20 = havoc(Mchar_undef_0, Mchar_0, a_19, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_3) /\ is_uint32_chunk(Mint_4) /\
       is_uint64_chunk(Mint_5) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint16_chunk(a_10) /\ is_sint32_chunk(a_14) /\
-      is_sint64_chunk(a_18) /\ is_sint8_chunk(a_6) /\
-      is_uint16_chunk(a_12) /\ is_uint32_chunk(a_16) /\
-      is_uint64_chunk(a_20) /\ is_uint8_chunk(a_8) /\
-      is_sint16_chunk(a_10[a_2 <- 3]) /\ is_sint32_chunk(a_14[a <- 5]) /\
-      is_sint8_chunk(a_6[a_4 <- 1]) /\ is_uint16_chunk(a_12[a_1 <- 4]) /\
-      is_uint8_chunk(a_8[a_3 <- 2]).
+      is_sint16_chunk(a_16) /\ is_sint32_chunk(a_12) /\
+      is_sint64_chunk(a_8) /\ is_sint8_chunk(a_20) /\
+      is_uint16_chunk(a_14) /\ is_uint32_chunk(a_10) /\
+      is_uint64_chunk(a_6) /\ is_uint8_chunk(a_18) /\
+      is_sint16_chunk(a_16[a_2 <- 3]) /\ is_sint32_chunk(a_12[a <- 5]) /\
+      is_sint8_chunk(a_20[a_4 <- 1]) /\ is_uint16_chunk(a_14[a_1 <- 4]) /\
+      is_uint8_chunk(a_18[a_3 <- 2]).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -1483,36 +1612,36 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_9, 10) /\ valid_rw(Malloc_0, a_13, 10) /\
-      valid_rw(Malloc_0, a_17, 10) /\ valid_rw(Malloc_0, a_5, 10) /\
-      valid_rw(Malloc_0, a_11, 10) /\ valid_rw(Malloc_0, a_15, 10) /\
-      valid_rw(Malloc_0, a_19, 10) /\ valid_rw(Malloc_0, a_7, 10).
+  Have: valid_rw(Malloc_0, a_15, 10) /\ valid_rw(Malloc_0, a_11, 10) /\
+      valid_rw(Malloc_0, a_7, 10) /\ valid_rw(Malloc_0, a_19, 10) /\
+      valid_rw(Malloc_0, a_13, 10) /\ valid_rw(Malloc_0, a_9, 10) /\
+      valid_rw(Malloc_0, a_5, 10) /\ valid_rw(Malloc_0, a_17, 10).
   (* Invariant *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_20[shift_uint64(u64_0, i_1)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_18[shift_sint64(i64_0, i_1)] = 7))).
+      (a_20[shift_sint8(i8_0, i_1)] = 1))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_16[shift_uint32(u32_0, i_1)] = 6))).
+      (a_18[shift_uint8(u8_0, i_1)] = 2))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_14[shift_sint32(i32_0, i_1)] = 5))).
+      (a_16[shift_sint16(i16_0, i_1)] = 3))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_12[shift_uint16(u16_0, i_1)] = 4))).
+      (a_14[shift_uint16(u16_0, i_1)] = 4))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_10[shift_sint16(i16_0, i_1)] = 3))).
+      (a_12[shift_sint32(i32_0, i_1)] = 5))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_8[shift_uint8(u8_0, i_1)] = 2))).
+      (a_10[shift_uint32(u32_0, i_1)] = 6))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_6[shift_sint8(i8_0, i_1)] = 1))).
+      (a_8[shift_sint64(i64_0, i_1)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_6[shift_uint64(u64_0, i_1)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
@@ -1537,34 +1666,34 @@ Let a_2 = shift_uint16(u16_0, i).
 Let a_3 = shift_sint16(i16_0, i).
 Let a_4 = shift_uint8(u8_0, i).
 Let a_5 = shift_sint8(i8_0, i).
-Let a_6 = shift_sint8(i8_0, 0).
-Let a_7 = havoc(Mchar_undef_0, Mchar_0, a_6, 10).
-Let a_8 = shift_uint8(u8_0, 0).
-Let a_9 = havoc(Mint_undef_6, Mint_6, a_8, 10).
-Let a_10 = shift_sint16(i16_0, 0).
-Let a_11 = havoc(Mint_undef_0, Mint_0, a_10, 10).
-Let a_12 = shift_uint16(u16_0, 0).
-Let a_13 = havoc(Mint_undef_3, Mint_3, a_12, 10).
-Let a_14 = shift_sint32(i32_0, 0).
-Let a_15 = havoc(Mint_undef_1, Mint_1, a_14, 10).
-Let a_16 = shift_uint32(u32_0, 0).
-Let a_17 = havoc(Mint_undef_4, Mint_4, a_16, 10).
-Let a_18 = shift_sint64(i64_0, 0).
-Let a_19 = havoc(Mint_undef_2, Mint_2, a_18, 10).
-Let a_20 = shift_uint64(u64_0, 0).
-Let a_21 = havoc(Mint_undef_5, Mint_5, a_20, 10).
+Let a_6 = shift_uint64(u64_0, 0).
+Let a_7 = havoc(Mint_undef_5, Mint_5, a_6, 10).
+Let a_8 = shift_sint64(i64_0, 0).
+Let a_9 = havoc(Mint_undef_2, Mint_2, a_8, 10).
+Let a_10 = shift_uint32(u32_0, 0).
+Let a_11 = havoc(Mint_undef_4, Mint_4, a_10, 10).
+Let a_12 = shift_sint32(i32_0, 0).
+Let a_13 = havoc(Mint_undef_1, Mint_1, a_12, 10).
+Let a_14 = shift_uint16(u16_0, 0).
+Let a_15 = havoc(Mint_undef_3, Mint_3, a_14, 10).
+Let a_16 = shift_sint16(i16_0, 0).
+Let a_17 = havoc(Mint_undef_0, Mint_0, a_16, 10).
+Let a_18 = shift_uint8(u8_0, 0).
+Let a_19 = havoc(Mint_undef_6, Mint_6, a_18, 10).
+Let a_20 = shift_sint8(i8_0, 0).
+Let a_21 = havoc(Mchar_undef_0, Mchar_0, a_20, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_3) /\ is_uint32_chunk(Mint_4) /\
       is_uint64_chunk(Mint_5) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint16_chunk(a_11) /\ is_sint32_chunk(a_15) /\
-      is_sint64_chunk(a_19) /\ is_sint8_chunk(a_7) /\
-      is_uint16_chunk(a_13) /\ is_uint32_chunk(a_17) /\
-      is_uint64_chunk(a_21) /\ is_uint8_chunk(a_9) /\
-      is_sint16_chunk(a_11[a_3 <- 3]) /\ is_sint32_chunk(a_15[a_1 <- 5]) /\
-      is_sint8_chunk(a_7[a_5 <- 1]) /\ is_uint16_chunk(a_13[a_2 <- 4]) /\
-      is_uint32_chunk(a_17[a <- 6]) /\ is_uint8_chunk(a_9[a_4 <- 2]).
+      is_sint16_chunk(a_17) /\ is_sint32_chunk(a_13) /\
+      is_sint64_chunk(a_9) /\ is_sint8_chunk(a_21) /\
+      is_uint16_chunk(a_15) /\ is_uint32_chunk(a_11) /\
+      is_uint64_chunk(a_7) /\ is_uint8_chunk(a_19) /\
+      is_sint16_chunk(a_17[a_3 <- 3]) /\ is_sint32_chunk(a_13[a_1 <- 5]) /\
+      is_sint8_chunk(a_21[a_5 <- 1]) /\ is_uint16_chunk(a_15[a_2 <- 4]) /\
+      is_uint32_chunk(a_11[a <- 6]) /\ is_uint8_chunk(a_19[a_4 <- 2]).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -1572,36 +1701,36 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_10, 10) /\ valid_rw(Malloc_0, a_14, 10) /\
-      valid_rw(Malloc_0, a_18, 10) /\ valid_rw(Malloc_0, a_6, 10) /\
-      valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a_16, 10) /\
-      valid_rw(Malloc_0, a_20, 10) /\ valid_rw(Malloc_0, a_8, 10).
+  Have: valid_rw(Malloc_0, a_16, 10) /\ valid_rw(Malloc_0, a_12, 10) /\
+      valid_rw(Malloc_0, a_8, 10) /\ valid_rw(Malloc_0, a_20, 10) /\
+      valid_rw(Malloc_0, a_14, 10) /\ valid_rw(Malloc_0, a_10, 10) /\
+      valid_rw(Malloc_0, a_6, 10) /\ valid_rw(Malloc_0, a_18, 10).
   (* Invariant *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_21[shift_uint64(u64_0, i_1)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_19[shift_sint64(i64_0, i_1)] = 7))).
+      (a_21[shift_sint8(i8_0, i_1)] = 1))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_17[shift_uint32(u32_0, i_1)] = 6))).
+      (a_19[shift_uint8(u8_0, i_1)] = 2))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_15[shift_sint32(i32_0, i_1)] = 5))).
+      (a_17[shift_sint16(i16_0, i_1)] = 3))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_13[shift_uint16(u16_0, i_1)] = 4))).
+      (a_15[shift_uint16(u16_0, i_1)] = 4))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_11[shift_sint16(i16_0, i_1)] = 3))).
+      (a_13[shift_sint32(i32_0, i_1)] = 5))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_9[shift_uint8(u8_0, i_1)] = 2))).
+      (a_11[shift_uint32(u32_0, i_1)] = 6))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_7[shift_sint8(i8_0, i_1)] = 1))).
+      (a_9[shift_sint64(i64_0, i_1)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_7[shift_uint64(u64_0, i_1)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
@@ -1629,35 +1758,35 @@ Let a_3 = shift_uint16(u16_0, i).
 Let a_4 = shift_sint16(i16_0, i).
 Let a_5 = shift_uint8(u8_0, i).
 Let a_6 = shift_sint8(i8_0, i).
-Let a_7 = shift_sint8(i8_0, 0).
-Let a_8 = havoc(Mchar_undef_0, Mchar_0, a_7, 10).
-Let a_9 = shift_uint8(u8_0, 0).
-Let a_10 = havoc(Mint_undef_6, Mint_6, a_9, 10).
-Let a_11 = shift_sint16(i16_0, 0).
-Let a_12 = havoc(Mint_undef_0, Mint_0, a_11, 10).
-Let a_13 = shift_uint16(u16_0, 0).
-Let a_14 = havoc(Mint_undef_3, Mint_3, a_13, 10).
-Let a_15 = shift_sint32(i32_0, 0).
-Let a_16 = havoc(Mint_undef_1, Mint_1, a_15, 10).
-Let a_17 = shift_uint32(u32_0, 0).
-Let a_18 = havoc(Mint_undef_4, Mint_4, a_17, 10).
-Let a_19 = shift_sint64(i64_0, 0).
-Let a_20 = havoc(Mint_undef_2, Mint_2, a_19, 10).
-Let a_21 = shift_uint64(u64_0, 0).
-Let a_22 = havoc(Mint_undef_5, Mint_5, a_21, 10).
+Let a_7 = shift_uint64(u64_0, 0).
+Let a_8 = havoc(Mint_undef_5, Mint_5, a_7, 10).
+Let a_9 = shift_sint64(i64_0, 0).
+Let a_10 = havoc(Mint_undef_2, Mint_2, a_9, 10).
+Let a_11 = shift_uint32(u32_0, 0).
+Let a_12 = havoc(Mint_undef_4, Mint_4, a_11, 10).
+Let a_13 = shift_sint32(i32_0, 0).
+Let a_14 = havoc(Mint_undef_1, Mint_1, a_13, 10).
+Let a_15 = shift_uint16(u16_0, 0).
+Let a_16 = havoc(Mint_undef_3, Mint_3, a_15, 10).
+Let a_17 = shift_sint16(i16_0, 0).
+Let a_18 = havoc(Mint_undef_0, Mint_0, a_17, 10).
+Let a_19 = shift_uint8(u8_0, 0).
+Let a_20 = havoc(Mint_undef_6, Mint_6, a_19, 10).
+Let a_21 = shift_sint8(i8_0, 0).
+Let a_22 = havoc(Mchar_undef_0, Mchar_0, a_21, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_3) /\ is_uint32_chunk(Mint_4) /\
       is_uint64_chunk(Mint_5) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint16_chunk(a_12) /\ is_sint32_chunk(a_16) /\
-      is_sint64_chunk(a_20) /\ is_sint8_chunk(a_8) /\
-      is_uint16_chunk(a_14) /\ is_uint32_chunk(a_18) /\
-      is_uint64_chunk(a_22) /\ is_uint8_chunk(a_10) /\
-      is_sint16_chunk(a_12[a_4 <- 3]) /\ is_sint32_chunk(a_16[a_2 <- 5]) /\
-      is_sint64_chunk(a_20[a <- 7]) /\ is_sint8_chunk(a_8[a_6 <- 1]) /\
-      is_uint16_chunk(a_14[a_3 <- 4]) /\ is_uint32_chunk(a_18[a_1 <- 6]) /\
-      is_uint8_chunk(a_10[a_5 <- 2]).
+      is_sint16_chunk(a_18) /\ is_sint32_chunk(a_14) /\
+      is_sint64_chunk(a_10) /\ is_sint8_chunk(a_22) /\
+      is_uint16_chunk(a_16) /\ is_uint32_chunk(a_12) /\
+      is_uint64_chunk(a_8) /\ is_uint8_chunk(a_20) /\
+      is_sint16_chunk(a_18[a_4 <- 3]) /\ is_sint32_chunk(a_14[a_2 <- 5]) /\
+      is_sint64_chunk(a_10[a <- 7]) /\ is_sint8_chunk(a_22[a_6 <- 1]) /\
+      is_uint16_chunk(a_16[a_3 <- 4]) /\ is_uint32_chunk(a_12[a_1 <- 6]) /\
+      is_uint8_chunk(a_20[a_5 <- 2]).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -1665,36 +1794,36 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_11, 10) /\ valid_rw(Malloc_0, a_15, 10) /\
-      valid_rw(Malloc_0, a_19, 10) /\ valid_rw(Malloc_0, a_7, 10) /\
-      valid_rw(Malloc_0, a_13, 10) /\ valid_rw(Malloc_0, a_17, 10) /\
-      valid_rw(Malloc_0, a_21, 10) /\ valid_rw(Malloc_0, a_9, 10).
+  Have: valid_rw(Malloc_0, a_17, 10) /\ valid_rw(Malloc_0, a_13, 10) /\
+      valid_rw(Malloc_0, a_9, 10) /\ valid_rw(Malloc_0, a_21, 10) /\
+      valid_rw(Malloc_0, a_15, 10) /\ valid_rw(Malloc_0, a_11, 10) /\
+      valid_rw(Malloc_0, a_7, 10) /\ valid_rw(Malloc_0, a_19, 10).
   (* Invariant *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_22[shift_uint64(u64_0, i_1)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_20[shift_sint64(i64_0, i_1)] = 7))).
+      (a_22[shift_sint8(i8_0, i_1)] = 1))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_18[shift_uint32(u32_0, i_1)] = 6))).
+      (a_20[shift_uint8(u8_0, i_1)] = 2))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_16[shift_sint32(i32_0, i_1)] = 5))).
+      (a_18[shift_sint16(i16_0, i_1)] = 3))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_14[shift_uint16(u16_0, i_1)] = 4))).
+      (a_16[shift_uint16(u16_0, i_1)] = 4))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_12[shift_sint16(i16_0, i_1)] = 3))).
+      (a_14[shift_sint32(i32_0, i_1)] = 5))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_10[shift_uint8(u8_0, i_1)] = 2))).
+      (a_12[shift_uint32(u32_0, i_1)] = 6))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_8[shift_sint8(i8_0, i_1)] = 1))).
+      (a_10[shift_sint64(i64_0, i_1)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_8[shift_uint64(u64_0, i_1)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
@@ -1725,35 +1854,35 @@ Let a_4 = shift_uint16(u16_0, i).
 Let a_5 = shift_sint16(i16_0, i).
 Let a_6 = shift_uint8(u8_0, i).
 Let a_7 = shift_sint8(i8_0, i).
-Let a_8 = shift_sint8(i8_0, 0).
-Let a_9 = havoc(Mchar_undef_0, Mchar_0, a_8, 10).
-Let a_10 = shift_uint8(u8_0, 0).
-Let a_11 = havoc(Mint_undef_6, Mint_6, a_10, 10).
-Let a_12 = shift_sint16(i16_0, 0).
-Let a_13 = havoc(Mint_undef_0, Mint_0, a_12, 10).
-Let a_14 = shift_uint16(u16_0, 0).
-Let a_15 = havoc(Mint_undef_3, Mint_3, a_14, 10).
-Let a_16 = shift_sint32(i32_0, 0).
-Let a_17 = havoc(Mint_undef_1, Mint_1, a_16, 10).
-Let a_18 = shift_uint32(u32_0, 0).
-Let a_19 = havoc(Mint_undef_4, Mint_4, a_18, 10).
-Let a_20 = shift_sint64(i64_0, 0).
-Let a_21 = havoc(Mint_undef_2, Mint_2, a_20, 10).
-Let a_22 = shift_uint64(u64_0, 0).
-Let a_23 = havoc(Mint_undef_5, Mint_5, a_22, 10).
+Let a_8 = shift_uint64(u64_0, 0).
+Let a_9 = havoc(Mint_undef_5, Mint_5, a_8, 10).
+Let a_10 = shift_sint64(i64_0, 0).
+Let a_11 = havoc(Mint_undef_2, Mint_2, a_10, 10).
+Let a_12 = shift_uint32(u32_0, 0).
+Let a_13 = havoc(Mint_undef_4, Mint_4, a_12, 10).
+Let a_14 = shift_sint32(i32_0, 0).
+Let a_15 = havoc(Mint_undef_1, Mint_1, a_14, 10).
+Let a_16 = shift_uint16(u16_0, 0).
+Let a_17 = havoc(Mint_undef_3, Mint_3, a_16, 10).
+Let a_18 = shift_sint16(i16_0, 0).
+Let a_19 = havoc(Mint_undef_0, Mint_0, a_18, 10).
+Let a_20 = shift_uint8(u8_0, 0).
+Let a_21 = havoc(Mint_undef_6, Mint_6, a_20, 10).
+Let a_22 = shift_sint8(i8_0, 0).
+Let a_23 = havoc(Mchar_undef_0, Mchar_0, a_22, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
       is_uint16_chunk(Mint_3) /\ is_uint32_chunk(Mint_4) /\
       is_uint64_chunk(Mint_5) /\ is_uint8_chunk(Mint_6) /\ is_sint32(i) /\
-      is_sint16_chunk(a_13) /\ is_sint32_chunk(a_17) /\
-      is_sint64_chunk(a_21) /\ is_sint8_chunk(a_9) /\
-      is_uint16_chunk(a_15) /\ is_uint32_chunk(a_19) /\
-      is_uint64_chunk(a_23) /\ is_uint8_chunk(a_11) /\
-      is_sint16_chunk(a_13[a_5 <- 3]) /\ is_sint32_chunk(a_17[a_3 <- 5]) /\
-      is_sint64_chunk(a_21[a_1 <- 7]) /\ is_sint8_chunk(a_9[a_7 <- 1]) /\
-      is_uint16_chunk(a_15[a_4 <- 4]) /\ is_uint32_chunk(a_19[a_2 <- 6]) /\
-      is_uint64_chunk(a_23[a <- 8]) /\ is_uint8_chunk(a_11[a_6 <- 2]).
+      is_sint16_chunk(a_19) /\ is_sint32_chunk(a_15) /\
+      is_sint64_chunk(a_11) /\ is_sint8_chunk(a_23) /\
+      is_uint16_chunk(a_17) /\ is_uint32_chunk(a_13) /\
+      is_uint64_chunk(a_9) /\ is_uint8_chunk(a_21) /\
+      is_sint16_chunk(a_19[a_5 <- 3]) /\ is_sint32_chunk(a_15[a_3 <- 5]) /\
+      is_sint64_chunk(a_11[a_1 <- 7]) /\ is_sint8_chunk(a_23[a_7 <- 1]) /\
+      is_uint16_chunk(a_17[a_4 <- 4]) /\ is_uint32_chunk(a_13[a_2 <- 6]) /\
+      is_uint64_chunk(a_9[a <- 8]) /\ is_uint8_chunk(a_21[a_6 <- 2]).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
@@ -1761,36 +1890,36 @@ Assume {
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_12, 10) /\ valid_rw(Malloc_0, a_16, 10) /\
-      valid_rw(Malloc_0, a_20, 10) /\ valid_rw(Malloc_0, a_8, 10) /\
-      valid_rw(Malloc_0, a_14, 10) /\ valid_rw(Malloc_0, a_18, 10) /\
-      valid_rw(Malloc_0, a_22, 10) /\ valid_rw(Malloc_0, a_10, 10).
+  Have: valid_rw(Malloc_0, a_18, 10) /\ valid_rw(Malloc_0, a_14, 10) /\
+      valid_rw(Malloc_0, a_10, 10) /\ valid_rw(Malloc_0, a_22, 10) /\
+      valid_rw(Malloc_0, a_16, 10) /\ valid_rw(Malloc_0, a_12, 10) /\
+      valid_rw(Malloc_0, a_8, 10) /\ valid_rw(Malloc_0, a_20, 10).
   (* Invariant *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_23[shift_uint64(u64_0, i_1)] = 8))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_21[shift_sint64(i64_0, i_1)] = 7))).
+      (a_23[shift_sint8(i8_0, i_1)] = 1))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_19[shift_uint32(u32_0, i_1)] = 6))).
+      (a_21[shift_uint8(u8_0, i_1)] = 2))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_17[shift_sint32(i32_0, i_1)] = 5))).
+      (a_19[shift_sint16(i16_0, i_1)] = 3))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_15[shift_uint16(u16_0, i_1)] = 4))).
+      (a_17[shift_uint16(u16_0, i_1)] = 4))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_13[shift_sint16(i16_0, i_1)] = 3))).
+      (a_15[shift_sint32(i32_0, i_1)] = 5))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_11[shift_uint8(u8_0, i_1)] = 2))).
+      (a_13[shift_uint32(u32_0, i_1)] = 6))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_9[shift_sint8(i8_0, i_1)] = 1))).
+      (a_11[shift_sint64(i64_0, i_1)] = 7))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_9[shift_uint64(u64_0, i_1)] = 8))).
   (* Then *)
   Have: i <= 9.
   (* Assertion 'rte,mem_access' *)
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/generalized_checks.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/generalized_checks.res.oracle
index 65a87c92522e55733522c0af3f53df5f0ad1680f..8320e268cf490ce50ebe5c8ba830a1d022f18d59 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/generalized_checks.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/generalized_checks.res.oracle
@@ -151,8 +151,7 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'false_but_preserved' (file tests/wp_acsl/generalized_checks.i, line 70):
-Assume { Type: is_sint32(i). (* Then *) Have: i <= 9. }
-Prove: false.
+Prove: true.
 
 ------------------------------------------------------------
 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/looplabels.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/looplabels.res.oracle
index 68d943f582170a3d187c3cb44229cd352dd0d7f1..3186bf3c7ec1ad310419341cf425e0a7d96c8aba 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/looplabels.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/looplabels.res.oracle
@@ -22,9 +22,11 @@ Assume {
   (* Pre-condition *)
   Have: separated(a_2, n, a_1, n).
   (* Invariant *)
-  Have: P_IsEqual(havoc(Mint_undef_0, Mint_0, a_1, n), a, b, i).
+  Have: P_IsEqual(Mint_0, a, b, 0).
   (* Invariant *)
   Have: (0 <= i) /\ (i <= n).
+  (* Invariant *)
+  Have: P_IsEqual(havoc(Mint_undef_0, Mint_0, a_1, n), a, b, i).
   (* Else *)
   Have: n <= i.
 }
@@ -48,9 +50,11 @@ Assume {
   (* Pre-condition *)
   Have: separated(a_2, n, a_1, n).
   (* Invariant *)
-  Have: P_IsEqual(havoc(Mint_undef_0, Mint_0, a_1, n), a, b, i).
+  Have: P_IsEqual(Mint_0, a, b, 0).
   (* Invariant *)
   Have: (0 <= i) /\ (i <= n).
+  (* Invariant *)
+  Have: P_IsEqual(havoc(Mint_undef_0, Mint_0, a_1, n), a, b, i).
   (* Then *)
   Have: i < n.
 }
@@ -81,11 +85,15 @@ Assume {
   (* Pre-condition *)
   Have: separated(a_3, n, a_1, n).
   (* Invariant *)
-  Have: P_IsEqual(a_2, a, b, i).
+  Have: P_IsEqual(Mint_0, a, b, 0).
   (* Invariant *)
   Have: (0 <= i) /\ (i <= n).
+  (* Invariant *)
+  Have: P_IsEqual(a_2, a, b, i).
   (* Then *)
   Have: i < n.
+  (* Invariant *)
+  Have: (-1) <= i.
 }
 Prove: P_IsEqual(a_2[shift_sint32(b, i) <- a_2[shift_sint32(a, i)]], a, b, x).
 
@@ -119,10 +127,12 @@ Prove: true.
 Goal Loop assigns (file tests/wp_acsl/looplabels.i, line 20) (2/2):
 Effect at line 23
 Let a_1 = shift_sint32(b, 0).
-Let a_2 = shift_sint32(a, 0).
-Let a_3 = shift_sint32(b, i).
+Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let x = i - 1.
+Let a_3 = shift_sint32(b, x).
+Let a_4 = shift_sint32(a, 0).
 Assume {
-  Type: is_sint32(i) /\ is_sint32(n).
+  Type: is_sint32(i) /\ is_sint32(n) /\ is_sint32(x).
   (* Heap *)
   Type: (region(a.base) <= 0) /\ (region(b.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
@@ -130,17 +140,21 @@ Assume {
   (* Pre-condition *)
   Have: 0 < n.
   (* Pre-condition *)
-  Have: valid_rw(Malloc_0, a_2, n).
+  Have: valid_rw(Malloc_0, a_4, n).
   (* Pre-condition *)
   Have: valid_rw(Malloc_0, a_1, n).
   (* Pre-condition *)
-  Have: separated(a_2, n, a_1, n).
+  Have: separated(a_4, n, a_1, n).
   (* Invariant *)
-  Have: P_IsEqual(havoc(Mint_undef_0, Mint_0, a_1, n), a, b, i).
+  Have: P_IsEqual(Mint_0, a, b, 0).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= n).
+  Have: (0 < i) /\ (i <= (1 + n)).
+  (* Invariant *)
+  Have: P_IsEqual(a_2, a, b, x).
   (* Then *)
-  Have: i < n.
+  Have: i <= n.
+  (* Invariant *)
+  Have: P_IsEqual(a_2[a_3 <- a_2[shift_sint32(a, x)]], a, b, i).
 }
 Prove: included(a_3, 1, a_1, n).
 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/postassigns.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/postassigns.res.oracle
index 8abc928d33f1abe77a4033024acc964ece36ba7c..22136a0a98d21d69bd4b70b9cdba4f82276ec267 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/postassigns.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/postassigns.res.oracle
@@ -147,7 +147,7 @@ Prove: true.
 Goal Preservation of Invariant (file tests/wp_acsl/postassigns.c, line 38):
 Assume {
   Type: is_sint32(N) /\ is_sint32(i) /\ is_sint32(1 + i).
-  (* Pre-condition *)
+  (* Invariant *)
   Have: 0 <= N.
   (* Invariant *)
   Have: (i <= N) /\ (0 <= i).
@@ -176,19 +176,20 @@ Prove: true.
 
 Goal Loop assigns (file tests/wp_acsl/postassigns.c, line 39) (3/3):
 Effect at line 42
-Let a = shift_sint32(p, i).
+Let x = i - 1.
+Let a = shift_sint32(p, x).
 Assume {
-  Type: is_sint32(N) /\ is_sint32(i).
+  Type: is_sint32(N) /\ is_sint32(i) /\ is_sint32(x).
   (* Heap *)
   Type: (region(p.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
   When: !invalid(Malloc_0, a, 1).
-  (* Pre-condition *)
+  (* Invariant *)
   Have: 0 <= N.
   (* Invariant *)
-  Have: (i <= N) /\ (0 <= i).
+  Have: (0 < i) /\ (i <= (1 + N)).
   (* Then *)
-  Have: i < N.
+  Have: i <= N.
 }
 Prove: included(a, 1, shift_sint32(p, 0), N).
 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/simpl_is_type.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/simpl_is_type.res.oracle
index 178e47f5501761f3b9f4e8f5cb9e23eaee7df9cb..ff14db8d7f6b7063fdfc15f4a7c1e9b2b0b61d97 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/simpl_is_type.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/simpl_is_type.res.oracle
@@ -209,18 +209,18 @@ Assume {
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 < size_0) /\ is_sint32(i_1).
   (* Pre-condition *)
+  Have: 0 < size_0.
+  (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < size_0) ->
       (Mint_0[shift_sint32(t, i_2)] < 0))).
-  (* Pre-condition *)
-  Have: 0 < size_0.
   (* Invariant *)
-  Have: forall i_2 : Z. ((i <= i_2) -> ((i_2 < size_0) ->
-      (a_1[shift_sint32(t, i_2)] < 0))).
+  Have: (0 <= i) /\ (i <= size_0).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       (0 < a_1[shift_sint32(t, i_2)]))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= size_0).
+  Have: forall i_2 : Z. ((i <= i_2) -> ((i_2 < size_0) ->
+      (a_1[shift_sint32(t, i_2)] < 0))).
   (* Else *)
   Have: size_0 <= i.
 }
@@ -235,18 +235,18 @@ Assume {
   (* Heap *)
   Type: region(t.base) <= 0.
   (* Pre-condition *)
+  Have: 0 < size_0.
+  (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < size_0) ->
       (Mint_0[shift_sint32(t, i_1)] < 0))).
-  (* Pre-condition *)
-  Have: 0 < size_0.
   (* Invariant *)
-  Have: forall i_1 : Z. ((i <= i_1) -> ((i_1 < size_0) ->
-      (a[shift_sint32(t, i_1)] < 0))).
+  Have: (0 <= i) /\ (i <= size_0).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       (0 < a[shift_sint32(t, i_1)]))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= size_0).
+  Have: forall i_1 : Z. ((i <= i_1) -> ((i_1 < size_0) ->
+      (a[shift_sint32(t, i_1)] < 0))).
   (* Then *)
   Have: i < size_0.
 }
@@ -271,20 +271,22 @@ Assume {
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 <= i) /\ is_sint32(i_1).
   (* Pre-condition *)
+  Have: 0 < size_0.
+  (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < size_0) ->
       (Mint_0[shift_sint32(t, i_2)] < 0))).
-  (* Pre-condition *)
-  Have: 0 < size_0.
   (* Invariant *)
-  Have: forall i_2 : Z. ((i <= i_2) -> ((i_2 < size_0) ->
-      (a[shift_sint32(t, i_2)] < 0))).
+  Have: (0 <= i) /\ (i <= size_0).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       (0 < a[shift_sint32(t, i_2)]))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= size_0).
+  Have: forall i_2 : Z. ((i <= i_2) -> ((i_2 < size_0) ->
+      (a[shift_sint32(t, i_2)] < 0))).
   (* Then *)
   Have: i < size_0.
+  (* Invariant *)
+  Have: (-1) <= i.
 }
 Prove: 0 < a[a_1 <- -a_2][shift_sint32(t, i_1)].
 
@@ -299,6 +301,7 @@ Goal Preservation of Invariant (file tests/wp_acsl/simpl_is_type.i, line 24):
 Let a = havoc(Mint_undef_0, Mint_0, shift_sint32(t, 0), size_0).
 Let a_1 = shift_sint32(t, i).
 Let a_2 = a[a_1].
+Let a_3 = a[a_1 <- -a_2].
 Assume {
   Type: is_sint32(i) /\ is_sint32(size_0) /\ is_sint32(1 + i) /\
       is_sint32(a_2).
@@ -307,22 +310,27 @@ Assume {
   (* Goal *)
   When: (i_1 < size_0) /\ (i < i_1) /\ is_sint32(i_1).
   (* Pre-condition *)
+  Have: 0 < size_0.
+  (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < size_0) ->
       (Mint_0[shift_sint32(t, i_2)] < 0))).
-  (* Pre-condition *)
-  Have: 0 < size_0.
   (* Invariant *)
-  Have: forall i_2 : Z. ((i <= i_2) -> ((i_2 < size_0) ->
-      (a[shift_sint32(t, i_2)] < 0))).
+  Have: (0 <= i) /\ (i <= size_0).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       (0 < a[shift_sint32(t, i_2)]))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= size_0).
+  Have: forall i_2 : Z. ((i <= i_2) -> ((i_2 < size_0) ->
+      (a[shift_sint32(t, i_2)] < 0))).
   (* Then *)
   Have: i < size_0.
+  (* Invariant *)
+  Have: (-1) <= i.
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (0 < a_3[shift_sint32(t, i_2)]))).
 }
-Prove: a[a_1 <- -a_2][shift_sint32(t, i_1)] < 0.
+Prove: a_3[shift_sint32(t, i_1)] < 0.
 
 ------------------------------------------------------------
 
@@ -352,28 +360,37 @@ Goal Loop assigns (file tests/wp_acsl/simpl_is_type.i, line 25) (2/2):
 Effect at line 28
 Let a = shift_sint32(t, 0).
 Let a_1 = havoc(Mint_undef_0, Mint_0, a, size_0).
-Let a_2 = shift_sint32(t, i).
+Let x = i - 1.
+Let a_2 = shift_sint32(t, x).
+Let a_3 = a_1[a_2].
+Let a_4 = a_1[a_2 <- -a_3].
 Assume {
-  Type: is_sint32(i) /\ is_sint32(size_0).
+  Type: is_sint32(i) /\ is_sint32(size_0) /\ is_sint32(x) /\ is_sint32(a_3).
   (* Heap *)
   Type: (region(t.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
   When: !invalid(Malloc_0, a_2, 1).
   (* Pre-condition *)
+  Have: 0 < size_0.
+  (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < size_0) ->
       (Mint_0[shift_sint32(t, i_1)] < 0))).
-  (* Pre-condition *)
-  Have: 0 < size_0.
   (* Invariant *)
-  Have: forall i_1 : Z. ((i <= i_1) -> ((i_1 < size_0) ->
-      (a_1[shift_sint32(t, i_1)] < 0))).
+  Have: (0 < i) /\ (i <= (1 + size_0)).
   (* Invariant *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (0 < a_1[shift_sint32(t, i_1)]))).
+  Have: forall i_1 : Z. ((0 <= i_1) -> (((2 + i_1) <= i) ->
+      (is_sint32(i_1) -> (0 < a_1[shift_sint32(t, i_1)])))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= size_0).
+  Have: forall i_1 : Z. ((i_1 < size_0) -> ((i <= (1 + i_1)) ->
+      (is_sint32(i_1) -> (a_1[shift_sint32(t, i_1)] < 0)))).
   (* Then *)
-  Have: i < size_0.
+  Have: i <= size_0.
+  (* Invariant *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (0 < a_4[shift_sint32(t, i_1)]))).
+  (* Invariant *)
+  Have: forall i_1 : Z. ((i <= i_1) -> ((i_1 < size_0) ->
+      (a_4[shift_sint32(t, i_1)] < 0))).
 }
 Prove: included(a_2, 1, a, size_0).
 
@@ -391,10 +408,10 @@ Assume {
   (* Pre-condition *)
   Have: 0 < size_0.
   (* Invariant *)
+  Have: (0 <= i) /\ (i <= size_0).
+  (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       (Mint_0[shift_sint32(t, i_1)] != x))).
-  (* Invariant *)
-  Have: (0 <= i) /\ (i <= size_0).
   Have: i < size_0.
 }
 Prove: exists i_1 : Z. (Mint_0[shift_sint32(t, i_1)] = x) /\ (0 <= i_1) /\
@@ -414,10 +431,10 @@ Assume {
   (* Pre-condition *)
   Have: 0 < size_0.
   (* Invariant *)
+  Have: (0 <= i) /\ (i <= size_0).
+  (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       (Mint_0[shift_sint32(t, i_1)] != x))).
-  (* Invariant *)
-  Have: (0 <= i) /\ (i <= size_0).
   (* Then *)
   Have: i < size_0.
   (* Else *)
@@ -444,14 +461,16 @@ Assume {
   (* Pre-condition *)
   Have: 0 < size_0.
   (* Invariant *)
+  Have: (0 <= i_1) /\ (i_1 <= size_0).
+  (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
       (Mint_0[shift_sint32(t, i_2)] != x))).
-  (* Invariant *)
-  Have: (0 <= i_1) /\ (i_1 <= size_0).
   (* Then *)
   Have: i_1 < size_0.
   (* Else *)
   Have: x_1 != x.
+  (* Invariant *)
+  Have: (-1) <= i_1.
 }
 Prove: Mint_0[shift_sint32(t, i)] != x.
 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/terminates_variant_option.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/terminates_variant_option.0.res.oracle
index 1d76571f54f0b012c92a2247df2716515527d399..1418f3fcdd8197ba7a5fa96a9bab9b485c9680b1 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/terminates_variant_option.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/terminates_variant_option.0.res.oracle
@@ -55,6 +55,8 @@ Assume {
   Have: ((0 <= c1_0) -> ((cpt_0 <= c1_0) /\ (0 <= cpt_0))).
   (* Else *)
   Have: 2 <= cpt_0.
+  (* Invariant *)
+  Have: ((0 <= c1_0) -> (cpt_0 <= (1 + c1_0))).
 }
 Prove: 0 <= cpt_0.
 
@@ -130,13 +132,15 @@ Prove: true.
 Goal Positivity of Loop variant at loop (file tests/wp_acsl/terminates_variant_option.i, line 19):
 Let x = Mint_0[p].
 Assume {
-  Type: is_sint32(v) /\ is_sint32(x).
+  Type: is_sint32(v) /\ is_sint32(x) /\ is_sint32(v - 1).
   (* Heap *)
   Type: region(p.base) <= 0.
   (* Invariant *)
   Have: ((0 <= x) -> ((0 <= v) /\ (v <= x))).
   (* Then *)
   Have: v != 0.
+  (* Invariant *)
+  Have: ((0 <= x) -> ((0 < v) /\ (v <= (1 + x)))).
 }
 Prove: 0 <= v.
 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/terminates_variant_option.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/terminates_variant_option.1.res.oracle
index 09103afc39da2717b28b4744b2012e293889b894..5625b7ca4446516a76a0f92b1bf660d2b2e02d21 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/terminates_variant_option.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/terminates_variant_option.1.res.oracle
@@ -54,6 +54,8 @@ Assume {
   Have: ((0 <= c1_0) -> ((cpt_0 <= c1_0) /\ (0 <= cpt_0))).
   (* Else *)
   Have: 2 <= cpt_0.
+  (* Invariant *)
+  Have: ((0 <= c1_0) -> (cpt_0 <= (1 + c1_0))).
 }
 Prove: 0 <= cpt_0.
 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memtyped.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memtyped.res.oracle
index db28901d4032a8c3cce0c255267c3c9c147c1a84..3a3c7b36d62b7a0852a23b62c1736adbbd3feab9 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memtyped.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memtyped.res.oracle
@@ -33,7 +33,7 @@
 [wp] [Alt-Ergo] Goal typed_comp_check_FAILS : Unsuccess
 [wp] [Qed] Goal typed_comp_loop_assigns_part1 : Valid
 [wp] [Qed] Goal typed_comp_loop_assigns_part2 : Valid
-[wp] [Alt-Ergo] Goal typed_comp_loop_assigns_part3 : Valid
+[wp] [Qed] Goal typed_comp_loop_assigns_part3 : Valid
 [wp] [Alt-Ergo] Goal typed_assigned_glob_check_FAILS : Unsuccess
 [wp] [Alt-Ergo] Goal typed_assigned_glob_loop_invariant_CHECK_preserved : Valid
 [wp] [Qed] Goal typed_assigned_glob_loop_invariant_CHECK_established : Valid
@@ -44,10 +44,10 @@
 [wp] [Qed] Goal typed_assigned_glob_loop_assigns_part3 : Valid
 [wp] [Qed] Goal typed_assigned_glob_loop_assigns_2_part1 : Valid
 [wp] [Qed] Goal typed_assigned_glob_loop_assigns_2_part2 : Valid
-[wp] [Alt-Ergo] Goal typed_assigned_glob_loop_assigns_2_part3 : Valid
+[wp] [Qed] Goal typed_assigned_glob_loop_assigns_2_part3 : Valid
 [wp] Proved goals:   33 / 42
-  Qed:            27 
-  Alt-Ergo:        6  (unsuccess: 9)
+  Qed:            29 
+  Alt-Ergo:        4  (unsuccess: 9)
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   initialize                4        2        6       100%
@@ -56,6 +56,6 @@
   array                     3        -        4      75.0%
   index                     3        -        4      75.0%
   descr                     4        1        6      83.3%
-  comp                      2        1        4      75.0%
-  assigned_glob             6        2       11      72.7%
+  comp                      3        -        4      75.0%
+  assigned_glob             7        1       11      72.7%
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/generalized_checks.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/generalized_checks.res.oracle
index 99a33fee77212dd66f117cf324e5a8a81eb05983..22b1cace818e97885d132b6fa678cee972fd99fa 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/generalized_checks.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/generalized_checks.res.oracle
@@ -20,13 +20,13 @@
 [wp] [Qed] Goal typed_caller_call_job_requires_A : Valid
 [wp] [Qed] Goal typed_caller_call_job_check_requires_CA1 : Valid
 [wp] [Alt-Ergo] Goal typed_caller_call_job_check_requires_CA2_ko : Unsuccess
-[wp] [Alt-Ergo] Goal typed_loop_check_loop_invariant_false_but_preserved_preserved : Unsuccess
+[wp] [Qed] Goal typed_loop_check_loop_invariant_false_but_preserved_preserved : Valid
 [wp] [Alt-Ergo] Goal typed_loop_check_loop_invariant_false_but_preserved_established : Unsuccess
 [wp] [Alt-Ergo] Goal typed_loop_check_implied_by_false_invariant : Unsuccess
 [wp] [Qed] Goal typed_loop_loop_assigns : Valid
-[wp] Proved goals:   12 / 21
-  Qed:            10 
-  Alt-Ergo:        2  (unsuccess: 9)
+[wp] Proved goals:   13 / 21
+  Qed:            11 
+  Alt-Ergo:        2  (unsuccess: 8)
 ------------------------------------------------------------
  Axiomatics                WP     Alt-Ergo  Total   Success
   Axiomatic Th              -        -        2       0.0%
@@ -34,5 +34,5 @@
  Functions                 WP     Alt-Ergo  Total   Success
   job                       3        2        6      83.3%
   caller                    6        -        9      66.7%
-  loop                      1        -        4      25.0%
+  loop                      2        -        4      50.0%
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_bts/bts_2110.i b/src/plugins/wp/tests/wp_bts/bts_2110.i
index c3e92f41a345f65ee05065f318116fe741cf69c1..2b30f0a37265c6096a082ec72db3c61e46fa31a7 100644
--- a/src/plugins/wp/tests/wp_bts/bts_2110.i
+++ b/src/plugins/wp/tests/wp_bts/bts_2110.i
@@ -1,5 +1,5 @@
 /* run.config
-   CMD: @frama-c@ -wp -wp-msg-key shell,cluster,print-generated -wp-prover why3 -wp-gen -wp-share ./share -wp-warn-key "pedantic-assigns=inactive"
+   CMD: @frama-c@ -wp -wp-msg-key shell,cluster,print-generated -wp-prover why3 -wp-gen -wp-share @PTEST_SHARE_DIR@ -wp-warn-key "pedantic-assigns=inactive"
    OPT:
 */
 
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_1462.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_1462.res.oracle
index aa5c4e320017bf051c70668612f5c91e0cea0fe1..48496dc5697b4e27f98576cc40680ad056f49b6c 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_1462.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_1462.res.oracle
@@ -45,10 +45,10 @@ Assume {
   (* Assertion 'for_value' *)
   Have: (c = 1) \/ (c <= 0) \/ (2 <= c).
   Have: c != 2.
-  (* Invariant 'C' *)
-  Have: ((c = 0) -> ((i = 0) -> (x = 0))).
   (* Invariant 'A_KO' *)
   Have: ((i != 0) -> (y_1 = 0)).
+  (* Invariant 'C' *)
+  Have: ((c = 0) -> ((i = 0) -> (x = 0))).
   (* Then *)
   Have: i <= 9.
   If c = 1
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue_751.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue_751.res.oracle
index 14535c7cf0c072d0d5733260c788e4cb80ebb297..79f9827f49f3dc948c36db84ef95aabee8201804 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue_751.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue_751.res.oracle
@@ -36,21 +36,22 @@ Prove: true.
 Goal Loop assigns (file tests/wp_bts/issue_751.i, line 8) (2/2):
 Effect at line 11
 Let x = land(3840, R).
-Let x_1 = x / 256.
+Let x_1 = lsr(x, 8).
+Let x_2 = j - 1.
 Assume {
-  Type: is_sint32(R) /\ is_sint32(j) /\ is_sint32(lsr(x, 8)).
+  Type: is_sint32(R) /\ is_sint32(j) /\ is_sint32(x_2) /\ is_sint32(x_1).
   (* Heap *)
   Type: (region(Data_0.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
-  When: !invalid(Malloc_0, shift_sint32(Data_0, j), 1).
+  When: !invalid(Malloc_0, shift_sint32(Data_0, x_2), 1).
   (* Pre-condition *)
   Have: (0 < x) /\ (x <= 2303).
   (* Invariant 'RANGE' *)
-  Have: (0 <= j) /\ (j <= x_1).
+  Have: (0 < j) /\ (j <= (1 + x_1)).
   (* Then *)
-  Have: j < x_1.
+  Have: j <= (x / 256).
 }
-Prove: j <= 7.
+Prove: j <= 8.
 
 ------------------------------------------------------------
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue_801.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue_801.res.oracle
index 0021dc1ad13f35291453f98e675313a297afc67c..4c29b8c3fe1446b6cd46f6cd39cf694bac3c61a6 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue_801.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue_801.res.oracle
@@ -33,7 +33,6 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Positivity of Loop variant at loop (file tests/wp_bts/issue_801.i, line 14):
-Assume { Type: is_sint32(s). (* Then *) Have: s <= 9. }
-Prove: s <= 10.
+Prove: true.
 
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_801.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_801.res.oracle
index 455278246bd518ab7843f951f86963da8d6c9ae1..7e3f976defe0c7ff66d631e42588c4fd7d6c1be7 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_801.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_801.res.oracle
@@ -8,11 +8,11 @@
 [wp] [Qed] Goal typed_LoopCurrent_loop_invariant_A_established : Valid
 [wp] [Qed] Goal typed_LoopCurrent_loop_assigns : Valid
 [wp] [Qed] Goal typed_LoopCurrent_loop_variant_decrease : Valid
-[wp] [Alt-Ergo] Goal typed_LoopCurrent_loop_variant_positive : Valid
+[wp] [Qed] Goal typed_LoopCurrent_loop_variant_positive : Valid
 [wp] Proved goals:    5 / 6
-  Qed:             4 
-  Alt-Ergo:        1  (unsuccess: 1)
+  Qed:             5 
+  Alt-Ergo:        0  (unsuccess: 1)
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
-  LoopCurrent               4        1        6      83.3%
+  LoopCurrent               5        -        6      83.3%
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_eva/test_config b/src/plugins/wp/tests/wp_eva/test_config
index 8b6102546cc5b9169aa4d10d195b2ef2f5bab0b3..b17ba9c087756386fee7b149e7f598e0ebbad315 100644
--- a/src/plugins/wp/tests/wp_eva/test_config
+++ b/src/plugins/wp/tests/wp_eva/test_config
@@ -1 +1 @@
-CMD: @frama-c@ -no-autoload-plugins -load-module eva,scope,reduc,wp -eva -eva-no-print -eva-verbose 0 @PTEST_FILE@ -then -reduc -reduc-gen-annot all -then -no-reduc -wp -wp-print -wp-prover none -wp-share ./share -wp-msg-key shell
+CMD: @frama-c@ -no-autoload-plugins -load-module eva,scope,reduc,wp -eva -eva-no-print -eva-verbose 0 @PTEST_FILE@ -then -reduc -reduc-gen-annot all -then -no-reduc -wp -wp-print -wp-prover none -wp-share @PTEST_SHARE_DIR@ -wp-msg-key shell
diff --git a/src/plugins/wp/tests/wp_eva/test_config_qualif b/src/plugins/wp/tests/wp_eva/test_config_qualif
index 153e5ddde393c7008e0ff327852ba9b948a25e54..8f8c6e5c791fd649d5d9a45b234bbf850e2b3ce6 100644
--- a/src/plugins/wp/tests/wp_eva/test_config_qualif
+++ b/src/plugins/wp/tests/wp_eva/test_config_qualif
@@ -1,2 +1,2 @@
-CMD: @frama-c@ -no-autoload-plugins -load-module eva,scope,reduc,wp -eva -eva-no-print -eva-verbose 0 @PTEST_FILE@ -then -reduc -reduc-gen-annot all -then -no-reduc -then -wp -wp-par 1 -wp-share ./share -wp-msg-key shell -wp-report tests/qualif.report -wp-session @PTEST_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.@PTEST_NUMBER@.session -wp-cache-env -wp-cache replay @PTEST_FILE@ -wp-coq-timeout 120
+CMD: @frama-c@ -no-autoload-plugins -load-module eva,scope,reduc,wp -eva -eva-no-print -eva-verbose 0 @PTEST_FILE@ -then -reduc -reduc-gen-annot all -then -no-reduc -then -wp -wp-par 1 -wp-share @PTEST_SHARE_DIR@ -wp-msg-key shell -wp-report tests/qualif.report -wp-session @PTEST_SUITE_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.@PTEST_NUMBER@.session -wp-cache-env -wp-cache replay @PTEST_FILE@ -wp-coq-timeout 120
 OPT:
diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo2_solved.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo2_solved.res.oracle
index 1780ec5c89a9b45027afa30b5a132043047e4271..879b80915f96682876824638ae66f50de1d06e7e 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo2_solved.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo2_solved.res.oracle
@@ -15,10 +15,10 @@
 [wp] [Qed] Goal typed_max_subarray_loop_invariant_4_established : Valid
 [wp] [Alt-Ergo] Goal typed_max_subarray_loop_invariant_5_preserved : Valid
 [wp] [Alt-Ergo] Goal typed_max_subarray_loop_invariant_5_established : Valid
-[wp] [Alt-Ergo] Goal typed_max_subarray_loop_invariant_6_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_max_subarray_loop_invariant_6_established : Valid
+[wp] [Qed] Goal typed_max_subarray_loop_invariant_6_preserved : Valid
+[wp] [Qed] Goal typed_max_subarray_loop_invariant_6_established : Valid
 [wp] [Alt-Ergo] Goal typed_max_subarray_loop_invariant_7_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_max_subarray_loop_invariant_7_established : Valid
+[wp] [Qed] Goal typed_max_subarray_loop_invariant_7_established : Valid
 [wp] [Alt-Ergo] Goal typed_max_subarray_loop_invariant_8_preserved : Valid
 [wp] [Alt-Ergo] Goal typed_max_subarray_loop_invariant_8_established : Valid
 [wp] [Qed] Goal typed_max_subarray_loop_assigns : Valid
@@ -26,11 +26,11 @@
 [wp] [Qed] Goal typed_max_subarray_loop_variant_decrease : Valid
 [wp] [Qed] Goal typed_max_subarray_loop_variant_positive : Valid
 [wp] Proved goals:   22 / 22
-  Qed:             9 
-  Alt-Ergo:       13
+  Qed:            12 
+  Alt-Ergo:       10
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
-  max_subarray              9       13       22       100%
+  max_subarray             12       10       22       100%
 ------------------------------------------------------------
 [wp] Running WP plugin...
 [rte] annotating function max_subarray
@@ -41,5 +41,5 @@
   Alt-Ergo:        1
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
-  max_subarray              9       14       23       100%
+  max_subarray             12       11       23       100%
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.res.oracle
index 174cfa7521504fd213dc75ca4404ea89dddb4faa..b2a42b7d1cd35ff736ed1a09c2d58a256a6c89ee 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.res.oracle
@@ -18,7 +18,7 @@
 [wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_5_established : Valid
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_6_preserved : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_6_established : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_7_preserved : Valid
+[wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_7_preserved : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_7_established : Valid
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_8_preserved : Valid
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_8_established : Valid
@@ -38,11 +38,11 @@
 [wp] [Qed] Goal typed_ref_equal_elements_loop_variant_2_decrease : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_loop_variant_2_positive : Valid
 [wp] Proved goals:   34 / 34
-  Qed:            18 
-  Alt-Ergo:       16
+  Qed:            19 
+  Alt-Ergo:       15
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
-  equal_elements           18       16       34       100%
+  equal_elements           19       15       34       100%
 ------------------------------------------------------------
 [wp] tests/wp_gallery/frama_c_exo3_solved.old.c:73: Warning: 
   Memory model hypotheses for function 'equal_elements':
@@ -77,5 +77,5 @@
   Alt-Ergo:        5
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
-  equal_elements           29       21       50       100%
+  equal_elements           30       20       50       100%
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.v2.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.v2.res.oracle
index cfbc31146758fcdad382bd59ca15be2c53d18327..4a5d3b149207981d5161ab0d99a0760e0e79a0bb 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.v2.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.v2.res.oracle
@@ -23,7 +23,7 @@
 [wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_v1_sound1_established : Valid
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_v1_sound2_preserved : Valid
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_v1_sound2_established : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_v1_v2_diff_preserved : Valid
+[wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_v1_v2_diff_preserved : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_v1_v2_diff_established : Valid
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_v2_sound1_preserved : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_v2_sound1_established : Valid
@@ -39,11 +39,11 @@
 [wp] [Qed] Goal typed_ref_equal_elements_loop_variant_2_decrease : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_loop_variant_2_positive : Valid
 [wp] Proved goals:   35 / 35
-  Qed:            17 
-  Alt-Ergo:       18
+  Qed:            18 
+  Alt-Ergo:       17
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
-  equal_elements           17       18       35       100%
+  equal_elements           18       17       35       100%
 ------------------------------------------------------------
 [wp] tests/wp_gallery/frama_c_exo3_solved.old.v2.c:56: Warning: 
   Memory model hypotheses for function 'equal_elements':
@@ -78,5 +78,5 @@
   Alt-Ergo:        5
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
-  equal_elements           28       23       51       100%
+  equal_elements           29       22       51       100%
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/convert.i b/src/plugins/wp/tests/wp_plugin/convert.i
index c09396fdda418ae62ac373fc6ebe4703b1560750..2dce3a4622568c9e1a54a0b8e00ecf5d4b4301a6 100644
--- a/src/plugins/wp/tests/wp_plugin/convert.i
+++ b/src/plugins/wp/tests/wp_plugin/convert.i
@@ -4,7 +4,7 @@
 
 /* run.config_qualif
    OPT:
-   OPT: -wp-prover native:alt-ergo -wp-report=%{dep:tests/native.report}
+   OPT: -wp-prover native:alt-ergo -wp-report=%{dep:@PTEST_SUITE_DIR@/../native.report}
 */
 
 // --------------------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/math.i b/src/plugins/wp/tests/wp_plugin/math.i
index 4a3905a7a75094fb219220189bb6b1fdfd180621..d2a3d2ce303de8ef3b5c4f48ce0bcfa4b426570a 100644
--- a/src/plugins/wp/tests/wp_plugin/math.i
+++ b/src/plugins/wp/tests/wp_plugin/math.i
@@ -4,9 +4,9 @@
 
 /* run.config_qualif
    OPT: -wp-prover alt-ergo                                              -wp-prop=-ko  -wp-timeout 100 -wp-steps 1500
-   OPT: -wp-prover native:alt-ergo -wp-report=%{dep:tests/native.report} -wp-prop=-ko  -wp-timeout 100 -wp-steps 1500
+   OPT: -wp-prover native:alt-ergo -wp-report=%{dep:@PTEST_SUITE_DIR@/../native.report} -wp-prop=-ko  -wp-timeout 100 -wp-steps 1500
    OPT: -wp-prover alt-ergo                                              -wp-prop=ko   -wp-timeout 100 -wp-steps 10
-   OPT: -wp-prover native:alt-ergo -wp-report=%{dep:tests/native.report} -wp-prop=ko   -wp-timeout 100 -wp-steps 10
+   OPT: -wp-prover native:alt-ergo -wp-report=%{dep:@PTEST_SUITE_DIR@/../native.report} -wp-prop=ko   -wp-timeout 100 -wp-steps 10
 */
 
 // --------------------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/model.i b/src/plugins/wp/tests/wp_plugin/model.i
index fd0dd051a717b1544e9f13d4c0be5d06f2c410fa..07e59f63a7ddb17bc624dde14525f1dd14bcdee8 100644
--- a/src/plugins/wp/tests/wp_plugin/model.i
+++ b/src/plugins/wp/tests/wp_plugin/model.i
@@ -1,5 +1,5 @@
 /* run.config
-   CMD: @frama-c@ -wp-share ./share -wp-msg-key cluster,shell,print-generated -wp-prover why3 -wp-warn-key "pedantic-assigns=inactive"
+   CMD: @frama-c@ -wp-share @PTEST_SHARE_DIR@ -wp-msg-key cluster,shell,print-generated -wp-prover why3 -wp-warn-key "pedantic-assigns=inactive"
    OPT: -wp-model Typed -wp -wp-gen -wp-print -then -wp-model Typed+ref -wp -wp-gen -wp-print
 */
 
diff --git a/src/plugins/wp/tests/wp_plugin/nosession.i b/src/plugins/wp/tests/wp_plugin/nosession.i
index d1873a1222997221ed75c281b72bb3663ce61eeb..96ab1cfb2102e424756980add80ab024daeb06ff 100644
--- a/src/plugins/wp/tests/wp_plugin/nosession.i
+++ b/src/plugins/wp/tests/wp_plugin/nosession.i
@@ -2,7 +2,7 @@
    DONTRUN:
 */
 /* run.config_qualif
-   CMD: @frama-c@ -wp-share ./share -wp-msg-key shell -wp-warn-key pedantic-assigns=inactive
+   CMD: @frama-c@ -wp-share @PTEST_SHARE_DIR@ -wp-msg-key shell -wp-warn-key pedantic-assigns=inactive
 PLUGIN: wp,rtegen
    OPT: -wp -wp-prover alt-ergo -wp-session shall_not_exists_dir -wp-cache offline -wp-no-cache-env
    COMMENT: The session directory shall not be created
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/combined.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/combined.res.oracle
index 232d0259c30a3aec71ca0610cdc0af2b68750042..5fcfd8e1850e59b359e32f7ae2784bf0c86cb183 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/combined.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/combined.res.oracle
@@ -20,11 +20,11 @@ Assume {
   (* Assertion *)
   Have: (50 <= A) /\ (A <= 100).
   (* Invariant *)
+  Have: (0 <= i) /\ (i <= 50).
+  (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_P(havoc(Mint_undef_0, Mint_0, shift_sint32(t, 0), 50)
             [shift_sint32(t, i_1)]))).
-  (* Invariant *)
-  Have: (0 <= i) /\ (i <= 50).
   (* Then *)
   Have: i <= 49.
   (* Call 'f' *)
@@ -50,14 +50,16 @@ Assume {
   (* Assertion *)
   Have: (50 <= A) /\ (A <= 100).
   (* Invariant *)
+  Have: (0 <= i) /\ (i <= 50).
+  (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       P_P(a[shift_sint32(t, i_2)]))).
-  (* Invariant *)
-  Have: (0 <= i) /\ (i <= 50).
   (* Then *)
   Have: i <= 49.
   (* Call 'f' *)
   Have: P_P(v).
+  (* Invariant *)
+  Have: (-1) <= i.
 }
 Prove: P_P(a[shift_sint32(t, i) <- v][shift_sint32(t, i_1)]).
 
@@ -77,11 +79,11 @@ Assume {
   (* Assertion *)
   Have: (50 <= A) /\ (A <= 100).
   (* Invariant *)
+  Have: (0 <= i) /\ (i <= 50).
+  (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_P(havoc(Mint_undef_0, Mint_0, shift_sint32(t, 0), 50)
             [shift_sint32(t, i_1)]))).
-  (* Invariant *)
-  Have: (0 <= i) /\ (i <= 50).
   (* Else *)
   Have: 50 <= i.
   (* Invariant *)
@@ -109,10 +111,10 @@ Assume {
   (* Assertion *)
   Have: (50 <= A) /\ (A <= 100).
   (* Invariant *)
+  Have: (0 <= i_1) /\ (i_1 <= 50).
+  (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
       P_P(a[shift_sint32(t, i_2)]))).
-  (* Invariant *)
-  Have: (0 <= i_1) /\ (i_1 <= 50).
   (* Else *)
   Have: 50 <= i_1.
   (* Invariant *)
@@ -155,9 +157,10 @@ Prove: true.
 
 Goal Loop assigns (file tests/wp_plugin/combined.c, line 36) (3/3):
 Call Result at line 38
-Let a = shift_sint32(t, j).
+Let x = j - 1.
+Let a = shift_sint32(t, x).
 Assume {
-  Type: is_sint32(A) /\ is_sint32(i) /\ is_sint32(j).
+  Type: is_sint32(A) /\ is_sint32(i) /\ is_sint32(j) /\ is_sint32(x).
   (* Heap *)
   Type: (region(t.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
@@ -165,17 +168,17 @@ Assume {
   (* Assertion *)
   Have: (50 <= A) /\ (A <= 100).
   (* Invariant *)
+  Have: (0 <= i) /\ (i <= 50).
+  (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_P(havoc(Mint_undef_0, Mint_0, shift_sint32(t, 0), 50)
             [shift_sint32(t, i_1)]))).
-  (* Invariant *)
-  Have: (0 <= i) /\ (i <= 50).
   (* Else *)
   Have: 50 <= i.
   (* Invariant *)
-  Have: (A <= j) /\ (j <= 100).
+  Have: (A < j) /\ (j <= 101).
   (* Then *)
-  Have: j <= 99.
+  Have: j <= 100.
 }
 Prove: included(a, 1, shift_sint32(t, A), 100 - A).
 
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/copy.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/copy.res.oracle
index 0198e43bea60c3a8a1a53b753ea78da52ce375da..f72087e75317557233ac0e847631bf9a6c751344 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/copy.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/copy.res.oracle
@@ -17,14 +17,14 @@ Assume {
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 < n).
   (* Pre-condition *)
-  Have: 0 <= n.
-  (* Pre-condition *)
   Have: separated(a_1, n, shift_sint32(b, 0), n).
+  (* Invariant 'Range' *)
+  Have: 0 <= n.
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'Copy' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       (a_2[shift_sint32(b, i_2)] = a_2[shift_sint32(a, i_2)]))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= n).
   (* Else *)
   Have: n <= i.
 }
@@ -43,14 +43,14 @@ Assume {
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 <= i).
   (* Pre-condition *)
-  Have: 0 <= n.
-  (* Pre-condition *)
   Have: separated(a_1, n, shift_sint32(b, 0), n).
+  (* Invariant 'Range' *)
+  Have: 0 <= n.
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'Copy' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       (a_2[shift_sint32(b, i_2)] = a_2[shift_sint32(a, i_2)]))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= n).
   (* Then *)
   Have: i < n.
   (* Assertion 'A' *)
@@ -59,6 +59,8 @@ Assume {
   (* Assertion 'B' *)
   Have: forall i_2 : Z. let a_4 = shift_sint32(b, i_2) in ((0 <= i_2) ->
       ((i_2 < i) -> (a_3[a_4] = a_2[a_4]))).
+  (* Invariant 'Range' *)
+  Have: (-1) <= i.
 }
 Prove: a_3[shift_sint32(b, i_1)] = a_3[shift_sint32(a, i_1)].
 
@@ -78,14 +80,14 @@ Assume {
   (* Heap *)
   Type: (region(a.base) <= 0) /\ (region(b.base) <= 0).
   (* Pre-condition *)
-  Have: 0 <= n.
-  (* Pre-condition *)
   Have: separated(a_1, n, shift_sint32(b, 0), n).
+  (* Invariant 'Range' *)
+  Have: 0 <= n.
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'Copy' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       (a_2[shift_sint32(b, i_1)] = a_2[shift_sint32(a, i_1)]))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= n).
   (* Then *)
   Have: i < n.
   (* Assertion 'A' *)
@@ -115,14 +117,14 @@ Assume {
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 < i).
   (* Pre-condition *)
-  Have: 0 <= n.
-  (* Pre-condition *)
   Have: separated(a_1, n, shift_sint32(b, 0), n).
+  (* Invariant 'Range' *)
+  Have: 0 <= n.
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'Copy' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       (a_2[shift_sint32(b, i_2)] = a_2[shift_sint32(a, i_2)]))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= n).
   (* Then *)
   Have: i < n.
 }
@@ -142,14 +144,14 @@ Assume {
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 < i).
   (* Pre-condition *)
-  Have: 0 <= n.
-  (* Pre-condition *)
   Have: separated(a_1, n, shift_sint32(b, 0), n).
+  (* Invariant 'Range' *)
+  Have: 0 <= n.
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'Copy' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       (a_2[shift_sint32(b, i_2)] = a_2[shift_sint32(a, i_2)]))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= n).
   (* Then *)
   Have: i < n.
   (* Assertion 'A' *)
@@ -175,31 +177,35 @@ Goal Loop assigns (file tests/wp_plugin/copy.i, line 12) (3/3):
 Effect at line 16
 Let a_1 = shift_sint32(a, 0).
 Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
-Let a_3 = shift_sint32(a, i).
-Let a_4 = a_2[a_3 <- a_2[shift_sint32(b, i)]].
+Let x = i - 1.
+Let a_3 = shift_sint32(a, x).
+Let a_4 = a_2[a_3 <- a_2[shift_sint32(b, x)]].
 Assume {
-  Type: is_sint32(i) /\ is_sint32(n).
+  Type: is_sint32(i) /\ is_sint32(n) /\ is_sint32(x).
   (* Heap *)
   Type: (region(a.base) <= 0) /\ (region(b.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
   When: !invalid(Malloc_0, a_3, 1).
   (* Pre-condition *)
-  Have: 0 <= n.
-  (* Pre-condition *)
   Have: separated(a_1, n, shift_sint32(b, 0), n).
+  (* Invariant 'Range' *)
+  Have: 0 <= n.
+  (* Invariant 'Range' *)
+  Have: (0 < i) /\ (i <= (1 + n)).
   (* Invariant 'Copy' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+  Have: forall i_1 : Z. ((0 <= i_1) -> (((2 + i_1) <= i) ->
       (a_2[shift_sint32(b, i_1)] = a_2[shift_sint32(a, i_1)]))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= n).
   (* Then *)
-  Have: i < n.
+  Have: i <= n.
   (* Assertion 'A' *)
   Have: forall i_1 : Z. let a_5 = shift_sint32(a, i_1) in ((0 <= i_1) ->
-      ((i_1 < i) -> (a_4[a_5] = a_2[a_5]))).
+      (((2 + i_1) <= i) -> (a_4[a_5] = a_2[a_5]))).
   (* Assertion 'B' *)
   Have: forall i_1 : Z. let a_5 = shift_sint32(b, i_1) in ((0 <= i_1) ->
-      ((i_1 < i) -> (a_4[a_5] = a_2[a_5]))).
+      (((2 + i_1) <= i) -> (a_4[a_5] = a_2[a_5]))).
+  (* Invariant 'Copy' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_4[shift_sint32(b, i_1)] = a_4[shift_sint32(a, i_1)]))).
 }
 Prove: included(a_3, 1, a_1, n).
 
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/doomed_axioms.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/doomed_axioms.res.oracle
index da669bd36ebf0b30082de682bb0d52b17a6faec3..fed4301277c6759030f49714996ddff47765ad18 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/doomed_axioms.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/doomed_axioms.res.oracle
@@ -9,12 +9,18 @@
 Goal Wp_smoke_dead_loop in 'foo' at loop (file tests/wp_plugin/doomed_axioms.i, line 29):
 Assume {
   Type: is_sint32(n).
-  (* Invariant 'C' *)
-  Have: P_R(n).
+  (* Invariant 'A' *)
+  Have: P_P(0).
   (* Invariant 'B' *)
-  Have: P_Q(n).
+  Have: P_Q(0).
+  (* Invariant 'C' *)
+  Have: P_R(0).
   (* Invariant 'A' *)
   Have: P_P(n).
+  (* Invariant 'B' *)
+  Have: P_Q(n).
+  (* Invariant 'C' *)
+  Have: P_R(n).
 }
 Prove: false.
 
@@ -23,12 +29,18 @@ Prove: false.
 Goal Wp_smoke_dead_code in 'foo' at instruction (file tests/wp_plugin/doomed_axioms.i, line 30):
 Assume {
   Type: is_sint32(n) /\ is_sint32(x).
-  (* Invariant 'C' *)
-  Have: P_R(n).
+  (* Invariant 'A' *)
+  Have: P_P(0).
   (* Invariant 'B' *)
-  Have: P_Q(n).
+  Have: P_Q(0).
+  (* Invariant 'C' *)
+  Have: P_R(0).
   (* Invariant 'A' *)
   Have: P_P(n).
+  (* Invariant 'B' *)
+  Have: P_Q(n).
+  (* Invariant 'C' *)
+  Have: P_R(n).
   (* Then *)
   Have: 0 < x.
 }
@@ -39,12 +51,18 @@ Prove: false.
 Goal Wp_smoke_dead_code in 'foo' at return (file tests/wp_plugin/doomed_axioms.i, line 32):
 Assume {
   Type: is_sint32(n) /\ is_sint32(x).
-  (* Invariant 'C' *)
-  Have: P_R(n).
+  (* Invariant 'A' *)
+  Have: P_P(0).
   (* Invariant 'B' *)
-  Have: P_Q(n).
+  Have: P_Q(0).
+  (* Invariant 'C' *)
+  Have: P_R(0).
   (* Invariant 'A' *)
   Have: P_P(n).
+  (* Invariant 'B' *)
+  Have: P_Q(n).
+  (* Invariant 'C' *)
+  Have: P_R(n).
   (* Else *)
   Have: x <= 0.
 }
@@ -56,12 +74,18 @@ Goal Preservation of Invariant 'A' (file tests/wp_plugin/doomed_axioms.i, line 2
 Let x_1 = 1 + n.
 Assume {
   Type: is_sint32(n) /\ is_sint32(x) /\ is_sint32(x_1).
-  (* Invariant 'C' *)
-  Have: P_R(n).
+  (* Invariant 'A' *)
+  Have: P_P(0).
   (* Invariant 'B' *)
-  Have: P_Q(n).
+  Have: P_Q(0).
+  (* Invariant 'C' *)
+  Have: P_R(0).
   (* Invariant 'A' *)
   Have: P_P(n).
+  (* Invariant 'B' *)
+  Have: P_Q(n).
+  (* Invariant 'C' *)
+  Have: P_R(n).
   (* Then *)
   Have: 0 < x.
 }
@@ -78,20 +102,29 @@ Goal Preservation of Invariant 'B' (file tests/wp_plugin/doomed_axioms.i, line 2
 Let x_1 = 1 + n.
 Assume {
   Type: is_sint32(n) /\ is_sint32(x) /\ is_sint32(x_1).
-  (* Invariant 'C' *)
-  Have: P_R(n).
+  (* Invariant 'A' *)
+  Have: P_P(0).
   (* Invariant 'B' *)
-  Have: P_Q(n).
+  Have: P_Q(0).
+  (* Invariant 'C' *)
+  Have: P_R(0).
   (* Invariant 'A' *)
   Have: P_P(n).
+  (* Invariant 'B' *)
+  Have: P_Q(n).
+  (* Invariant 'C' *)
+  Have: P_R(n).
   (* Then *)
   Have: 0 < x.
+  (* Invariant 'A' *)
+  Have: P_P(x_1).
 }
 Prove: P_Q(x_1).
 
 ------------------------------------------------------------
 
 Goal Establishment of Invariant 'B' (file tests/wp_plugin/doomed_axioms.i, line 25):
+Assume { (* Invariant 'A' *) Have: P_P(0). }
 Prove: P_Q(0).
 
 ------------------------------------------------------------
@@ -100,20 +133,32 @@ Goal Preservation of Invariant 'C' (file tests/wp_plugin/doomed_axioms.i, line 2
 Let x_1 = 1 + n.
 Assume {
   Type: is_sint32(n) /\ is_sint32(x) /\ is_sint32(x_1).
-  (* Invariant 'C' *)
-  Have: P_R(n).
+  (* Invariant 'A' *)
+  Have: P_P(0).
   (* Invariant 'B' *)
-  Have: P_Q(n).
+  Have: P_Q(0).
+  (* Invariant 'C' *)
+  Have: P_R(0).
   (* Invariant 'A' *)
   Have: P_P(n).
+  (* Invariant 'B' *)
+  Have: P_Q(n).
+  (* Invariant 'C' *)
+  Have: P_R(n).
   (* Then *)
   Have: 0 < x.
+  (* Invariant 'A' *)
+  Have: P_P(x_1).
+  (* Invariant 'B' *)
+  Have: P_Q(x_1).
 }
 Prove: P_R(x_1).
 
 ------------------------------------------------------------
 
 Goal Establishment of Invariant 'C' (file tests/wp_plugin/doomed_axioms.i, line 26):
+Assume { (* Invariant 'A' *) Have: P_P(0). (* Invariant 'B' *) Have: P_Q(0).
+}
 Prove: P_R(0).
 
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/doomed_loop.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/doomed_loop.res.oracle
index 97103136af1d61d0f9dc62a842e18b5184bc026c..d942b94bb256c930f5dc7f08ca65ec2dabc645bb 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/doomed_loop.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/doomed_loop.res.oracle
@@ -37,7 +37,8 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Establishment of Invariant 'B' (file tests/wp_plugin/doomed_loop.i, line 19):
-Prove: !P_P(0).
+Assume { (* Invariant 'A' *) Have: P_P(0). }
+Prove: false.
 
 ------------------------------------------------------------
 
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/loop.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/loop.res.oracle
index 3c8dd80d4597e2df725575fe65b6684863573335..f7e116db708a6361c596652f4a5ddc21b475d91a 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/loop.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/loop.res.oracle
@@ -10,6 +10,7 @@ Goal Post-condition 'qed_ok' in 'init':
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
 Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let x_1 = 1 + b.
 Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i).
   (* Heap *)
@@ -21,10 +22,12 @@ Assume {
   (* Pre-condition *)
   Have: a <= b.
   (* Invariant 'qed_ok' *)
+  Have: a <= x_1.
+  (* Invariant 'qed_ok' *)
+  Have: (a <= i) /\ (i <= x_1).
+  (* Invariant 'qed_ok' *)
   Have: forall i_2 : Z. ((a <= i_2) -> ((i_2 < i) ->
       (a_2[shift_sint32(t, i_2)] = e))).
-  (* Invariant 'qed_ok' *)
-  Have: (a <= i) /\ (i <= (1 + b)).
   (* Else *)
   Have: b < i.
 }
@@ -35,9 +38,10 @@ Prove: a_2[shift_sint32(t, i_1)] = e.
 Goal Preservation of Invariant 'qed_ok' (file tests/wp_plugin/loop.i, line 12):
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
-Let x_1 = 1 + i.
+Let x_1 = 1 + b.
+Let x_2 = 1 + i.
 Assume {
-  Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i) /\ is_sint32(x_1).
+  Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i) /\ is_sint32(x_2).
   (* Heap *)
   Type: (region(t.base) <= 0) /\ linked(Malloc_0).
   (* Pre-condition *)
@@ -45,14 +49,16 @@ Assume {
   (* Pre-condition *)
   Have: a <= b.
   (* Invariant 'qed_ok' *)
+  Have: a <= x_1.
+  (* Invariant 'qed_ok' *)
+  Have: (a <= i) /\ (i <= x_1).
+  (* Invariant 'qed_ok' *)
   Have: forall i_1 : Z. ((a <= i_1) -> ((i_1 < i) ->
       (havoc(Mint_undef_0, Mint_0, a_1, i - a)[shift_sint32(t, i_1)] = e))).
-  (* Invariant 'qed_ok' *)
-  Have: (a <= i) /\ (i <= (1 + b)).
   (* Then *)
   Have: i <= b.
 }
-Prove: a <= x_1.
+Prove: a <= x_2.
 
 ------------------------------------------------------------
 
@@ -71,11 +77,13 @@ Prove: a <= (1 + b).
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'qed_ok' (file tests/wp_plugin/loop.i, line 13):
+Let x = 1 + i.
 Let a_1 = shift_sint32(t, a).
-Let x = -a.
+Let x_1 = -a.
 Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let x_2 = 1 + b.
 Assume {
-  Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i) /\ is_sint32(1 + i).
+  Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i) /\ is_sint32(x).
   (* Heap *)
   Type: (region(t.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
@@ -85,12 +93,16 @@ Assume {
   (* Pre-condition *)
   Have: a <= b.
   (* Invariant 'qed_ok' *)
+  Have: a <= x_2.
+  (* Invariant 'qed_ok' *)
+  Have: (a <= i) /\ (i <= x_2).
+  (* Invariant 'qed_ok' *)
   Have: forall i_2 : Z. ((a <= i_2) -> ((i_2 < i) ->
       (a_2[shift_sint32(t, i_2)] = e))).
-  (* Invariant 'qed_ok' *)
-  Have: (a <= i) /\ (i <= (1 + b)).
   (* Then *)
   Have: i <= b.
+  (* Invariant 'qed_ok' *)
+  Have: a <= x.
 }
 Prove: a_2[shift_sint32(t, i) <- e][shift_sint32(t, i_1)] = e.
 
@@ -116,33 +128,44 @@ Goal Loop assigns 'qed_ok' (3/3):
 Effect at line 16
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
-Let a_2 = shift_sint32(t, i).
+Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let a_3 = shift_sint32(t, i).
+Let x_1 = 1 + i.
+Let x_2 = 1 + b.
 Assume {
-  Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i) /\ is_sint32(1 + i).
+  Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i) /\ is_sint32(x_1).
   (* Heap *)
   Type: (region(t.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
-  When: !invalid(Malloc_0, a_2, 1).
+  When: !invalid(Malloc_0, a_3, 1).
   (* Pre-condition *)
   Have: valid_rw(Malloc_0, a_1, 1 + b - a).
   (* Pre-condition *)
   Have: a <= b.
   (* Invariant 'qed_ok' *)
-  Have: forall i_1 : Z. ((a <= i_1) -> ((i_1 < i) ->
-      (havoc(Mint_undef_0, Mint_0, a_1, i - a)[shift_sint32(t, i_1)] = e))).
+  Have: a <= x_2.
   (* Invariant 'qed_ok' *)
-  Have: (a <= i) /\ (i <= (1 + b)).
+  Have: (a <= i) /\ (i <= x_2).
+  (* Invariant 'qed_ok' *)
+  Have: forall i_1 : Z. ((a <= i_1) -> ((i_1 < i) ->
+      (a_2[shift_sint32(t, i_1)] = e))).
   (* Then *)
   Have: i <= b.
+  (* Invariant 'qed_ok' *)
+  Have: a <= x_1.
+  (* Invariant 'qed_ok' *)
+  Have: forall i_1 : Z. ((i_1 <= i) -> ((a <= i_1) ->
+      (a_2[a_3 <- e][shift_sint32(t, i_1)] = e))).
 }
-Prove: included(a_2, 1, a_1, 1 + i - a).
+Prove: included(a_3, 1, a_1, 1 + i - a).
 
 ------------------------------------------------------------
 
 Goal Assigns 'qed_ok' in 'init':
 Effect at line 15
+Let x = 1 + b.
 Let a_1 = shift_sint32(t, a).
-Let x = -a.
+Let x_1 = -a.
 Assume {
   Have: a < i.
   Have: !invalid(Malloc_0, a_1, i - a).
@@ -153,7 +176,9 @@ Assume {
   Have: valid_rw(Malloc_0, a_1, 1 + b - a).
   (* Pre-condition *)
   Have: a <= b.
+  (* Invariant 'qed_ok' *)
+  Have: a <= x.
 }
-Prove: i <= (1 + b).
+Prove: i <= x.
 
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/prenex.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/prenex.res.oracle
index f921ae4ce125d33e1ffdf74c9a30509986096d67..a2177f40d653e5f30547bfc250018cf79c4c837d 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/prenex.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/prenex.res.oracle
@@ -13,22 +13,24 @@ Assume {
   (* Heap *)
   Type: (region(p.base) <= 0) /\ (region(q.base) <= 0).
   (* Pre-condition *)
-  Have: (0 <= m) /\ (0 <= n).
+  Have: 0 <= m.
+  (* Invariant 'I' *)
+  Have: 0 <= n.
+  (* Invariant 'I' *)
+  Have: (0 <= i_1) /\ (i_1 <= n).
   (* Invariant 'PI' *)
   Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i_1) -> ((0 <= i_2) ->
       ((i_2 < m) ->
       (Mint_0[shift_sint32(p, i_3)] < Mint_0[shift_sint32(q, i_2)]))))).
-  (* Invariant 'I' *)
-  Have: (0 <= i_1) /\ (i_1 <= n).
   If i_1 < n
   Then {
     Let x = Mint_0[shift_sint32(p, i)].
     Have: (ta_j_0=false).
+    (* Invariant 'J' *)
+    Have: (0 <= j) /\ (j <= m).
     (* Invariant 'PJ' *)
     Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < j) ->
         (x < Mint_0[shift_sint32(q, i_2)]))).
-    (* Invariant 'J' *)
-    Have: (0 <= j) /\ (j <= m).
     (* Then *)
     Have: j < m.
     Have: i_1 = i.
@@ -51,21 +53,23 @@ Assume {
       is_sint32(1 + i).
   (* Heap *)
   Type: (region(p.base) <= 0) /\ (region(q.base) <= 0).
-  (* Pre-condition *)
-  Have: (0 <= m) /\ (0 <= n).
+  (* Invariant 'I' *)
+  Have: 0 <= n.
+  (* Invariant 'I' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'PI' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 < m) ->
       (Mint_0[shift_sint32(p, i_2)] < Mint_0[shift_sint32(q, i_1)]))))).
-  (* Invariant 'I' *)
-  Have: (0 <= i) /\ (i <= n).
   (* Then *)
   Have: i < n.
+  (* Invariant 'J' *)
+  Have: 0 <= m.
+  (* Invariant 'J' *)
+  Have: (0 <= j) /\ (j <= m).
   (* Invariant 'PJ' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) ->
       (Mint_0[shift_sint32(p, i)] < Mint_0[shift_sint32(q, i_1)]))).
-  (* Invariant 'J' *)
-  Have: (0 <= j) /\ (j <= m).
   (* Else *)
   Have: m <= j.
 }
@@ -86,23 +90,27 @@ Assume {
   Type: (region(p.base) <= 0) /\ (region(q.base) <= 0).
   (* Goal *)
   When: (0 <= i) /\ (0 <= i_1) /\ (i_1 < m) /\ (i <= i_2).
-  (* Pre-condition *)
-  Have: (0 <= m) /\ (0 <= n).
+  (* Invariant 'I' *)
+  Have: 0 <= n.
+  (* Invariant 'I' *)
+  Have: (0 <= i_2) /\ (i_2 <= n).
   (* Invariant 'PI' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i_2) -> ((0 <= i_3) ->
       ((i_3 < m) ->
       (Mint_0[shift_sint32(p, i_4)] < Mint_0[shift_sint32(q, i_3)]))))).
-  (* Invariant 'I' *)
-  Have: (0 <= i_2) /\ (i_2 <= n).
   (* Then *)
   Have: i_2 < n.
+  (* Invariant 'J' *)
+  Have: 0 <= m.
+  (* Invariant 'J' *)
+  Have: (0 <= j) /\ (j <= m).
   (* Invariant 'PJ' *)
   Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < j) ->
       (Mint_0[shift_sint32(p, i_2)] < Mint_0[shift_sint32(q, i_3)]))).
-  (* Invariant 'J' *)
-  Have: (0 <= j) /\ (j <= m).
   (* Else *)
   Have: m <= j.
+  (* Invariant 'I' *)
+  Have: (-1) <= i_2.
 }
 Prove: Mint_0[shift_sint32(p, i)] < Mint_0[shift_sint32(q, i_1)].
 
@@ -121,21 +129,23 @@ Assume {
       is_sint32(1 + j) /\ is_sint32(x) /\ is_sint32(x_1).
   (* Heap *)
   Type: (region(p.base) <= 0) /\ (region(q.base) <= 0).
-  (* Pre-condition *)
-  Have: (0 <= m) /\ (0 <= n).
+  (* Invariant 'I' *)
+  Have: 0 <= n.
+  (* Invariant 'I' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'PI' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 < m) ->
       (Mint_0[shift_sint32(p, i_2)] < Mint_0[shift_sint32(q, i_1)]))))).
-  (* Invariant 'I' *)
-  Have: (0 <= i) /\ (i <= n).
   (* Then *)
   Have: i < n.
+  (* Invariant 'J' *)
+  Have: 0 <= m.
+  (* Invariant 'J' *)
+  Have: (0 <= j) /\ (j <= m).
   (* Invariant 'PJ' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) ->
       (x < Mint_0[shift_sint32(q, i_1)]))).
-  (* Invariant 'J' *)
-  Have: (0 <= j) /\ (j <= m).
   (* Then *)
   Have: j < m.
   (* Else *)
@@ -160,25 +170,29 @@ Assume {
   Type: (region(p.base) <= 0) /\ (region(q.base) <= 0).
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 <= j).
-  (* Pre-condition *)
-  Have: (0 <= m) /\ (0 <= n).
+  (* Invariant 'I' *)
+  Have: 0 <= n.
+  (* Invariant 'I' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'PI' *)
   Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) ->
       ((i_2 < m) ->
       (Mint_0[shift_sint32(p, i_3)] < Mint_0[shift_sint32(q, i_2)]))))).
-  (* Invariant 'I' *)
-  Have: (0 <= i) /\ (i <= n).
   (* Then *)
   Have: i < n.
+  (* Invariant 'J' *)
+  Have: 0 <= m.
+  (* Invariant 'J' *)
+  Have: (0 <= j) /\ (j <= m).
   (* Invariant 'PJ' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < j) ->
       (x < Mint_0[shift_sint32(q, i_2)]))).
-  (* Invariant 'J' *)
-  Have: (0 <= j) /\ (j <= m).
   (* Then *)
   Have: j < m.
   (* Else *)
   Have: x < x_1.
+  (* Invariant 'J' *)
+  Have: (-1) <= j.
 }
 Prove: x < Mint_0[shift_sint32(q, i_1)].
 
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/repeat.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/repeat.res.oracle
index c7250d7a7f3ae9c3f49932ff276435874024b1c0..5ef0fd177d7a00356e6ac6144bd2cda59986de57 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/repeat.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/repeat.res.oracle
@@ -20,13 +20,13 @@ Assume {
   (* Heap *)
   Type: is_sint32(calls_0).
   (* Pre-condition *)
-  Have: 0 <= n.
-  (* Pre-condition *)
   Have: L_sequence(calls_0) = nil.
   (* Invariant *)
-  Have: ([ 1, 2 ] *^ i) = a.
+  Have: 0 <= n.
   (* Invariant *)
   Have: (0 <= i) /\ (i <= n).
+  (* Invariant *)
+  Have: ([ 1, 2 ] *^ i) = a.
   (* Then *)
   Have: i < n.
   (* Call 'f' *)
@@ -53,19 +53,21 @@ Assume {
   (* Heap *)
   Type: is_sint32(calls_1).
   (* Pre-condition *)
-  Have: 0 <= n.
-  (* Pre-condition *)
   Have: L_sequence(calls_1) = nil.
   (* Invariant *)
-  Have: (a_2 *^ i) = a.
+  Have: 0 <= n.
   (* Invariant *)
   Have: (0 <= i) /\ (i <= n).
+  (* Invariant *)
+  Have: (a_2 *^ i) = a.
   (* Then *)
   Have: i < n.
   (* Call 'f' *)
   Have: L_sequence(calls_2) = a ^ [ 1 ].
   (* Call 'g' *)
   Have: L_sequence(calls_3) = a_1.
+  (* Invariant *)
+  Have: (-1) <= i.
 }
 Prove: (a_2 *^ x) = a_1.
 
@@ -128,15 +130,15 @@ Assume {
   (* Heap *)
   Type: is_sint32(calls_0).
   (* Pre-condition *)
-  Have: 0 <= n.
-  (* Pre-condition *)
   Have: L_sequence(calls_0) = nil.
   (* Call 'f' *)
   Have: L_sequence(calls_1) = [ 1 ].
   (* Invariant *)
-  Have: L_sequence(calls_2) = a_1 ^ [ 1 ].
+  Have: 0 <= n.
   (* Invariant *)
   Have: (0 <= i) /\ (i <= n).
+  (* Invariant *)
+  Have: L_sequence(calls_2) = a_1 ^ [ 1 ].
   (* Else *)
   Have: n <= i.
   (* Call 'g' *)
@@ -153,15 +155,15 @@ Assume {
   (* Heap *)
   Type: is_sint32(calls_0).
   (* Pre-condition *)
-  Have: 0 <= n.
-  (* Pre-condition *)
   Have: L_sequence(calls_0) = nil.
   (* Call 'f' *)
   Have: L_sequence(calls_1) = [ 1 ].
   (* Invariant *)
-  Have: L_sequence(calls_2) = a ^ [ 1 ].
+  Have: 0 <= n.
   (* Invariant *)
   Have: (0 <= i) /\ (i <= n).
+  (* Invariant *)
+  Have: L_sequence(calls_2) = a ^ [ 1 ].
   (* Then *)
   Have: i < n.
   (* Call 'g' *)
@@ -188,21 +190,23 @@ Assume {
   (* Heap *)
   Type: is_sint32(calls_0).
   (* Pre-condition *)
-  Have: 0 <= n.
-  (* Pre-condition *)
   Have: L_sequence(calls_0) = nil.
   (* Call 'f' *)
   Have: L_sequence(calls_1) = [ 1 ].
   (* Invariant *)
-  Have: L_sequence(calls_2) = a_1 ^ [ 1 ].
+  Have: 0 <= n.
   (* Invariant *)
   Have: (0 <= i) /\ (i <= n).
+  (* Invariant *)
+  Have: L_sequence(calls_2) = a_1 ^ [ 1 ].
   (* Then *)
   Have: i < n.
   (* Call 'g' *)
   Have: L_sequence(calls_3) = a_2.
   (* Call 'f' *)
   Have: L_sequence(calls_4) = a_1 ^ [ 1, 2, 1 ].
+  (* Invariant *)
+  Have: (-1) <= i.
 }
 Prove: (a *^ x) = a_2.
 
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/sequence.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/sequence.res.oracle
index 1fd2d32b881e58611c6a586443b88e5c4c5206ba..46d5f7b06e4bd3aa1389809c6b8a1ca722cac760 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/sequence.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/sequence.res.oracle
@@ -23,12 +23,12 @@ Assume {
   Have: L_call_obs(call_seq_0) = nil.
   (* Call 'f' *)
   Have: L_call_obs(call_seq_1) = [ x ].
-  (* Invariant 'ok,inv' *)
-  Have: L_call_obs(call_seq_2) = [ x ] ^ a.
-  (* Invariant 'ok,id_max' *)
-  Have: if (0 <= n) then (i <= n) else (i <= 0).
   (* Invariant 'ok,id_min' *)
   Have: 0 <= i.
+  (* Invariant 'ok,id_max' *)
+  Have: if (0 <= n) then (i <= n) else (i <= 0).
+  (* Invariant 'ok,inv' *)
+  Have: L_call_obs(call_seq_2) = [ x ] ^ a.
   (* Else *)
   Have: n <= i.
   (* Call 'f' *)
@@ -49,16 +49,18 @@ Assume {
   Have: L_call_obs(call_seq_0) = nil.
   (* Call 'f' *)
   Have: L_call_obs(call_seq_1) = [ x ].
-  (* Invariant 'ok,inv' *)
-  Have: L_call_obs(call_seq_2) = [ x ] ^ a.
-  (* Invariant 'ok,id_max' *)
-  Have: if (0 <= n) then (i <= n) else (i <= 0).
   (* Invariant 'ok,id_min' *)
   Have: 0 <= i.
+  (* Invariant 'ok,id_max' *)
+  Have: if (0 <= n) then (i <= n) else (i <= 0).
+  (* Invariant 'ok,inv' *)
+  Have: L_call_obs(call_seq_2) = [ x ] ^ a.
   (* Then *)
   Have: i < n.
   (* Call 'g' *)
   Have: L_call_obs(call_seq_3) = [ x ] ^ a ^ [ y ].
+  (* Invariant 'ok,id_min' *)
+  Have: (-1) <= i.
 }
 Prove: 0 <= n.
 
@@ -80,12 +82,12 @@ Assume {
   Have: L_call_obs(call_seq_0) = nil.
   (* Call 'f' *)
   Have: L_call_obs(call_seq_1) = [ x ].
-  (* Invariant 'ok,inv' *)
-  Have: L_call_obs(call_seq_2) = [ x ] ^ a.
-  (* Invariant 'ok,id_max' *)
-  Have: if (0 <= n) then (i <= n) else (i <= 0).
   (* Invariant 'ok,id_min' *)
   Have: 0 <= i.
+  (* Invariant 'ok,id_max' *)
+  Have: if (0 <= n) then (i <= n) else (i <= 0).
+  (* Invariant 'ok,inv' *)
+  Have: L_call_obs(call_seq_2) = [ x ] ^ a.
   (* Then *)
   Have: i < n.
   (* Call 'g' *)
@@ -112,16 +114,20 @@ Assume {
   Have: L_call_obs(call_seq_0) = nil.
   (* Call 'f' *)
   Have: L_call_obs(call_seq_1) = [ x ].
-  (* Invariant 'ok,inv' *)
-  Have: L_call_obs(call_seq_2) = [ x ] ^ a.
-  (* Invariant 'ok,id_max' *)
-  Have: if (0 <= n) then (i <= n) else (i <= 0).
   (* Invariant 'ok,id_min' *)
   Have: 0 <= i.
+  (* Invariant 'ok,id_max' *)
+  Have: i <= n.
+  (* Invariant 'ok,inv' *)
+  Have: L_call_obs(call_seq_2) = [ x ] ^ a.
   (* Then *)
   Have: i < n.
   (* Call 'g' *)
   Have: L_call_obs(call_seq_3) = [ x ] ^ a ^ [ y ].
+  (* Invariant 'ok,id_min' *)
+  Have: (-1) <= i.
+  (* Invariant 'ok,id_max' *)
+  Have: 0 <= n.
 }
 Prove: ([ y ] *^ x_1) = a ^ [ y ].
 
@@ -187,12 +193,12 @@ Assume {
   Have: 0 < n.
   (* Call 'f' *)
   Have: L_call_obs(call_seq_1) = [ x ].
-  (* Invariant 'ok,inv' *)
-  Have: L_call_obs(call_seq_2) = [ x ] ^ a.
-  (* Invariant 'ok,id_max' *)
-  Have: i <= n.
   (* Invariant 'ok,id_min' *)
   Have: 0 <= i.
+  (* Invariant 'ok,id_max' *)
+  Have: i <= n.
+  (* Invariant 'ok,inv' *)
+  Have: L_call_obs(call_seq_2) = [ x ] ^ a.
   (* Else *)
   Have: n <= i.
   (* Call 'f' *)
@@ -223,12 +229,12 @@ Assume {
   Have: n <= 0.
   (* Call 'f' *)
   Have: L_call_obs(call_seq_1) = [ x ].
-  (* Invariant 'ok,inv' *)
-  Have: L_call_obs(call_seq_2) = [ x ] ^ a.
-  (* Invariant 'ok,id_max' *)
-  Have: if (0 <= n) then (i <= n) else (i <= 0).
   (* Invariant 'ok,id_min' *)
   Have: 0 <= i.
+  (* Invariant 'ok,id_max' *)
+  Have: if (0 <= n) then (i <= n) else (i <= 0).
+  (* Invariant 'ok,inv' *)
+  Have: L_call_obs(call_seq_2) = [ x ] ^ a.
   (* Else *)
   Have: n <= i.
   (* Call 'f' *)
@@ -251,12 +257,12 @@ Assume {
   Have: n <= 0.
   (* Call 'f' *)
   Have: L_call_obs(call_seq_1) = [ x ].
-  (* Invariant 'ok,inv' *)
-  Have: L_call_obs(call_seq_2) = [ x ] ^ a.
-  (* Invariant 'ok,id_max' *)
-  Have: if (0 <= n) then (i <= n) else (i <= 0).
   (* Invariant 'ok,id_min' *)
   Have: 0 <= i.
+  (* Invariant 'ok,id_max' *)
+  Have: if (0 <= n) then (i <= n) else (i <= 0).
+  (* Invariant 'ok,inv' *)
+  Have: L_call_obs(call_seq_2) = [ x ] ^ a.
   (* Else *)
   Have: n <= i.
   (* Call 'f' *)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/string_c.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/string_c.res.oracle
index 01d8890819150fb8ee3f468e78405a38095a941d..d52d8d297fbc9bc51701761979118292eefad810 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/string_c.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/string_c.res.oracle
@@ -18,10 +18,12 @@ Assume {
   (* Pre-condition 'separation' *)
   Have: separated(a, n, shift_sint8(src_0, 0), n).
   (* Invariant 'no_eva' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_1[shift_sint8(src_0, i_1)] = a_1[shift_sint8(dest_0, i_1)]))).
+  Have: 0 <= n.
   (* Invariant 'no_eva' *)
   Have: (0 <= i) /\ (i <= n).
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_1[shift_sint8(src_0, i_1)] = a_1[shift_sint8(dest_0, i_1)]))).
   (* Else *)
   Have: n <= i.
 }
@@ -50,10 +52,12 @@ Assume {
   (* Pre-condition 'separation' *)
   Have: separated(a, n, shift_sint8(src_0, 0), n).
   (* Invariant 'no_eva' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_1[shift_sint8(src_0, i_1)] = a_1[shift_sint8(dest_0, i_1)]))).
+  Have: 0 <= n.
   (* Invariant 'no_eva' *)
   Have: (0 <= i) /\ (i <= n).
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_1[shift_sint8(src_0, i_1)] = a_1[shift_sint8(dest_0, i_1)]))).
   (* Then *)
   Have: i < n.
 }
@@ -79,6 +83,7 @@ Prove: 0 <= n.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 34):
+Let x = to_uint64(1 + i).
 Let a = shift_sint8(dest_0, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Let a_2 = a_1[shift_sint8(dest_0, i) <- a_1[shift_sint8(src_0, i)]].
@@ -88,7 +93,7 @@ Assume {
   Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 < to_uint64(1 + i)).
+  When: (0 <= i_1) /\ (i_1 < x).
   (* Pre-condition 'valid_dest' *)
   Have: P_valid_or_empty(Malloc_0, dest_0, n).
   (* Pre-condition 'valid_src' *)
@@ -96,12 +101,16 @@ Assume {
   (* Pre-condition 'separation' *)
   Have: separated(a, n, shift_sint8(src_0, 0), n).
   (* Invariant 'no_eva' *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_1[shift_sint8(src_0, i_2)] = a_1[shift_sint8(dest_0, i_2)]))).
+  Have: 0 <= n.
   (* Invariant 'no_eva' *)
   Have: (0 <= i) /\ (i <= n).
+  (* Invariant 'no_eva' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
+      (a_1[shift_sint8(src_0, i_2)] = a_1[shift_sint8(dest_0, i_2)]))).
   (* Then *)
   Have: i < n.
+  (* Invariant 'no_eva' *)
+  Have: x <= n.
 }
 Prove: a_2[shift_sint8(src_0, i_1)] = a_2[shift_sint8(dest_0, i_1)].
 
@@ -125,9 +134,11 @@ Prove: true.
 
 Goal Loop assigns (file FRAMAC_SHARE/libc/string.c, line 35) (3/3):
 Effect at line 39
+Let x = to_uint64(1 + i).
 Let a = shift_sint8(dest_0, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Let a_2 = shift_sint8(dest_0, i).
+Let a_3 = a_1[a_2 <- a_1[shift_sint8(src_0, i)]].
 Assume {
   Type: is_uint64(i) /\ is_uint64(n).
   (* Heap *)
@@ -142,12 +153,19 @@ Assume {
   (* Pre-condition 'separation' *)
   Have: separated(a, n, shift_sint8(src_0, 0), n).
   (* Invariant 'no_eva' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_1[shift_sint8(src_0, i_1)] = a_1[shift_sint8(dest_0, i_1)]))).
+  Have: 0 <= n.
   (* Invariant 'no_eva' *)
   Have: (0 <= i) /\ (i <= n).
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_1[shift_sint8(src_0, i_1)] = a_1[shift_sint8(dest_0, i_1)]))).
   (* Then *)
   Have: i < n.
+  (* Invariant 'no_eva' *)
+  Have: x <= n.
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < x) ->
+      (a_3[shift_sint8(src_0, i_1)] = a_3[shift_sint8(dest_0, i_1)]))).
 }
 Prove: included(a_2, 1, a, n).
 
@@ -160,8 +178,10 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file FRAMAC_SHARE/libc/string.c, line 38):
+Let x = to_uint64(1 + i).
 Let a = shift_sint8(dest_0, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_2 = a_1[shift_sint8(dest_0, i) <- a_1[shift_sint8(src_0, i)]].
 Assume {
   Type: is_uint64(i) /\ is_uint64(n).
   (* Heap *)
@@ -174,14 +194,21 @@ Assume {
   (* Pre-condition 'separation' *)
   Have: separated(a, n, shift_sint8(src_0, 0), n).
   (* Invariant 'no_eva' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_1[shift_sint8(src_0, i_1)] = a_1[shift_sint8(dest_0, i_1)]))).
+  Have: 0 <= n.
   (* Invariant 'no_eva' *)
   Have: (0 <= i) /\ (i <= n).
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_1[shift_sint8(src_0, i_1)] = a_1[shift_sint8(dest_0, i_1)]))).
   (* Then *)
   Have: i < n.
+  (* Invariant 'no_eva' *)
+  Have: x <= n.
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < x) ->
+      (a_2[shift_sint8(src_0, i_1)] = a_2[shift_sint8(dest_0, i_1)]))).
 }
-Prove: i < to_uint64(1 + i).
+Prove: i < x.
 
 ------------------------------------------------------------
 
@@ -193,7 +220,7 @@ Prove: true.
 Goal Post-condition 'copied_contents' in 'memmove':
 Assume {
   Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(i_1) /\
-      is_uint64(n).
+      is_uint64(i_2) /\ is_uint64(n).
   (* Heap *)
   Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
@@ -217,34 +244,44 @@ Assume {
     If memoverlap_0 <= 0
     Then {
       Have: (ta_i_0=false).
+      (* Invariant 'no_eva' *)
+      Have: 0 <= n.
       (* Loop assigns ... *)
       Have: havoc(Mchar_undef_0, Mchar_0, a, n) = Mchar_1.
       (* Invariant 'no_eva' *)
-      Have: forall i_2 : Z. let a_2 = shift_sint8(src_0, i_2) in
-          ((i <= i_2) -> ((i_2 < n) -> (Mchar_1[a_2] = Mchar_0[a_2]))).
+      Have: (0 <= i) /\ (i <= n).
       (* Invariant 'no_eva' *)
-      Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-          (Mchar_1[shift_sint8(dest_0, i_2)]
-             = Mchar_0[shift_sint8(src_0, i_2)]))).
+      Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < i) ->
+          (Mchar_1[shift_sint8(dest_0, i_3)]
+             = Mchar_0[shift_sint8(src_0, i_3)]))).
       (* Invariant 'no_eva' *)
-      Have: (0 <= i) /\ (i <= n).
+      Have: forall i_3 : Z. let a_2 = shift_sint8(src_0, i_3) in
+          ((i <= i_3) -> ((i_3 < n) -> (Mchar_1[a_2] = Mchar_0[a_2]))).
       (* Else *)
       Have: n <= i.
     }
     Else {
       (* Block In *)
       Have: (ta_i_1=false).
+      (* Initializer *)
+      Init: to_uint64(n - 1) = i_2.
+      (* Invariant 'no_eva' *)
+      Have: i_2 < n.
+      (* Invariant 'no_eva' *)
+      Have: forall i_3 : Z. ((i_2 < i_3) -> ((i_3 < n) ->
+          (Mchar_0[shift_sint8(src_0, i_3)]
+             = Mchar_0[shift_sint8(dest_0, i_3)]))).
       (* Loop assigns ... *)
       Have: havoc(Mchar_undef_1, Mchar_0, a, n) = Mchar_2.
       (* Invariant 'no_eva' *)
-      Have: forall i_2 : Z. let a_2 = shift_sint8(src_0, i_2) in
-          ((i_2 <= i_1) -> ((0 <= i_2) -> (Mchar_2[a_2] = Mchar_0[a_2]))).
+      Have: (0 <= i_1) /\ (i_1 < n).
       (* Invariant 'no_eva' *)
-      Have: forall i_2 : Z. ((i_1 < i_2) -> ((i_2 < n) ->
-          (Mchar_2[shift_sint8(dest_0, i_2)]
-             = Mchar_0[shift_sint8(src_0, i_2)]))).
+      Have: forall i_3 : Z. ((i_1 < i_3) -> ((i_3 < n) ->
+          (Mchar_2[shift_sint8(dest_0, i_3)]
+             = Mchar_0[shift_sint8(src_0, i_3)]))).
       (* Invariant 'no_eva' *)
-      Have: (0 <= i_1) /\ (i_1 < n).
+      Have: forall i_3 : Z. let a_2 = shift_sint8(src_0, i_3) in
+          ((i_3 <= i_1) -> ((0 <= i_3) -> (Mchar_2[a_2] = Mchar_0[a_2]))).
       (* Else *)
       Have: i_1 <= 0.
       Have: Mchar_2[a <- Mchar_2[a_1]] = Mchar_1.
@@ -284,13 +321,15 @@ Assume {
   (* Then *)
   Have: memoverlap_0 <= 0.
   (* Invariant 'no_eva' *)
-  Have: forall i_1 : Z. let a_3 = shift_sint8(src_0, i_1) in ((i <= i_1) ->
-      ((i_1 < n) -> (a_1[a_3] = Mchar_0[a_3]))).
+  Have: 0 <= n.
+  (* Invariant 'no_eva' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'no_eva' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       (a_1[shift_sint8(dest_0, i_1)] = Mchar_0[shift_sint8(src_0, i_1)]))).
   (* Invariant 'no_eva' *)
-  Have: (0 <= i) /\ (i <= n).
+  Have: forall i_1 : Z. let a_3 = shift_sint8(src_0, i_1) in ((i <= i_1) ->
+      ((i_1 < n) -> (a_1[a_3] = Mchar_0[a_3]))).
   (* Then *)
   Have: i < n.
 }
@@ -325,6 +364,7 @@ Prove: 0 <= n.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 96):
+Let x = to_uint64(1 + i).
 Let a = shift_sint8(d, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Let a_2 = shift_sint8(s, 0).
@@ -334,7 +374,7 @@ Assume {
   Type: (region(d.base) <= 0) /\ (region(s.base) <= 0) /\ linked(Malloc_0) /\
       sconst(Mchar_0).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 < to_uint64(1 + i)).
+  When: (0 <= i_1) /\ (i_1 < x).
   (* Pre-condition 'valid_dest' *)
   Have: P_valid_or_empty(Malloc_0, d, n).
   (* Pre-condition 'valid_src' *)
@@ -350,15 +390,19 @@ Assume {
   (* Then *)
   Have: memoverlap_0 <= 0.
   (* Invariant 'no_eva' *)
-  Have: forall i_2 : Z. let a_3 = shift_sint8(s, i_2) in ((i <= i_2) ->
-      ((i_2 < n) -> (a_1[a_3] = Mchar_0[a_3]))).
+  Have: 0 <= n.
+  (* Invariant 'no_eva' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'no_eva' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       (a_1[shift_sint8(d, i_2)] = Mchar_0[shift_sint8(s, i_2)]))).
   (* Invariant 'no_eva' *)
-  Have: (0 <= i) /\ (i <= n).
+  Have: forall i_2 : Z. let a_3 = shift_sint8(s, i_2) in ((i <= i_2) ->
+      ((i_2 < n) -> (a_1[a_3] = Mchar_0[a_3]))).
   (* Then *)
   Have: i < n.
+  (* Invariant 'no_eva' *)
+  Have: x <= n.
 }
 Prove: a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]][shift_sint8(d, i_1)] =
     Mchar_0[shift_sint8(s, i_1)].
@@ -371,17 +415,19 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 97):
+Let x = to_uint64(1 + i).
 Let a = shift_sint8(d, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
-Let a_2 = shift_sint8(s, 0).
-Let a_3 = shift_sint8(s, i_1).
+Let a_2 = a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]].
+Let a_3 = shift_sint8(s, 0).
+Let a_4 = shift_sint8(s, i_1).
 Assume {
   Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(d.base) <= 0) /\ (region(s.base) <= 0) /\ linked(Malloc_0) /\
       sconst(Mchar_0).
   (* Goal *)
-  When: (i_1 < n) /\ (to_uint64(1 + i) <= i_1).
+  When: (i_1 < n) /\ (x <= i_1).
   (* Pre-condition 'valid_dest' *)
   Have: P_valid_or_empty(Malloc_0, d, n).
   (* Pre-condition 'valid_src' *)
@@ -389,25 +435,32 @@ Assume {
   (* Else *)
   Have: n != 0.
   (* Call 'memoverlap' *)
-  Have: ((separated(a, n, a_2, n) -> (memoverlap_0 = 0))) /\
+  Have: ((separated(a, n, a_3, n) -> (memoverlap_0 = 0))) /\
       ((addr_le(d, s) -> (addr_lt(s, shift_sint8(d, n)) ->
-       ((!separated(a, n, a_2, n)) -> (memoverlap_0 = (-1)))))) /\
+       ((!separated(a, n, a_3, n)) -> (memoverlap_0 = (-1)))))) /\
       ((addr_lt(s, d) -> (addr_le(d, shift_sint8(s, n)) ->
-       ((!separated(a, n, a_2, n)) -> (memoverlap_0 = 1))))).
+       ((!separated(a, n, a_3, n)) -> (memoverlap_0 = 1))))).
   (* Then *)
   Have: memoverlap_0 <= 0.
   (* Invariant 'no_eva' *)
-  Have: forall i_2 : Z. let a_4 = shift_sint8(s, i_2) in ((i <= i_2) ->
-      ((i_2 < n) -> (a_1[a_4] = Mchar_0[a_4]))).
+  Have: 0 <= n.
+  (* Invariant 'no_eva' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'no_eva' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       (a_1[shift_sint8(d, i_2)] = Mchar_0[shift_sint8(s, i_2)]))).
   (* Invariant 'no_eva' *)
-  Have: (0 <= i) /\ (i <= n).
+  Have: forall i_2 : Z. let a_5 = shift_sint8(s, i_2) in ((i <= i_2) ->
+      ((i_2 < n) -> (a_1[a_5] = Mchar_0[a_5]))).
   (* Then *)
   Have: i < n.
+  (* Invariant 'no_eva' *)
+  Have: x <= n.
+  (* Invariant 'no_eva' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < x) ->
+      (a_2[shift_sint8(d, i_2)] = Mchar_0[shift_sint8(s, i_2)]))).
 }
-Prove: a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]][a_3] = Mchar_0[a_3].
+Prove: a_2[a_4] = Mchar_0[a_4].
 
 ------------------------------------------------------------
 
@@ -419,6 +472,7 @@ Prove: true.
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 107):
 Let a = shift_sint8(dest_0, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let x = to_uint64(n - 1).
 Let a_2 = shift_sint8(src_0, 0).
 Assume {
   Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
@@ -440,13 +494,18 @@ Assume {
   (* Else *)
   Have: 0 < memoverlap_0.
   (* Invariant 'no_eva' *)
-  Have: forall i_1 : Z. let a_3 = shift_sint8(src_0, i_1) in ((i_1 <= i) ->
-      ((0 <= i_1) -> (a_1[a_3] = Mchar_0[a_3]))).
+  Have: x < n.
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. ((i_1 < n) -> ((x < i_1) ->
+      (Mchar_0[shift_sint8(src_0, i_1)] = Mchar_0[shift_sint8(dest_0, i_1)]))).
+  (* Invariant 'no_eva' *)
+  Have: (0 <= i) /\ (i < n).
   (* Invariant 'no_eva' *)
   Have: forall i_1 : Z. ((i < i_1) -> ((i_1 < n) ->
       (a_1[shift_sint8(dest_0, i_1)] = Mchar_0[shift_sint8(src_0, i_1)]))).
   (* Invariant 'no_eva' *)
-  Have: (0 <= i) /\ (i < n).
+  Have: forall i_1 : Z. let a_3 = shift_sint8(src_0, i_1) in ((i_1 <= i) ->
+      ((0 <= i_1) -> (a_1[a_3] = Mchar_0[a_3]))).
   (* Then *)
   Have: 0 < i.
 }
@@ -481,8 +540,10 @@ Prove: to_uint64(n - 1) < n.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 108):
+Let x = to_uint64(i - 1).
 Let a = shift_sint8(d, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let x_1 = to_uint64(n - 1).
 Let a_2 = shift_sint8(s, 0).
 Assume {
   Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
@@ -490,7 +551,7 @@ Assume {
   Type: (region(d.base) <= 0) /\ (region(s.base) <= 0) /\ linked(Malloc_0) /\
       sconst(Mchar_0).
   (* Goal *)
-  When: (i_1 < n) /\ (to_uint64(i - 1) < i_1).
+  When: (i_1 < n) /\ (x < i_1).
   (* Pre-condition 'valid_dest' *)
   Have: P_valid_or_empty(Malloc_0, d, n).
   (* Pre-condition 'valid_src' *)
@@ -506,15 +567,22 @@ Assume {
   (* Else *)
   Have: 0 < memoverlap_0.
   (* Invariant 'no_eva' *)
-  Have: forall i_2 : Z. let a_3 = shift_sint8(s, i_2) in ((i_2 <= i) ->
-      ((0 <= i_2) -> (a_1[a_3] = Mchar_0[a_3]))).
+  Have: x_1 < n.
+  (* Invariant 'no_eva' *)
+  Have: forall i_2 : Z. ((i_2 < n) -> ((x_1 < i_2) ->
+      (Mchar_0[shift_sint8(s, i_2)] = Mchar_0[shift_sint8(d, i_2)]))).
+  (* Invariant 'no_eva' *)
+  Have: (0 <= i) /\ (i < n).
   (* Invariant 'no_eva' *)
   Have: forall i_2 : Z. ((i < i_2) -> ((i_2 < n) ->
       (a_1[shift_sint8(d, i_2)] = Mchar_0[shift_sint8(s, i_2)]))).
   (* Invariant 'no_eva' *)
-  Have: (0 <= i) /\ (i < n).
+  Have: forall i_2 : Z. let a_3 = shift_sint8(s, i_2) in ((i_2 <= i) ->
+      ((0 <= i_2) -> (a_1[a_3] = Mchar_0[a_3]))).
   (* Then *)
   Have: 0 < i.
+  (* Invariant 'no_eva' *)
+  Have: x < n.
 }
 Prove: a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]][shift_sint8(d, i_1)] =
     Mchar_0[shift_sint8(s, i_1)].
@@ -522,6 +590,7 @@ Prove: a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]][shift_sint8(d, i_1)] =
 ------------------------------------------------------------
 
 Goal Establishment of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 108):
+Let x = to_uint64(n - 1).
 Let a = shift_sint8(dest_0, 0).
 Let a_1 = shift_sint8(src_0, 0).
 Assume {
@@ -530,7 +599,7 @@ Assume {
   Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Goal *)
-  When: (i < n) /\ (to_uint64(n - 1) < i).
+  When: (i < n) /\ (x < i).
   (* Pre-condition 'valid_dest' *)
   Have: P_valid_or_empty(Malloc_0, dest_0, n).
   (* Pre-condition 'valid_src' *)
@@ -545,23 +614,28 @@ Assume {
        ((!separated(a, n, a_1, n)) -> (memoverlap_0 = 1))))).
   (* Else *)
   Have: 0 < memoverlap_0.
+  (* Invariant 'no_eva' *)
+  Have: x < n.
 }
 Prove: Mchar_0[shift_sint8(src_0, i)] = Mchar_0[shift_sint8(dest_0, i)].
 
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 109):
+Let x = to_uint64(i - 1).
 Let a = shift_sint8(d, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
-Let a_2 = shift_sint8(s, 0).
-Let a_3 = shift_sint8(s, i_1).
+Let a_2 = a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]].
+Let x_1 = to_uint64(n - 1).
+Let a_3 = shift_sint8(s, 0).
+Let a_4 = shift_sint8(s, i_1).
 Assume {
   Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(d.base) <= 0) /\ (region(s.base) <= 0) /\ linked(Malloc_0) /\
       sconst(Mchar_0).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 <= to_uint64(i - 1)).
+  When: (0 <= i_1) /\ (i_1 <= x).
   (* Pre-condition 'valid_dest' *)
   Have: P_valid_or_empty(Malloc_0, d, n).
   (* Pre-condition 'valid_src' *)
@@ -569,25 +643,35 @@ Assume {
   (* Else *)
   Have: n != 0.
   (* Call 'memoverlap' *)
-  Have: ((separated(a, n, a_2, n) -> (memoverlap_0 = 0))) /\
+  Have: ((separated(a, n, a_3, n) -> (memoverlap_0 = 0))) /\
       ((addr_le(d, s) -> (addr_lt(s, shift_sint8(d, n)) ->
-       ((!separated(a, n, a_2, n)) -> (memoverlap_0 = (-1)))))) /\
+       ((!separated(a, n, a_3, n)) -> (memoverlap_0 = (-1)))))) /\
       ((addr_lt(s, d) -> (addr_le(d, shift_sint8(s, n)) ->
-       ((!separated(a, n, a_2, n)) -> (memoverlap_0 = 1))))).
+       ((!separated(a, n, a_3, n)) -> (memoverlap_0 = 1))))).
   (* Else *)
   Have: 0 < memoverlap_0.
   (* Invariant 'no_eva' *)
-  Have: forall i_2 : Z. let a_4 = shift_sint8(s, i_2) in ((i_2 <= i) ->
-      ((0 <= i_2) -> (a_1[a_4] = Mchar_0[a_4]))).
+  Have: x_1 < n.
+  (* Invariant 'no_eva' *)
+  Have: forall i_2 : Z. ((i_2 < n) -> ((x_1 < i_2) ->
+      (Mchar_0[shift_sint8(s, i_2)] = Mchar_0[shift_sint8(d, i_2)]))).
+  (* Invariant 'no_eva' *)
+  Have: (0 <= i) /\ (i < n).
   (* Invariant 'no_eva' *)
   Have: forall i_2 : Z. ((i < i_2) -> ((i_2 < n) ->
       (a_1[shift_sint8(d, i_2)] = Mchar_0[shift_sint8(s, i_2)]))).
   (* Invariant 'no_eva' *)
-  Have: (0 <= i) /\ (i < n).
+  Have: forall i_2 : Z. let a_5 = shift_sint8(s, i_2) in ((i_2 <= i) ->
+      ((0 <= i_2) -> (a_1[a_5] = Mchar_0[a_5]))).
   (* Then *)
   Have: 0 < i.
+  (* Invariant 'no_eva' *)
+  Have: x < n.
+  (* Invariant 'no_eva' *)
+  Have: forall i_2 : Z. ((i_2 < n) -> ((x < i_2) ->
+      (a_2[shift_sint8(d, i_2)] = Mchar_0[shift_sint8(s, i_2)]))).
 }
-Prove: a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]][a_3] = Mchar_0[a_3].
+Prove: a_2[a_4] = Mchar_0[a_4].
 
 ------------------------------------------------------------
 
@@ -609,43 +693,55 @@ Prove: true.
 
 Goal Loop assigns (file FRAMAC_SHARE/libc/string.c, line 98) (3/3):
 Effect at line 102
+Let x = to_uint64(1 + i).
 Let a = shift_sint8(d, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
-Let a_2 = shift_sint8(src_0, 0).
-Let a_3 = shift_sint8(d, i).
+Let a_2 = shift_sint8(d, i).
+Let a_3 = a_1[a_2 <- a_1[shift_sint8(s, i)]].
+Let a_4 = shift_sint8(s, 0).
 Assume {
   Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
-  Type: (region(d.base) <= 0) /\ (region(src_0.base) <= 0) /\
-      linked(Malloc_0) /\ sconst(Mchar_0).
+  Type: (region(d.base) <= 0) /\ (region(s.base) <= 0) /\ linked(Malloc_0) /\
+      sconst(Mchar_0).
   (* Goal *)
-  When: !invalid(Malloc_0, a_3, 1).
+  When: !invalid(Malloc_0, a_2, 1).
   (* Pre-condition 'valid_dest' *)
   Have: P_valid_or_empty(Malloc_0, d, n).
   (* Pre-condition 'valid_src' *)
-  Have: P_valid_read_or_empty(Malloc_0, src_0, n).
+  Have: P_valid_read_or_empty(Malloc_0, s, n).
   (* Else *)
   Have: n != 0.
   (* Call 'memoverlap' *)
-  Have: ((separated(a, n, a_2, n) -> (memoverlap_0 = 0))) /\
-      ((addr_le(d, src_0) -> (addr_lt(src_0, shift_sint8(d, n)) ->
-       ((!separated(a, n, a_2, n)) -> (memoverlap_0 = (-1)))))) /\
-      ((addr_lt(src_0, d) -> (addr_le(d, shift_sint8(src_0, n)) ->
-       ((!separated(a, n, a_2, n)) -> (memoverlap_0 = 1))))).
+  Have: ((separated(a, n, a_4, n) -> (memoverlap_0 = 0))) /\
+      ((addr_le(d, s) -> (addr_lt(s, shift_sint8(d, n)) ->
+       ((!separated(a, n, a_4, n)) -> (memoverlap_0 = (-1)))))) /\
+      ((addr_lt(s, d) -> (addr_le(d, shift_sint8(s, n)) ->
+       ((!separated(a, n, a_4, n)) -> (memoverlap_0 = 1))))).
   (* Then *)
   Have: memoverlap_0 <= 0.
   (* Invariant 'no_eva' *)
-  Have: forall i_1 : Z. let a_4 = shift_sint8(src_0, i_1) in ((i <= i_1) ->
-      ((i_1 < n) -> (a_1[a_4] = Mchar_0[a_4]))).
+  Have: 0 <= n.
+  (* Invariant 'no_eva' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'no_eva' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_1[shift_sint8(d, i_1)] = Mchar_0[shift_sint8(src_0, i_1)]))).
+      (a_1[shift_sint8(d, i_1)] = Mchar_0[shift_sint8(s, i_1)]))).
   (* Invariant 'no_eva' *)
-  Have: (0 <= i) /\ (i <= n).
+  Have: forall i_1 : Z. let a_5 = shift_sint8(s, i_1) in ((i <= i_1) ->
+      ((i_1 < n) -> (a_1[a_5] = Mchar_0[a_5]))).
   (* Then *)
   Have: i < n.
+  (* Invariant 'no_eva' *)
+  Have: x <= n.
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < x) ->
+      (a_3[shift_sint8(d, i_1)] = Mchar_0[shift_sint8(s, i_1)]))).
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. let a_5 = shift_sint8(s, i_1) in ((i_1 < n) ->
+      ((x <= i_1) -> (a_3[a_5] = Mchar_0[a_5]))).
 }
-Prove: included(a_3, 1, a, n).
+Prove: included(a_2, 1, a, n).
 
 ------------------------------------------------------------
 
@@ -662,43 +758,59 @@ Prove: true.
 
 Goal Loop assigns (file FRAMAC_SHARE/libc/string.c, line 110) (3/3):
 Effect at line 114
+Let x = to_uint64(i - 1).
 Let a = shift_sint8(d, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
-Let a_2 = shift_sint8(src_0, 0).
-Let a_3 = shift_sint8(d, i).
+Let a_2 = shift_sint8(d, i).
+Let a_3 = a_1[a_2 <- a_1[shift_sint8(s, i)]].
+Let x_1 = to_uint64(n - 1).
+Let a_4 = shift_sint8(s, 0).
 Assume {
   Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
-  Type: (region(d.base) <= 0) /\ (region(src_0.base) <= 0) /\
-      linked(Malloc_0) /\ sconst(Mchar_0).
+  Type: (region(d.base) <= 0) /\ (region(s.base) <= 0) /\ linked(Malloc_0) /\
+      sconst(Mchar_0).
   (* Goal *)
-  When: !invalid(Malloc_0, a_3, 1).
+  When: !invalid(Malloc_0, a_2, 1).
   (* Pre-condition 'valid_dest' *)
   Have: P_valid_or_empty(Malloc_0, d, n).
   (* Pre-condition 'valid_src' *)
-  Have: P_valid_read_or_empty(Malloc_0, src_0, n).
+  Have: P_valid_read_or_empty(Malloc_0, s, n).
   (* Else *)
   Have: n != 0.
   (* Call 'memoverlap' *)
-  Have: ((separated(a, n, a_2, n) -> (memoverlap_0 = 0))) /\
-      ((addr_le(d, src_0) -> (addr_lt(src_0, shift_sint8(d, n)) ->
-       ((!separated(a, n, a_2, n)) -> (memoverlap_0 = (-1)))))) /\
-      ((addr_lt(src_0, d) -> (addr_le(d, shift_sint8(src_0, n)) ->
-       ((!separated(a, n, a_2, n)) -> (memoverlap_0 = 1))))).
+  Have: ((separated(a, n, a_4, n) -> (memoverlap_0 = 0))) /\
+      ((addr_le(d, s) -> (addr_lt(s, shift_sint8(d, n)) ->
+       ((!separated(a, n, a_4, n)) -> (memoverlap_0 = (-1)))))) /\
+      ((addr_lt(s, d) -> (addr_le(d, shift_sint8(s, n)) ->
+       ((!separated(a, n, a_4, n)) -> (memoverlap_0 = 1))))).
   (* Else *)
   Have: 0 < memoverlap_0.
   (* Invariant 'no_eva' *)
-  Have: forall i_1 : Z. let a_4 = shift_sint8(src_0, i_1) in ((i_1 <= i) ->
-      ((0 <= i_1) -> (a_1[a_4] = Mchar_0[a_4]))).
+  Have: x_1 < n.
   (* Invariant 'no_eva' *)
-  Have: forall i_1 : Z. ((i < i_1) -> ((i_1 < n) ->
-      (a_1[shift_sint8(d, i_1)] = Mchar_0[shift_sint8(src_0, i_1)]))).
+  Have: forall i_1 : Z. ((i_1 < n) -> ((x_1 < i_1) ->
+      (Mchar_0[shift_sint8(s, i_1)] = Mchar_0[shift_sint8(d, i_1)]))).
   (* Invariant 'no_eva' *)
   Have: (0 <= i) /\ (i < n).
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. ((i < i_1) -> ((i_1 < n) ->
+      (a_1[shift_sint8(d, i_1)] = Mchar_0[shift_sint8(s, i_1)]))).
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. let a_5 = shift_sint8(s, i_1) in ((i_1 <= i) ->
+      ((0 <= i_1) -> (a_1[a_5] = Mchar_0[a_5]))).
   (* Then *)
   Have: 0 < i.
+  (* Invariant 'no_eva' *)
+  Have: x < n.
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. ((i_1 < n) -> ((x < i_1) ->
+      (a_3[shift_sint8(d, i_1)] = Mchar_0[shift_sint8(s, i_1)]))).
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. let a_5 = shift_sint8(s, i_1) in ((0 <= i_1) ->
+      ((i_1 <= x) -> (a_3[a_5] = Mchar_0[a_5]))).
 }
-Prove: included(a_3, 1, a, n).
+Prove: included(a_2, 1, a, n).
 
 ------------------------------------------------------------
 
@@ -740,6 +852,7 @@ Goal Assigns (file FRAMAC_SHARE/libc/string.h, line 122) in 'memmove' (6/7):
 Effect at line 115
 Let a = shift_sint8(d, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let x = to_uint64(n - 1).
 Let a_2 = shift_sint8(src_0, 0).
 Assume {
   Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
@@ -763,13 +876,18 @@ Assume {
   (* Else *)
   Have: 0 < memoverlap_0.
   (* Invariant 'no_eva' *)
-  Have: forall i_1 : Z. let a_3 = shift_sint8(src_0, i_1) in ((i_1 <= i) ->
-      ((0 <= i_1) -> (a_1[a_3] = Mchar_0[a_3]))).
+  Have: x < n.
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. ((i_1 < n) -> ((x < i_1) ->
+      (Mchar_0[shift_sint8(src_0, i_1)] = Mchar_0[shift_sint8(d, i_1)]))).
+  (* Invariant 'no_eva' *)
+  Have: (0 <= i) /\ (i < n).
   (* Invariant 'no_eva' *)
   Have: forall i_1 : Z. ((i < i_1) -> ((i_1 < n) ->
       (a_1[shift_sint8(d, i_1)] = Mchar_0[shift_sint8(src_0, i_1)]))).
   (* Invariant 'no_eva' *)
-  Have: (0 <= i) /\ (i < n).
+  Have: forall i_1 : Z. let a_3 = shift_sint8(src_0, i_1) in ((i_1 <= i) ->
+      ((0 <= i_1) -> (a_1[a_3] = Mchar_0[a_3]))).
   (* Else *)
   Have: i <= 0.
 }
@@ -784,40 +902,52 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file FRAMAC_SHARE/libc/string.c, line 101):
-Let a = shift_sint8(dest_0, 0).
+Let x = to_uint64(1 + i).
+Let a = shift_sint8(d, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
-Let a_2 = shift_sint8(src_0, 0).
+Let a_2 = a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]].
+Let a_3 = shift_sint8(s, 0).
 Assume {
   Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
-  Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
-      linked(Malloc_0) /\ sconst(Mchar_0).
+  Type: (region(d.base) <= 0) /\ (region(s.base) <= 0) /\ linked(Malloc_0) /\
+      sconst(Mchar_0).
   (* Pre-condition 'valid_dest' *)
-  Have: P_valid_or_empty(Malloc_0, dest_0, n).
+  Have: P_valid_or_empty(Malloc_0, d, n).
   (* Pre-condition 'valid_src' *)
-  Have: P_valid_read_or_empty(Malloc_0, src_0, n).
+  Have: P_valid_read_or_empty(Malloc_0, s, n).
   (* Else *)
   Have: n != 0.
   (* Call 'memoverlap' *)
-  Have: ((separated(a, n, a_2, n) -> (memoverlap_0 = 0))) /\
-      ((addr_le(dest_0, src_0) -> (addr_lt(src_0, shift_sint8(dest_0, n)) ->
-       ((!separated(a, n, a_2, n)) -> (memoverlap_0 = (-1)))))) /\
-      ((addr_lt(src_0, dest_0) -> (addr_le(dest_0, shift_sint8(src_0, n)) ->
-       ((!separated(a, n, a_2, n)) -> (memoverlap_0 = 1))))).
+  Have: ((separated(a, n, a_3, n) -> (memoverlap_0 = 0))) /\
+      ((addr_le(d, s) -> (addr_lt(s, shift_sint8(d, n)) ->
+       ((!separated(a, n, a_3, n)) -> (memoverlap_0 = (-1)))))) /\
+      ((addr_lt(s, d) -> (addr_le(d, shift_sint8(s, n)) ->
+       ((!separated(a, n, a_3, n)) -> (memoverlap_0 = 1))))).
   (* Then *)
   Have: memoverlap_0 <= 0.
   (* Invariant 'no_eva' *)
-  Have: forall i_1 : Z. let a_3 = shift_sint8(src_0, i_1) in ((i <= i_1) ->
-      ((i_1 < n) -> (a_1[a_3] = Mchar_0[a_3]))).
+  Have: 0 <= n.
+  (* Invariant 'no_eva' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'no_eva' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_1[shift_sint8(dest_0, i_1)] = Mchar_0[shift_sint8(src_0, i_1)]))).
+      (a_1[shift_sint8(d, i_1)] = Mchar_0[shift_sint8(s, i_1)]))).
   (* Invariant 'no_eva' *)
-  Have: (0 <= i) /\ (i <= n).
+  Have: forall i_1 : Z. let a_4 = shift_sint8(s, i_1) in ((i <= i_1) ->
+      ((i_1 < n) -> (a_1[a_4] = Mchar_0[a_4]))).
   (* Then *)
   Have: i < n.
+  (* Invariant 'no_eva' *)
+  Have: x <= n.
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < x) ->
+      (a_2[shift_sint8(d, i_1)] = Mchar_0[shift_sint8(s, i_1)]))).
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. let a_4 = shift_sint8(s, i_1) in ((i_1 < n) ->
+      ((x <= i_1) -> (a_2[a_4] = Mchar_0[a_4]))).
 }
-Prove: i < to_uint64(1 + i).
+Prove: i < x.
 
 ------------------------------------------------------------
 
@@ -827,40 +957,56 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file FRAMAC_SHARE/libc/string.c, line 113):
-Let a = shift_sint8(dest_0, 0).
+Let x = to_uint64(i - 1).
+Let a = shift_sint8(d, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
-Let a_2 = shift_sint8(src_0, 0).
+Let a_2 = a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]].
+Let x_1 = to_uint64(n - 1).
+Let a_3 = shift_sint8(s, 0).
 Assume {
   Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
-  Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
-      linked(Malloc_0) /\ sconst(Mchar_0).
+  Type: (region(d.base) <= 0) /\ (region(s.base) <= 0) /\ linked(Malloc_0) /\
+      sconst(Mchar_0).
   (* Pre-condition 'valid_dest' *)
-  Have: P_valid_or_empty(Malloc_0, dest_0, n).
+  Have: P_valid_or_empty(Malloc_0, d, n).
   (* Pre-condition 'valid_src' *)
-  Have: P_valid_read_or_empty(Malloc_0, src_0, n).
+  Have: P_valid_read_or_empty(Malloc_0, s, n).
   (* Else *)
   Have: n != 0.
   (* Call 'memoverlap' *)
-  Have: ((separated(a, n, a_2, n) -> (memoverlap_0 = 0))) /\
-      ((addr_le(dest_0, src_0) -> (addr_lt(src_0, shift_sint8(dest_0, n)) ->
-       ((!separated(a, n, a_2, n)) -> (memoverlap_0 = (-1)))))) /\
-      ((addr_lt(src_0, dest_0) -> (addr_le(dest_0, shift_sint8(src_0, n)) ->
-       ((!separated(a, n, a_2, n)) -> (memoverlap_0 = 1))))).
+  Have: ((separated(a, n, a_3, n) -> (memoverlap_0 = 0))) /\
+      ((addr_le(d, s) -> (addr_lt(s, shift_sint8(d, n)) ->
+       ((!separated(a, n, a_3, n)) -> (memoverlap_0 = (-1)))))) /\
+      ((addr_lt(s, d) -> (addr_le(d, shift_sint8(s, n)) ->
+       ((!separated(a, n, a_3, n)) -> (memoverlap_0 = 1))))).
   (* Else *)
   Have: 0 < memoverlap_0.
   (* Invariant 'no_eva' *)
-  Have: forall i_1 : Z. let a_3 = shift_sint8(src_0, i_1) in ((i_1 <= i) ->
-      ((0 <= i_1) -> (a_1[a_3] = Mchar_0[a_3]))).
+  Have: x_1 < n.
   (* Invariant 'no_eva' *)
-  Have: forall i_1 : Z. ((i < i_1) -> ((i_1 < n) ->
-      (a_1[shift_sint8(dest_0, i_1)] = Mchar_0[shift_sint8(src_0, i_1)]))).
+  Have: forall i_1 : Z. ((i_1 < n) -> ((x_1 < i_1) ->
+      (Mchar_0[shift_sint8(s, i_1)] = Mchar_0[shift_sint8(d, i_1)]))).
   (* Invariant 'no_eva' *)
   Have: (0 <= i) /\ (i < n).
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. ((i < i_1) -> ((i_1 < n) ->
+      (a_1[shift_sint8(d, i_1)] = Mchar_0[shift_sint8(s, i_1)]))).
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. let a_4 = shift_sint8(s, i_1) in ((i_1 <= i) ->
+      ((0 <= i_1) -> (a_1[a_4] = Mchar_0[a_4]))).
   (* Then *)
   Have: 0 < i.
+  (* Invariant 'no_eva' *)
+  Have: x < n.
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. ((i_1 < n) -> ((x < i_1) ->
+      (a_2[shift_sint8(d, i_1)] = Mchar_0[shift_sint8(s, i_1)]))).
+  (* Invariant 'no_eva' *)
+  Have: forall i_1 : Z. let a_4 = shift_sint8(s, i_1) in ((0 <= i_1) ->
+      ((i_1 <= x) -> (a_2[a_4] = Mchar_0[a_4]))).
 }
-Prove: to_uint64(i - 1) < i.
+Prove: x < i.
 
 ------------------------------------------------------------
 
diff --git a/src/plugins/wp/tests/wp_plugin/region_to_coq.script b/src/plugins/wp/tests/wp_plugin/region_to_coq.script
index 975ea9f72afde75a92fee1218e0788e4e3c6c0cc..ec805f70b549129917db4df73cf1b8a5a297c2f2 100644
--- a/src/plugins/wp/tests/wp_plugin/region_to_coq.script
+++ b/src/plugins/wp/tests/wp_plugin/region_to_coq.script
@@ -18,19 +18,19 @@ Qed.
 Goal typed_copy_loop_invariant_preserved.
 Hint copy,preserved.
 Proof.
-  intros.
-  assert (Hi_1: (1+i_1 <= i)%Z) by omega.
+  intros i n Li Ui Ln _ Hi Hn.
+  Require Import Lia.
+  assert (Hi_1: (1+i <= n)%Z) by lia.
   unfold is_uint32, to_uint32.
   unfold to_range.
-  intros.
   rewrite Z.add_0_l.
   repeat rewrite Z.sub_0_r.
-  unfold is_uint32 in H2.
-  assert (Bs: (1 + i_1 = 4294967296)%Z \/ (1 + i_1 < 4294967296)%Z) by omega.
-  inversion Bs.
-  - rewrite <- H4.
-    rewrite Z_mod_same ; omega.
-  - rewrite Z.mod_small ; omega.
+  unfold is_uint32 in Hi.
+  assert (Bs: (1 + i = 4294967296)%Z \/ (1 + i < 4294967296)%Z) by lia.
+  inversion_clear Bs as [ Eq | Lower ].
+  - rewrite <- Eq.
+    rewrite Z_mod_same ; lia.
+  - rewrite Z.mod_small ; lia.
 Qed.
 
 
diff --git a/src/plugins/wp/tests/wp_plugin/rte.i b/src/plugins/wp/tests/wp_plugin/rte.i
index f41d80662719bdfed9a22dd9405c62bee91a106a..026a1b040b06dfd07105fa177094d0693c399abd 100644
--- a/src/plugins/wp/tests/wp_plugin/rte.i
+++ b/src/plugins/wp/tests/wp_plugin/rte.i
@@ -1,5 +1,5 @@
 /* run.config
-   CMD: @frama-c@ -wp -wp-prover none -wp-share ./share -wp-msg-key shell,rte -wp-warn-key "pedantic-assigns=inactive"
+   CMD: @frama-c@ -wp -wp-prover none -wp-share @PTEST_SHARE_DIR@ -wp-msg-key shell,rte -wp-warn-key "pedantic-assigns=inactive"
    OPT: -wp-rte -no-warn-invalid-bool -then -print -no-unicode
    OPT: -wp-rte -no-warn-signed-overflow -then -print -no-unicode
    OPT: -wp-rte -warn-unsigned-overflow -then -print -no-unicode
diff --git a/src/plugins/wp/tests/wp_tip/clear.i b/src/plugins/wp/tests/wp_tip/clear.i
new file mode 100644
index 0000000000000000000000000000000000000000..6abddf24da825c3c378e921cb3f540f9b7b18a78
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/clear.i
@@ -0,0 +1,28 @@
+/* run.config
+   OPT: -wp-par 1 -wp-no-print -wp-prover qed,tip -wp-msg-key script -wp-session @PTEST_DIR@/oracle/@PTEST_NAME@.session
+*/
+/* run.config_qualif
+   DONTRUN:
+*/
+
+/*@ axiomatic X {
+      predicate P ;
+      predicate Q ;
+      predicate R ;
+      predicate S(integer i) ;
+    }
+*/
+
+int a = 42, b;
+
+/*@ requires P;
+  @ requires Q;
+  @ requires R;
+  @ ensures S(a+b); */
+void clear(void) {
+  if (a < b) {
+    a++;
+  } else {
+    b--;
+  }
+}
diff --git a/src/plugins/wp/tests/wp_tip/oracle/clear.res.oracle b/src/plugins/wp/tests/wp_tip/oracle/clear.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..08dbe46f1e28c74761624ee2a5425cf4f087a582
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle/clear.res.oracle
@@ -0,0 +1,118 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_tip/clear.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 1 goal scheduled
+[wp:script:allgoals] 
+  Goal Post-condition (file tests/wp_tip/clear.i, line 21) in 'clear':
+  Assume {
+    Type: is_sint32(a) /\ is_sint32(a_1) /\ is_sint32(a_2) /\ is_sint32(b) /\
+        is_sint32(b_1) /\ is_sint32(b_2).
+    (* Pre-condition *)
+    Have: P_P.
+    (* Pre-condition *)
+    Have: P_Q.
+    (* Pre-condition *)
+    Have: P_R.
+    If a_2 < b_2
+    Then { Have: (a_2 = a_1) /\ (b_2 = b). Have: (1 + a_1) = a. }
+    Else { Have: (a_2 = a) /\ (b_2 = b_1). Have: (1 + b) = b_1. }
+  }
+  Prove: P_S(a + b).
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_clear_ensures subgoal:
+  
+  Goal Wp.Tactical.typed_clear_ensures-0 (generated):
+  Assume {
+    Type: is_sint32(a) /\ is_sint32(a_1) /\ is_sint32(a_2) /\ is_sint32(b) /\
+        is_sint32(b_1) /\ is_sint32(b_2).
+    (* Pre-condition *)
+    Have: P_P.
+    (* Pre-condition *)
+    Have: P_Q.
+    (* Pre-condition *)
+    Have: P_R.
+    If a_2 < b_2
+    Then { Have: (a_2 = a_1) /\ (b_2 = b). }
+    Else { Have: (a_2 = a) /\ (b_2 = b_1). Have: (1 + b) = b_1. }
+  }
+  Prove: P_S(a + b).
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_clear_ensures subgoal:
+  
+  Goal Wp.Tactical.typed_clear_ensures-1 (generated):
+  Assume {
+    Type: is_sint32(a) /\ is_sint32(a_1) /\ is_sint32(a_2) /\ is_sint32(b) /\
+        is_sint32(b_1) /\ is_sint32(b_2).
+    (* Pre-condition *)
+    Have: P_P.
+    (* Pre-condition *)
+    Have: P_Q.
+    If a_2 < b_2
+    Then { Have: (a_2 = a_1) /\ (b_2 = b). }
+    Else { Have: (a_2 = a) /\ (b_2 = b_1). Have: (1 + b) = b_1. }
+  }
+  Prove: P_S(a + b).
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_clear_ensures subgoal:
+  
+  Goal Wp.Tactical.typed_clear_ensures-2 (generated):
+  Assume {
+    Type: is_sint32(a) /\ is_sint32(a_1) /\ is_sint32(a_2) /\ is_sint32(b) /\
+        is_sint32(b_1).
+    (* Pre-condition *)
+    Have: P_P.
+    (* Pre-condition *)
+    Have: P_Q.
+    If a_2 < b_1
+    Then { Have: (a_2 = a_1) /\ (b_1 = b). }
+  }
+  Prove: P_S(a + b).
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_clear_ensures subgoal:
+  
+  Goal Wp.Tactical.typed_clear_ensures-3 (generated):
+  Assume {
+    Type: is_sint32(a) /\ is_sint32(b).
+    (* Pre-condition *)
+    Have: P_P.
+    (* Pre-condition *)
+    Have: P_Q.
+  }
+  Prove: P_S(a + b).
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_clear_ensures subgoal:
+  
+  Goal Wp.Tactical.typed_clear_ensures-4 (generated):
+  Assume { Type: is_sint32(a) /\ is_sint32(b). (* Pre-condition *) Have: P_P. }
+  Prove: P_S(a + b).
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_clear_ensures subgoal:
+  
+  Goal Wp.Tactical.typed_clear_ensures-5 (generated):
+  Assume { (* Pre-condition *) Have: P_P. }
+  Prove: P_S(a + b).
+  
+  ------------------------------------------------------------
+[wp:script:allgoals] 
+  typed_clear_ensures subgoal:
+  
+  Goal Wp.Tactical.typed_clear_ensures-6 (generated):
+  Prove: P_S(a + b).
+  
+  ------------------------------------------------------------
+[wp] [Script] Goal typed_clear_ensures : Unsuccess
+[wp] Proved goals:    0 / 1
+[wp] No updated script.
diff --git a/src/plugins/wp/tests/wp_tip/oracle/clear.session/script/clear_ensures.json b/src/plugins/wp/tests/wp_tip/oracle/clear.session/script/clear_ensures.json
new file mode 100644
index 0000000000000000000000000000000000000000..64fc7f20266a326aa4eb3d30f70c61d94343fedc
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle/clear.session/script/clear_ensures.json
@@ -0,0 +1,67 @@
+[ { "header": "Clear", "tactic": "Wp.clear", "params": {},
+    "select": { "select": "clause-step", "at": 9, "kind": "have",
+                "target": "(1+a_1)=a_0", "pattern": "=+$a1$a" },
+    "children": { "Cleared hypothesis": [ { "header": "Clear",
+                                            "tactic": "Wp.clear",
+                                            "params": {},
+                                            "select": { "select": "clause-step",
+                                                        "at": 4,
+                                                        "kind": "have",
+                                                        "target": "P_R",
+                                                        "pattern": "P_R" },
+                                            "children": { "Cleared hypothesis": 
+                                                            [ { "header": "Clear",
+                                                                "tactic": "Wp.clear",
+                                                                "params": {},
+                                                                "select": 
+                                                                  { "select": "clause-step",
+                                                                    "at": 9,
+                                                                    "kind": "have",
+                                                                    "target": "(a_2=a_0) /\\ (b_2=b_1)",
+                                                                    "pattern": "&==$a$a$b$b" },
+                                                                "children": 
+                                                                  { "Cleared hypothesis": 
+                                                                    [ { "header": "Clear",
+                                                                    "tactic": "Wp.clear",
+                                                                    "params": {},
+                                                                    "select": 
+                                                                    { "select": "clause-step",
+                                                                    "at": 5,
+                                                                    "kind": "branch",
+                                                                    "target": "a_2<b_2",
+                                                                    "pattern": "<$a$b" },
+                                                                    "children": 
+                                                                    { "Cleared hypothesis": 
+                                                                    [ { "header": "Clear",
+                                                                    "tactic": "Wp.clear",
+                                                                    "params": {},
+                                                                    "select": 
+                                                                    { "select": "clause-step",
+                                                                    "at": 3,
+                                                                    "kind": "have",
+                                                                    "target": "P_Q",
+                                                                    "pattern": "P_Q" },
+                                                                    "children": 
+                                                                    { "Cleared hypothesis": 
+                                                                    [ { "header": "Clear",
+                                                                    "tactic": "Wp.clear",
+                                                                    "params": {},
+                                                                    "select": 
+                                                                    { "select": "clause-step",
+                                                                    "at": 0,
+                                                                    "kind": "type",
+                                                                    "target": "(is_sint32 a_0) /\\ (is_sint32 b_0)",
+                                                                    "pattern": "&is_sint32is_sint32$a$b" },
+                                                                    "children": 
+                                                                    { "Cleared hypothesis": 
+                                                                    [ { "header": "Clear",
+                                                                    "tactic": "Wp.clear",
+                                                                    "params": {},
+                                                                    "select": 
+                                                                    { "select": "clause-step",
+                                                                    "at": 1,
+                                                                    "kind": "have",
+                                                                    "target": "P_P",
+                                                                    "pattern": "P_P" },
+                                                                    "children": 
+                                                                    { "Cleared hypothesis": [] } } ] } } ] } } ] } } ] } } ] } } ] } } ]
diff --git a/src/plugins/wp/tests/wp_tip/split.i b/src/plugins/wp/tests/wp_tip/split.i
index 6aff2d20b8542b319d535c902053171c3ad83ed6..984bb90f40213dcc5bb5bdeaf54829475dc67f5e 100644
--- a/src/plugins/wp/tests/wp_tip/split.i
+++ b/src/plugins/wp/tests/wp_tip/split.i
@@ -1,5 +1,5 @@
 /* run.config
-   OPT: -wp-par 1 -wp-no-print -wp-prover qed,tip -wp-msg-key script -wp-session @PTEST_DIR@/oracle/@PTEST_NAME@.session
+   OPT: -wp-par 1 -wp-no-print -wp-prover qed,tip -wp-msg-key script -wp-session @PTEST_SUITE_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.session
 */
 /* run.config_qualif
    DONTRUN:
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle
index 22ca444e6a537298516bfc57f628ad0aaa4ab32c..3a2d8b0e8f0645ba40be2de76a0807021175621c 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle
@@ -21,13 +21,13 @@ Assume {
   When: (0 <= i_1) /\ (i_1 < n) /\ is_sint32(i_1).
   (* Pre-condition *)
   Have: valid_rw(Malloc_0, a_1, n).
-  (* Pre-condition *)
+  (* Invariant 'Range' *)
   Have: 0 <= n.
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'Partial' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       (havoc(Mint_undef_0, Mint_0, a_1, n)[shift_sint32(a, i_2)] = v))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= n).
   (* Else *)
   Have: n <= i.
 }
@@ -43,18 +43,20 @@ Assume {
   (* Heap *)
   Type: (region(a.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 <= i) /\ is_sint32(i_1).
+  When: (i_1 <= i) /\ (0 <= i_1) /\ is_sint32(i_1).
   (* Pre-condition *)
   Have: valid_rw(Malloc_0, a_1, n).
-  (* Pre-condition *)
+  (* Invariant 'Range' *)
   Have: 0 <= n.
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'Partial' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       (a_2[shift_sint32(a, i_2)] = v))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= n).
   (* Then *)
   Have: i < n.
+  (* Invariant 'Range' *)
+  Have: (-1) <= i.
 }
 Prove: a_2[shift_sint32(a, i) <- v][shift_sint32(a, i_1)] = v.
 
@@ -73,13 +75,13 @@ Assume {
   Type: (region(a.base) <= 0) /\ linked(Malloc_0).
   (* Pre-condition *)
   Have: valid_rw(Malloc_0, a_1, n).
-  (* Pre-condition *)
+  (* Invariant 'Range' *)
   Have: 0 <= n.
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'Partial' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       (havoc(Mint_undef_0, Mint_0, a_1, n)[shift_sint32(a, i_1)] = v))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= n).
   (* Then *)
   Have: i < n.
 }
@@ -106,26 +108,31 @@ Prove: true.
 Goal Loop assigns 'Zone' (3/3):
 Effect at line 20
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = shift_sint32(a, i).
+Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let x = i - 1.
+Let a_3 = shift_sint32(a, x).
 Assume {
-  Type: is_sint32(i) /\ is_sint32(n).
+  Type: is_sint32(i) /\ is_sint32(n) /\ is_sint32(x).
   (* Heap *)
   Type: (region(a.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
-  When: !invalid(Malloc_0, a_2, 1).
+  When: !invalid(Malloc_0, a_3, 1).
   (* Pre-condition *)
   Have: valid_rw(Malloc_0, a_1, n).
-  (* Pre-condition *)
+  (* Invariant 'Range' *)
   Have: 0 <= n.
-  (* Invariant 'Partial' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (havoc(Mint_undef_0, Mint_0, a_1, n)[shift_sint32(a, i_1)] = v))).
   (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= n).
+  Have: (0 < i) /\ (i <= (1 + n)).
+  (* Invariant 'Partial' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> (((2 + i_1) <= i) ->
+      (is_sint32(i_1) -> (a_2[shift_sint32(a, i_1)] = v)))).
   (* Then *)
-  Have: i < n.
+  Have: i <= n.
+  (* Invariant 'Partial' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_2[a_3 <- v][shift_sint32(a, i_1)] = v))).
 }
-Prove: included(a_2, 1, a_1, n).
+Prove: included(a_3, 1, a_1, n).
 
 ------------------------------------------------------------
 
@@ -153,10 +160,10 @@ Assume {
   Type: is_uint32(i_1).
   (* Goal *)
   When: (0 <= i) /\ (i <= 9).
-  (* Invariant 'Partial' *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) -> (t1_0[i_2] = v))).
   (* Invariant 'Range' *)
   Have: (0 <= i_1) /\ (i_1 <= 10).
+  (* Invariant 'Partial' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) -> (t1_0[i_2] = v))).
   (* Else *)
   Have: 10 <= i_1.
 }
@@ -165,16 +172,19 @@ Prove: t1_0[i] = v.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial' (file tests/wp_typed/user_init.i, line 32):
+Let x = to_uint32(1 + i).
 Assume {
   Type: is_uint32(i).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 < to_uint32(1 + i)).
-  (* Invariant 'Partial' *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) -> (t1_0[i_2] = v))).
+  When: (0 <= i_1) /\ (i_1 < x).
   (* Invariant 'Range' *)
   Have: (0 <= i) /\ (i <= 10).
+  (* Invariant 'Partial' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) -> (t1_0[i_2] = v))).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Range' *)
+  Have: x <= 10.
 }
 Prove: t1_0[i <- v][i_1] = v.
 
@@ -188,10 +198,10 @@ Prove: true.
 Goal Preservation of Invariant 'Range' (file tests/wp_typed/user_init.i, line 31):
 Assume {
   Type: is_uint32(i).
-  (* Invariant 'Partial' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> (t1_0[i_1] = v))).
   (* Invariant 'Range' *)
   Have: (0 <= i) /\ (i <= 10).
+  (* Invariant 'Partial' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> (t1_0[i_1] = v))).
   (* Then *)
   Have: i <= 9.
 }
@@ -222,16 +232,22 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 35):
+Let x = to_uint32(1 + i).
 Assume {
   Type: is_uint32(i).
-  (* Invariant 'Partial' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> (t1_0[i_1] = v))).
   (* Invariant 'Range' *)
   Have: (0 <= i) /\ (i <= 10).
+  (* Invariant 'Partial' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> (t1_0[i_1] = v))).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Range' *)
+  Have: x <= 10.
+  (* Invariant 'Partial' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < x) ->
+      (t1_0[i <- v][i_1] = v))).
 }
-Prove: i < to_uint32(1 + i).
+Prove: i < x.
 
 ------------------------------------------------------------
 
@@ -255,12 +271,12 @@ Assume {
         ((i_3 <= 19) ->
         (shift_sint32(shift_A20_sint32(a, i_4), i_3) != a_1)))))) ->
       (Mint_1[a_1] = Mint_0[a_1])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i_2) -> ((0 <= i_3) ->
       ((i_3 <= 19) ->
       (Mint_0[shift_sint32(shift_A20_sint32(a, i_4), i_3)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Else *)
   Have: 10 <= i_2.
 }
@@ -274,6 +290,7 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial' (file tests/wp_typed/user_init.i, line 136):
+Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
@@ -281,24 +298,26 @@ Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
-  When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < to_uint32(1 + i)) /\ (i_2 <= 19).
+  When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < x) /\ (i_2 <= 19).
   (* Loop assigns 'lack,Zone' *)
   Have: forall a_4 : addr.
       ((forall i_4,i_3 : Z. ((0 <= i_4) -> ((0 <= i_3) -> ((i_4 <= 9) ->
         ((i_3 <= 19) ->
         (shift_sint32(shift_A20_sint32(a, i_4), i_3) != a_4)))))) ->
       (Mint_1[a_4] = Mint_0[a_4])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) ->
       (Mint_0[shift_sint32(shift_A20_sint32(a, i_4), i_3)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Call 'init' *)
   Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) ->
       (a_3[shift_sint32(a_1, i_3)] = v))).
+  (* Invariant 'Range' *)
+  Have: x <= 10.
 }
 Prove: a_3[shift_sint32(shift_A20_sint32(a, i_1), i_2)] = Mint_undef_0[a_2].
 
@@ -320,12 +339,12 @@ Assume {
         ((i_1 <= 19) ->
         (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_2)))))) ->
       (Mint_0[a_2] = Mint_1[a_2])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) ->
       (Mint_1[shift_sint32(shift_A20_sint32(a, i_2), i_1)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Call 'init' *)
@@ -354,8 +373,11 @@ Prove: true.
 
 Goal Loop assigns 'lack,Zone' (2/3):
 Effect at line 139
+Let x = to_uint32(1 + i_2).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i_2).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
 Assume {
   Type: is_uint32(i_2) /\ is_sint32(v).
   (* Goal *)
@@ -363,23 +385,28 @@ Assume {
       (0 <= i_1) /\ (i_3 <= 9) /\ (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19) /\
       (i_6 <= 19) /\ (i_1 <= 19).
   (* Loop assigns 'lack,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_4 : addr.
       ((forall i_8,i_7 : Z. ((0 <= i_8) -> ((0 <= i_7) -> ((i_8 <= 9) ->
         ((i_7 <= 19) ->
-        (shift_sint32(shift_A20_sint32(a, i_8), i_7) != a_2)))))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_8), i_7) != a_4)))))) ->
+      (Mint_0[a_4] = Mint_1[a_4])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((i_8 < i_2) -> ((0 <= i_7) ->
       ((i_7 <= 19) ->
       (Mint_1[shift_sint32(shift_A20_sint32(a, i_8), i_7)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
   (* Call 'init' *)
   Have: forall i_7 : Z. ((0 <= i_7) -> ((i_7 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_7)] = v))).
+      (a_3[shift_sint32(a_1, i_7)] = v))).
+  (* Invariant 'Range' *)
+  Have: x <= 10.
+  (* Invariant 'Partial' *)
+  Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((0 <= i_7) -> ((i_8 < x) ->
+      ((i_7 <= 19) ->
+      (a_3[shift_sint32(shift_A20_sint32(a, i_8), i_7)] = Mint_undef_0[a_2]))))).
 }
 Prove: exists i_8,i_7 : Z. (i_8 <= i) /\ (i_7 <= i_1) /\ (0 <= i_8) /\
     (i <= i_8) /\ (0 <= i_7) /\ (i_1 <= i_7) /\ (i_8 <= 9) /\ (i_7 <= 19).
@@ -388,28 +415,36 @@ Prove: exists i_8,i_7 : Z. (i_8 <= i) /\ (i_7 <= i_1) /\ (0 <= i_8) /\
 
 Goal Loop assigns 'lack,Zone' (3/3):
 Call Effect at line 140
+Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
   When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19).
   (* Loop assigns 'lack,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_4 : addr.
       ((forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 <= 9) ->
         ((i_2 <= 19) ->
-        (shift_sint32(shift_A20_sint32(a, i_3), i_2) != a_2)))))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_3), i_2) != a_4)))))) ->
+      (Mint_0[a_4] = Mint_1[a_4])).
+  (* Invariant 'Range' *)
+  Have: i <= 10.
   (* Invariant 'Partial' *)
   Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) ->
       ((i_2 <= 19) ->
       (Mint_1[shift_sint32(shift_A20_sint32(a, i_3), i_2)] = v))))).
-  (* Invariant 'Range' *)
-  Have: i <= 10.
   (* Call 'init' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_2)] = v))).
+      (a_3[shift_sint32(a_1, i_2)] = v))).
+  (* Invariant 'Range' *)
+  Have: x <= 10.
+  (* Invariant 'Partial' *)
+  Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 < x) ->
+      ((i_2 <= 19) ->
+      (a_3[shift_sint32(shift_A20_sint32(a, i_3), i_2)] = Mint_undef_0[a_2]))))).
 }
 Prove: exists i_3,i_2 : Z. (i_3 <= i) /\ (i_2 <= i_1) /\ (0 <= i_3) /\
     (i <= i_3) /\ (0 <= i_2) /\ (i_1 <= i_2) /\ (i_3 <= 9) /\ (i_2 <= 19).
@@ -483,30 +518,38 @@ Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 139):
+Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'lack,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_4 : addr.
       ((forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
         ((i_1 <= 19) ->
-        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_2)))))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_4)))))) ->
+      (Mint_0[a_4] = Mint_1[a_4])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) ->
       (Mint_1[shift_sint32(shift_A20_sint32(a, i_2), i_1)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Call 'init' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_1)] = v))).
+      (a_3[shift_sint32(a_1, i_1)] = v))).
+  (* Invariant 'Range' *)
+  Have: x <= 10.
+  (* Invariant 'Partial' *)
+  Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 < x) ->
+      ((i_1 <= 19) ->
+      (a_3[shift_sint32(shift_A20_sint32(a, i_2), i_1)] = Mint_undef_0[a_2]))))).
 }
-Prove: i < to_uint32(1 + i).
+Prove: i < x.
 
 ------------------------------------------------------------
 
@@ -541,12 +584,12 @@ Assume {
       ((forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 <= 9) ->
         (shift_sint32(shift_A20_sint32(a, i_4), i_3) != a_1)))) ->
       (Mint_1[a_1] = Mint_0[a_1])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i_2) -> ((0 <= i_3) ->
       ((i_3 <= 19) ->
       (Mint_0[shift_sint32(shift_A20_sint32(a, i_4), i_3)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Else *)
   Have: 10 <= i_2.
 }
@@ -560,6 +603,7 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial' (file tests/wp_typed/user_init.i, line 154):
+Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
@@ -567,23 +611,25 @@ Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
-  When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < to_uint32(1 + i)) /\ (i_2 <= 19).
+  When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < x) /\ (i_2 <= 19).
   (* Loop assigns 'tactic,Zone' *)
   Have: forall a_4 : addr.
       ((forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 <= 9) ->
         (shift_sint32(shift_A20_sint32(a, i_4), i_3) != a_4)))) ->
       (Mint_1[a_4] = Mint_0[a_4])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) ->
       (Mint_0[shift_sint32(shift_A20_sint32(a, i_4), i_3)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Call 'init' *)
   Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) ->
       (a_3[shift_sint32(a_1, i_3)] = v))).
+  (* Invariant 'Range' *)
+  Have: x <= 10.
 }
 Prove: a_3[shift_sint32(shift_A20_sint32(a, i_1), i_2)] = Mint_undef_0[a_2].
 
@@ -604,12 +650,12 @@ Assume {
       ((forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 <= 9) ->
         (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_2)))) ->
       (Mint_0[a_2] = Mint_1[a_2])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) ->
       (Mint_1[shift_sint32(shift_A20_sint32(a, i_2), i_1)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Call 'init' *)
@@ -638,30 +684,38 @@ Prove: true.
 
 Goal Loop assigns 'tactic,Zone' (2/3):
 Effect at line 157
+Let x = to_uint32(1 + i_2).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i_2).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
 Assume {
   Type: is_uint32(i_2) /\ is_sint32(v).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\
       (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19).
   (* Loop assigns 'tactic,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_4 : addr.
       ((forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 <= 9) ->
-        (shift_sint32(shift_A20_sint32(a, i_7), i_6) != a_2)))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_7), i_6) != a_4)))) ->
+      (Mint_0[a_4] = Mint_1[a_4])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) ->
       ((i_6 <= 19) ->
       (Mint_1[shift_sint32(shift_A20_sint32(a, i_7), i_6)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
   (* Call 'init' *)
   Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_6)] = v))).
+      (a_3[shift_sint32(a_1, i_6)] = v))).
+  (* Invariant 'Range' *)
+  Have: x <= 10.
+  (* Invariant 'Partial' *)
+  Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 < x) ->
+      ((i_6 <= 19) ->
+      (a_3[shift_sint32(shift_A20_sint32(a, i_7), i_6)] = Mint_undef_0[a_2]))))).
 }
 Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
     (i <= i_7) /\ (i_1 <= i_6) /\ (i_7 <= 9).
@@ -670,27 +724,35 @@ Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
 
 Goal Loop assigns 'tactic,Zone' (3/3):
 Call Effect at line 158
+Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
   When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19).
   (* Loop assigns 'tactic,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_4 : addr.
       ((forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 <= 9) ->
-        (shift_sint32(shift_A20_sint32(a, i_3), i_2) != a_2)))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_3), i_2) != a_4)))) ->
+      (Mint_0[a_4] = Mint_1[a_4])).
+  (* Invariant 'Range' *)
+  Have: i <= 10.
   (* Invariant 'Partial' *)
   Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) ->
       ((i_2 <= 19) ->
       (Mint_1[shift_sint32(shift_A20_sint32(a, i_3), i_2)] = v))))).
-  (* Invariant 'Range' *)
-  Have: i <= 10.
   (* Call 'init' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_2)] = v))).
+      (a_3[shift_sint32(a_1, i_2)] = v))).
+  (* Invariant 'Range' *)
+  Have: x <= 10.
+  (* Invariant 'Partial' *)
+  Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 < x) ->
+      ((i_2 <= 19) ->
+      (a_3[shift_sint32(shift_A20_sint32(a, i_3), i_2)] = Mint_undef_0[a_2]))))).
 }
 Prove: exists i_3,i_2 : Z. (i_3 <= i) /\ (i_2 <= i_1) /\ (0 <= i_3) /\
     (i <= i_3) /\ (i_1 <= i_2) /\ (i_3 <= 9).
@@ -758,29 +820,37 @@ Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 157):
+Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'tactic,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_4 : addr.
       ((forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 <= 9) ->
-        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_2)))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_4)))) ->
+      (Mint_0[a_4] = Mint_1[a_4])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) ->
       (Mint_1[shift_sint32(shift_A20_sint32(a, i_2), i_1)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Call 'init' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_1)] = v))).
+      (a_3[shift_sint32(a_1, i_1)] = v))).
+  (* Invariant 'Range' *)
+  Have: x <= 10.
+  (* Invariant 'Partial' *)
+  Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 < x) ->
+      ((i_1 <= 19) ->
+      (a_3[shift_sint32(shift_A20_sint32(a, i_2), i_1)] = Mint_undef_0[a_2]))))).
 }
-Prove: i < to_uint32(1 + i).
+Prove: i < x.
 
 ------------------------------------------------------------
 
@@ -824,23 +894,24 @@ Prove: t2_0[i][i_1] = v.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial_i' (file tests/wp_typed/user_init.i, line 48):
+Let x = to_uint32(1 + i).
 Let m = t2_0[i].
 Assume {
   Type: is_uint32(i).
   (* Heap *)
   Type: IsArray_d2_sint32(t2_1).
   (* Goal *)
-  When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < to_uint32(1 + i)) /\ (i_2 <= 19).
+  When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < x) /\ (i_2 <= 19).
   (* Loop assigns 'lack,Zone_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((0 <= i_3) -> ((i_4 <= 9) ->
       ((i_3 <= 19) ->
       (((i_4 < 0) \/ (i_3 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) ->
       (t2_1[i_4][i_3] = t2_2[i_4][i_3])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) -> (t2_2[i_4][i_3] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Loop assigns 'lack,Zone_j' *)
@@ -848,11 +919,13 @@ Assume {
       ((i_3 <= 19) ->
       (((i_4 < 0) \/ (i_3 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) ->
       (t2_2[i_4][i_3] = t2_0[i_4][i_3])))))).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (m[i_3] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) -> (t2_2[i_4][i_3] = t2_0[i_4][i_3]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (m[i_3] = v))).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
 }
 Prove: m[0] = t2_0[i_1][i_2].
 
@@ -873,11 +946,11 @@ Assume {
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Loop assigns 'lack,Zone_j' *)
@@ -885,11 +958,11 @@ Assume {
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_2[i][i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_2[i][i_1] = v))).
 }
 Prove: to_uint32(1 + i) <= 10.
 
@@ -901,23 +974,24 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial_j' (file tests/wp_typed/user_init.i, line 54):
+Let x = to_uint32(1 + j).
 Let m = t2_0[i].
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
   Type: IsArray_d2_sint32(t2_1).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 < to_uint32(1 + j)).
+  When: (0 <= i_1) /\ (i_1 < x).
   (* Loop assigns 'lack,Zone_i' *)
   Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 <= 9) ->
       ((i_2 <= 19) ->
       (((i_3 < 0) \/ (i_2 < 0) \/ (10 <= i_3) \/ (20 <= i_2)) ->
       (t2_1[i_3][i_2] = t2_2[i_3][i_2])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) ->
       ((i_2 <= 19) -> (t2_2[i_3][i_2] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Loop assigns 'lack,Zone_j' *)
@@ -925,15 +999,17 @@ Assume {
       ((i_2 <= 19) ->
       (((i_3 < 0) \/ (i_2 < 0) \/ (10 <= i_3) \/ (20 <= i_2)) ->
       (t2_0[i_3][i_2] = t2_2[i_3][i_2])))))).
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < j) -> (m[i_2] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) ->
       ((i_2 <= 19) -> (t2_0[i_3][i_2] = t2_2[i_3][i_2]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < j) -> (m[i_2] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
 }
 Prove: m[j <- v][i_1] = v.
 
@@ -945,7 +1021,9 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Previous_i' (file tests/wp_typed/user_init.i, line 55):
+Let x = to_uint32(1 + j).
 Let m = t2_0[i].
+Let m_1 = m[j <- v].
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
@@ -957,11 +1035,11 @@ Assume {
       ((i_3 <= 19) ->
       (((i_4 < 0) \/ (i_3 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) ->
       (t2_2[i_4][i_3] = t2_1[i_4][i_3])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Loop assigns 'lack,Zone_j' *)
@@ -969,17 +1047,21 @@ Assume {
       ((i_3 <= 19) ->
       (((i_4 < 0) \/ (i_3 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) ->
       (t2_0[i_4][i_3] = t2_1[i_4][i_3])))))).
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < j) -> (m[i_3] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) -> (t2_0[i_4][i_3] = t2_1[i_4][i_3]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < j) -> (m[i_3] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < x) -> (m_1[i_3] = v))).
 }
-Prove: t2_0[i <- m[j <- v]][i_1][i_2] = t2_1[i_1][i_2].
+Prove: t2_0[i <- m_1][i_1][i_2] = t2_1[i_1][i_2].
 
 ------------------------------------------------------------
 
@@ -998,11 +1080,11 @@ Assume {
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Loop assigns 'lack,Zone_j' *)
@@ -1010,13 +1092,13 @@ Assume {
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
 }
@@ -1046,6 +1128,8 @@ Prove: true.
 
 Goal Loop assigns 'lack,Zone_i' (2/3):
 Effect at line 51
+Let x = to_uint32(1 + i_2).
+Let m = t2_2[i_2].
 Assume {
   Type: is_uint32(i_2).
   (* Heap *)
@@ -1059,24 +1143,28 @@ Assume {
       ((i_7 <= 19) ->
       (((i_8 < 0) \/ (i_7 < 0) \/ (10 <= i_8) \/ (20 <= i_7)) ->
       (t2_0[i_8][i_7] = t2_1[i_8][i_7])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((i_8 < i_2) -> ((0 <= i_7) ->
       ((i_7 <= 19) -> (t2_1[i_8][i_7] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
   (* Loop assigns 'lack,Zone_j' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((0 <= i_7) -> ((i_8 <= 9) ->
       ((i_7 <= 19) ->
       (((i_8 < 0) \/ (i_7 < 0) \/ (10 <= i_8) \/ (20 <= i_7)) ->
-      (t2_2[i_8][i_7] = t2_1[i_8][i_7])))))).
+      (t2_1[i_8][i_7] = t2_2[i_8][i_7])))))).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_7 : Z. ((0 <= i_7) -> ((i_7 <= 19) -> (m[i_7] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((i_8 < i_2) -> ((0 <= i_7) ->
-      ((i_7 <= 19) -> (t2_2[i_8][i_7] = t2_1[i_8][i_7]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_7 : Z. ((0 <= i_7) -> ((i_7 <= 19) ->
-      (t2_2[i_2][i_7] = v))).
+      ((i_7 <= 19) -> (t2_1[i_8][i_7] = t2_2[i_8][i_7]))))).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((0 <= i_7) -> ((i_8 < x) ->
+      ((i_7 <= 19) -> (t2_2[i_8][i_7] = m[0]))))).
 }
 Prove: exists i_8,i_7 : Z. (i_8 <= i) /\ (i_7 <= i_1) /\ (0 <= i_8) /\
     (i <= i_8) /\ (0 <= i_7) /\ (i_1 <= i_7) /\ (i_8 <= 9) /\ (i_7 <= 19).
@@ -1085,6 +1173,8 @@ Prove: exists i_8,i_7 : Z. (i_8 <= i) /\ (i_7 <= i_1) /\ (0 <= i_8) /\
 
 Goal Loop assigns 'lack,Zone_i' (3/3):
 Effect at line 58
+Let x = to_uint32(1 + i_2).
+Let m = t2_2[i_2].
 Assume {
   Type: is_uint32(i_2).
   (* Heap *)
@@ -1098,24 +1188,28 @@ Assume {
       ((i_7 <= 19) ->
       (((i_8 < 0) \/ (i_7 < 0) \/ (10 <= i_8) \/ (20 <= i_7)) ->
       (t2_0[i_8][i_7] = t2_1[i_8][i_7])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((i_8 < i_2) -> ((0 <= i_7) ->
       ((i_7 <= 19) -> (t2_1[i_8][i_7] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
   (* Loop assigns 'lack,Zone_j' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((0 <= i_7) -> ((i_8 <= 9) ->
       ((i_7 <= 19) ->
       (((i_8 < 0) \/ (i_7 < 0) \/ (10 <= i_8) \/ (20 <= i_7)) ->
-      (t2_2[i_8][i_7] = t2_1[i_8][i_7])))))).
+      (t2_1[i_8][i_7] = t2_2[i_8][i_7])))))).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_7 : Z. ((0 <= i_7) -> ((i_7 <= 19) -> (m[i_7] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((i_8 < i_2) -> ((0 <= i_7) ->
-      ((i_7 <= 19) -> (t2_2[i_8][i_7] = t2_1[i_8][i_7]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_7 : Z. ((0 <= i_7) -> ((i_7 <= 19) ->
-      (t2_2[i_2][i_7] = v))).
+      ((i_7 <= 19) -> (t2_1[i_8][i_7] = t2_2[i_8][i_7]))))).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((0 <= i_7) -> ((i_8 < x) ->
+      ((i_7 <= 19) -> (t2_2[i_8][i_7] = m[0]))))).
 }
 Prove: exists i_8,i_7 : Z. (i_8 <= i) /\ (i_7 <= i_1) /\ (0 <= i_8) /\
     (i <= i_8) /\ (0 <= i_7) /\ (i_1 <= i_7) /\ (i_8 <= 9) /\ (i_7 <= 19).
@@ -1129,6 +1223,9 @@ Prove: true.
 
 Goal Loop assigns 'lack,Zone_j' (2/3):
 Effect at line 58
+Let m = t2_2[i_2].
+Let m_1 = m[j <- v].
+Let x = to_uint32(1 + j).
 Assume {
   Type: is_uint32(i_2) /\ is_uint32(j).
   (* Heap *)
@@ -1142,11 +1239,11 @@ Assume {
       ((i_7 <= 19) ->
       (((i_8 < 0) \/ (i_7 < 0) \/ (10 <= i_8) \/ (20 <= i_7)) ->
       (t2_0[i_8][i_7] = t2_1[i_8][i_7])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((i_8 < i_2) -> ((0 <= i_7) ->
       ((i_7 <= 19) -> (t2_1[i_8][i_7] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
   (* Loop assigns 'lack,Zone_j' *)
@@ -1154,15 +1251,22 @@ Assume {
       ((i_7 <= 19) ->
       (((i_8 < 0) \/ (i_7 < 0) \/ (10 <= i_8) \/ (20 <= i_7)) ->
       (t2_2[i_8][i_7] = t2_1[i_8][i_7])))))).
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_7 : Z. ((0 <= i_7) -> ((i_7 < j) -> (m[i_7] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((i_8 < i_2) -> ((0 <= i_7) ->
       ((i_7 <= 19) -> (t2_2[i_8][i_7] = t2_1[i_8][i_7]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_7 : Z. ((0 <= i_7) -> ((i_7 < j) -> (t2_2[i_2][i_7] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_7 : Z. ((0 <= i_7) -> ((i_7 < x) -> (m_1[i_7] = v))).
+  (* Invariant 'Previous_i' *)
+  Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((i_8 < i_2) -> ((0 <= i_7) ->
+      ((i_7 <= 19) -> (t2_2[i_2 <- m_1][i_8][i_7] = t2_1[i_8][i_7]))))).
 }
 Prove: exists i_8,i_7 : Z. (i_8 <= i) /\ (i_7 <= i_1) /\ (0 <= i_8) /\
     (i <= i_8) /\ (0 <= i_7) /\ (i_1 <= i_7) /\ (i_8 <= 9) /\ (i_7 <= 19).
@@ -1171,6 +1275,9 @@ Prove: exists i_8,i_7 : Z. (i_8 <= i) /\ (i_7 <= i_1) /\ (0 <= i_8) /\
 
 Goal Loop assigns 'lack,Zone_j' (3/3):
 Effect at line 59
+Let m = t2_2[i].
+Let m_1 = m[j <- v].
+Let x = to_uint32(1 + j).
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
@@ -1182,23 +1289,30 @@ Assume {
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Range_i' *)
+  Have: i <= 10.
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: i <= 10.
   (* Loop assigns 'lack,Zone_j' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Range_j' *)
+  Have: j <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (m[i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))).
   (* Invariant 'Range_j' *)
-  Have: j <= 20.
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < x) -> (m_1[i_1] = v))).
+  (* Invariant 'Previous_i' *)
+  Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
+      ((i_1 <= 19) -> (t2_2[i <- m_1][i_2][i_1] = t2_1[i_2][i_1]))))).
 }
 Prove: exists i_2,i_1 : Z. (i_2 <= i) /\ (0 <= i_2) /\ (i <= i_2) /\
     (0 <= i_1) /\ (j <= i_1) /\ (i_1 <= j) /\ (i_2 <= 9) /\ (i_1 <= 19).
@@ -1236,6 +1350,8 @@ Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 51):
+Let x = to_uint32(1 + i).
+Let m = t2_2[i].
 Assume {
   Type: is_uint32(i).
   (* Heap *)
@@ -1245,25 +1361,30 @@ Assume {
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Loop assigns 'lack,Zone_j' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
-      (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))).
+      (t2_1[i_2][i_1] = t2_2[i_2][i_1])))))).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (m[i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
-      ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_2[i][i_1] = v))).
+      ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_2[i_2][i_1]))))).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 < x) ->
+      ((i_1 <= 19) -> (t2_2[i_2][i_1] = m[0]))))).
 }
-Prove: i < to_uint32(1 + i).
+Prove: i < x.
 
 ------------------------------------------------------------
 
@@ -1273,6 +1394,9 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 58):
+Let m = t2_2[i].
+Let m_1 = m[j <- v].
+Let x = to_uint32(1 + j).
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
@@ -1282,11 +1406,11 @@ Assume {
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Loop assigns 'lack,Zone_j' *)
@@ -1294,17 +1418,24 @@ Assume {
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (m[i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < x) -> (m_1[i_1] = v))).
+  (* Invariant 'Previous_i' *)
+  Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
+      ((i_1 <= 19) -> (t2_2[i <- m_1][i_2][i_1] = t2_1[i_2][i_1]))))).
 }
-Prove: j < to_uint32(1 + j).
+Prove: j < x.
 
 ------------------------------------------------------------
 
@@ -1329,23 +1460,26 @@ Prove: t2_0[i][i_1] = v.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial_i' (file tests/wp_typed/user_init.i, line 77):
+Let x = to_uint32(1 + i).
 Let m = t2_0[i].
 Assume {
   Type: is_uint32(i).
   (* Goal *)
-  When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < to_uint32(1 + i)) /\ (i_2 <= 19).
+  When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < x) /\ (i_2 <= 19).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (m[i_3] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) -> (t2_1[i_4][i_3] = t2_0[i_4][i_3]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (m[i_3] = v))).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
 }
 Prove: m[0] = t2_0[i_1][i_2].
 
@@ -1359,18 +1493,18 @@ Prove: true.
 Goal Preservation of Invariant 'Range_i' (file tests/wp_typed/user_init.i, line 76):
 Assume {
   Type: is_uint32(i).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_1[i][i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_1[i][i_1] = v))).
 }
 Prove: to_uint32(1 + i) <= 10.
 
@@ -1382,27 +1516,30 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial_j' (file tests/wp_typed/user_init.i, line 83):
+Let x = to_uint32(1 + j).
 Let m = t2_0[i].
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 < to_uint32(1 + j)).
+  When: (0 <= i_1) /\ (i_1 < x).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) ->
       ((i_2 <= 19) -> (t2_1[i_3][i_2] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < j) -> (m[i_2] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) ->
       ((i_2 <= 19) -> (t2_0[i_3][i_2] = t2_1[i_3][i_2]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < j) -> (m[i_2] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
 }
 Prove: m[j <- v][i_1] = v.
 
@@ -1414,29 +1551,35 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Previous_i' (file tests/wp_typed/user_init.i, line 84):
+Let x = to_uint32(1 + j).
 Let m = t2_0[i].
+Let m_1 = m[j <- v].
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 < i) /\ (0 <= i_2) /\ (i_2 <= 19).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < j) -> (m[i_3] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) -> (t2_0[i_4][i_3] = t2_1[i_4][i_3]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < j) -> (m[i_3] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < x) -> (m_1[i_3] = v))).
 }
-Prove: t2_0[i <- m[j <- v]][i_1][i_2] = t2_1[i_1][i_2].
+Prove: t2_0[i <- m_1][i_1][i_2] = t2_1[i_1][i_2].
 
 ------------------------------------------------------------
 
@@ -1448,20 +1591,20 @@ Prove: true.
 Goal Preservation of Invariant 'Range_j' (file tests/wp_typed/user_init.i, line 82):
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_1[i][i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_1[i][i_1] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
 }
@@ -1491,24 +1634,30 @@ Prove: true.
 
 Goal Loop assigns 'tactic,Zone_i' (2/3):
 Effect at line 80
+Let x = to_uint32(1 + i_2).
+Let m = t2_1[i_2].
 Assume {
   Type: is_uint32(i_2).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\
       (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) ->
       ((i_6 <= 19) -> (t2_0[i_7][i_6] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 19) -> (m[i_6] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) ->
-      ((i_6 <= 19) -> (t2_1[i_7][i_6] = t2_0[i_7][i_6]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 19) ->
-      (t2_1[i_2][i_6] = v))).
+      ((i_6 <= 19) -> (t2_0[i_7][i_6] = t2_1[i_7][i_6]))))).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 < x) ->
+      ((i_6 <= 19) -> (t2_1[i_7][i_6] = m[0]))))).
 }
 Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
     (i <= i_7) /\ (i_1 <= i_6) /\ (i_7 <= 9).
@@ -1517,24 +1666,30 @@ Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
 
 Goal Loop assigns 'tactic,Zone_i' (3/3):
 Effect at line 87
+Let x = to_uint32(1 + i_2).
+Let m = t2_1[i_2].
 Assume {
   Type: is_uint32(i_2).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\
       (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) ->
       ((i_6 <= 19) -> (t2_0[i_7][i_6] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 19) -> (m[i_6] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) ->
-      ((i_6 <= 19) -> (t2_1[i_7][i_6] = t2_0[i_7][i_6]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 19) ->
-      (t2_1[i_2][i_6] = v))).
+      ((i_6 <= 19) -> (t2_0[i_7][i_6] = t2_1[i_7][i_6]))))).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 < x) ->
+      ((i_6 <= 19) -> (t2_1[i_7][i_6] = m[0]))))).
 }
 Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
     (i <= i_7) /\ (i_1 <= i_6) /\ (i_7 <= 9).
@@ -1548,27 +1703,37 @@ Prove: true.
 
 Goal Loop assigns 'tactic,Zone_j' (2/3):
 Effect at line 87
+Let m = t2_1[i_2].
+Let m_1 = m[j <- v].
+Let x = to_uint32(1 + j).
 Assume {
   Type: is_uint32(i_2) /\ is_uint32(j).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\
       (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) ->
       ((i_6 <= 19) -> (t2_0[i_7][i_6] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 < j) -> (m[i_6] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) ->
       ((i_6 <= 19) -> (t2_1[i_7][i_6] = t2_0[i_7][i_6]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 < j) -> (t2_1[i_2][i_6] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 < x) -> (m_1[i_6] = v))).
+  (* Invariant 'Previous_i' *)
+  Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) ->
+      ((i_6 <= 19) -> (t2_1[i_2 <- m_1][i_7][i_6] = t2_0[i_7][i_6]))))).
 }
 Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
     (i <= i_7) /\ (i_1 <= i_6) /\ (i_7 <= 9).
@@ -1577,22 +1742,32 @@ Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
 
 Goal Loop assigns 'tactic,Zone_j' (3/3):
 Effect at line 88
+Let m = t2_1[i].
+Let m_1 = m[j <- v].
+Let x = to_uint32(1 + j).
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Goal *)
   When: (0 <= i) /\ (0 <= j) /\ (i <= 9) /\ (j <= 19).
+  (* Invariant 'Range_i' *)
+  Have: i <= 10.
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: i <= 10.
+  (* Invariant 'Range_j' *)
+  Have: j <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (m[i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_1[i][i_1] = v))).
   (* Invariant 'Range_j' *)
-  Have: j <= 20.
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < x) -> (m_1[i_1] = v))).
+  (* Invariant 'Previous_i' *)
+  Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
+      ((i_1 <= 19) -> (t2_1[i <- m_1][i_2][i_1] = t2_0[i_2][i_1]))))).
 }
 Prove: exists i_2,i_1 : Z. (i_2 <= i) /\ (0 <= i_2) /\ (i <= i_2) /\
     (j <= i_1) /\ (i_1 <= j) /\ (i_2 <= 9).
@@ -1621,22 +1796,29 @@ Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 80):
+Let x = to_uint32(1 + i).
+Let m = t2_1[i].
 Assume {
   Type: is_uint32(i).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (m[i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
-      ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_1[i][i_1] = v))).
+      ((i_1 <= 19) -> (t2_0[i_2][i_1] = t2_1[i_2][i_1]))))).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 < x) ->
+      ((i_1 <= 19) -> (t2_1[i_2][i_1] = m[0]))))).
 }
-Prove: i < to_uint32(1 + i).
+Prove: i < x.
 
 ------------------------------------------------------------
 
@@ -1646,26 +1828,36 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 87):
+Let m = t2_1[i].
+Let m_1 = m[j <- v].
+Let x = to_uint32(1 + j).
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (m[i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_1[i][i_1] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < x) -> (m_1[i_1] = v))).
+  (* Invariant 'Previous_i' *)
+  Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
+      ((i_1 <= 19) -> (t2_1[i <- m_1][i_2][i_1] = t2_0[i_2][i_1]))))).
 }
-Prove: j < to_uint32(1 + j).
+Prove: j < x.
 
 ------------------------------------------------------------
 
@@ -1691,20 +1883,26 @@ Prove: P_MemSet20(t2_0[i], 20, v).
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial_i' (file tests/wp_typed/user_init.i, line 108):
+Let x = to_uint32(1 + i).
+Let m = t2_0[i].
 Assume {
   Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
-      IsArray_sint32(t2_0[i]).
+      IsArray_sint32(m).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 < to_uint32(1 + i)).
+  When: (0 <= i_1) /\ (i_1 < x).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       P_MemSet20(t2_0[i_2], 20, v_1))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(m, 0, v_1).
+  (* Invariant 'Partial_j' *)
   Have: P_MemSet20(v, 20, v_1).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
 }
 Prove: P_MemSet20(t2_0[i <- v][i_1], 20, v_1).
 
@@ -1716,17 +1914,20 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Range_i' (file tests/wp_typed/user_init.i, line 107):
+Let m = t2_0[i].
 Assume {
   Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
-      IsArray_sint32(t2_0[i]).
+      IsArray_sint32(m).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(m, 0, v_1).
+  (* Invariant 'Partial_j' *)
   Have: P_MemSet20(v, 20, v_1).
 }
 Prove: to_uint32(1 + i) <= 10.
@@ -1739,25 +1940,31 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial_j' (file tests/wp_typed/user_init.i, line 114):
-Let m = v[j <- v_1].
+Let x = to_uint32(1 + j).
+Let m = t2_0[i].
+Let m_1 = v[j <- v_1].
 Assume {
   Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
-      is_sint32(v_1) /\ IsArray_sint32(t2_0[i]) /\ IsArray_sint32(m).
+      is_sint32(v_1) /\ IsArray_sint32(m) /\ IsArray_sint32(m_1).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Invariant 'Partial_j' *)
-  Have: P_MemSet20(v, j, v_1).
+  Have: P_MemSet20(m, 0, v_1).
   (* Invariant 'Range_j' *)
   Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(v, j, v_1).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
 }
-Prove: P_MemSet20(m, to_uint32(1 + j), v_1).
+Prove: P_MemSet20(m_1, x, v_1).
 
 ------------------------------------------------------------
 
@@ -1765,11 +1972,11 @@ Goal Establishment of Invariant 'Partial_j' (file tests/wp_typed/user_init.i, li
 Let m = t2_0[i].
 Assume {
   Type: is_uint32(i) /\ is_sint32(v) /\ IsArray_sint32(m).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
 }
@@ -1778,20 +1985,23 @@ Prove: P_MemSet20(m, 0, v).
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Range_j' (file tests/wp_typed/user_init.i, line 113):
+Let m = t2_0[i].
 Assume {
   Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
-      is_sint32(v_1) /\ IsArray_sint32(t2_0[i]).
+      is_sint32(v_1) /\ IsArray_sint32(m).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Invariant 'Partial_j' *)
-  Have: P_MemSet20(v, j, v_1).
+  Have: P_MemSet20(m, 0, v_1).
   (* Invariant 'Range_j' *)
   Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(v, j, v_1).
   (* Then *)
   Have: j <= 19.
 }
@@ -1821,21 +2031,30 @@ Prove: true.
 
 Goal Loop assigns 'tactic,Zone_i' (2/3):
 Effect at line 111
+Let x = to_uint32(1 + i_2).
+Let m = t2_0[i_2].
 Assume {
   Type: IsArray_sint32(v) /\ is_uint32(i_2) /\ is_sint32(v_1) /\
-      IsArray_sint32(t2_0[i_2]).
+      IsArray_sint32(m).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\
       (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 < i_2) ->
       P_MemSet20(t2_0[i_6], 20, v_1))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
   (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(m, 0, v_1).
+  (* Invariant 'Partial_j' *)
   Have: P_MemSet20(v, 20, v_1).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 < x) ->
+      P_MemSet20(t2_0[i_2 <- v][i_6], 20, v_1))).
 }
 Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
     (i <= i_7) /\ (i_1 <= i_6) /\ (i_7 <= 9).
@@ -1844,18 +2063,27 @@ Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
 
 Goal Loop assigns 'tactic,Zone_i' (3/3):
 Effect at line 117
+Let x = to_uint32(1 + i).
+Let m = t2_0[i].
 Assume {
   Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
-      IsArray_sint32(t2_0[i]).
+      IsArray_sint32(m).
   (* Goal *)
   When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19).
+  (* Invariant 'Range_i' *)
+  Have: i <= 10.
   (* Invariant 'Partial_i' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       P_MemSet20(t2_0[i_2], 20, v_1))).
-  (* Invariant 'Range_i' *)
-  Have: i <= 10.
+  (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(m, 0, v_1).
   (* Invariant 'Partial_j' *)
   Have: P_MemSet20(v, 20, v_1).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < x) ->
+      P_MemSet20(t2_0[i <- v][i_2], 20, v_1))).
 }
 Prove: exists i_3,i_2 : Z. (i_3 <= i) /\ (i_2 <= i_1) /\ (0 <= i_3) /\
     (i <= i_3) /\ (i_1 <= i_2) /\ (i_3 <= 9).
@@ -1895,20 +2123,29 @@ Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 111):
+Let x = to_uint32(1 + i).
+Let m = t2_0[i].
 Assume {
   Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
-      IsArray_sint32(t2_0[i]).
+      IsArray_sint32(m).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(m, 0, v_1).
+  (* Invariant 'Partial_j' *)
   Have: P_MemSet20(v, 20, v_1).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < x) ->
+      P_MemSet20(t2_0[i <- v][i_1], 20, v_1))).
 }
-Prove: i < to_uint32(1 + i).
+Prove: i < x.
 
 ------------------------------------------------------------
 
@@ -1918,24 +2155,33 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 117):
+Let m = v[j <- v_1].
+Let x = to_uint32(1 + j).
+Let m_1 = t2_0[i].
 Assume {
   Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
-      is_sint32(v_1) /\ IsArray_sint32(t2_0[i]).
+      is_sint32(v_1) /\ IsArray_sint32(m_1) /\ IsArray_sint32(m).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Invariant 'Partial_j' *)
-  Have: P_MemSet20(v, j, v_1).
+  Have: P_MemSet20(m_1, 0, v_1).
   (* Invariant 'Range_j' *)
   Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(v, j, v_1).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(m, x, v_1).
 }
-Prove: j < to_uint32(1 + j).
+Prove: j < x.
 
 ------------------------------------------------------------
 
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle
index e1a3e723628fe25622cc96dc7c7b8c5d6a5e0cfb..20aaf5bdedf2232ff1e19edbf757434971402be0 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle
@@ -21,13 +21,13 @@ Assume {
   When: (0 <= i_1) /\ (i_1 < n) /\ is_sint32(i_1).
   (* Pre-condition *)
   Have: valid_rw(Malloc_0, a_1, n).
-  (* Pre-condition *)
+  (* Invariant 'Range' *)
   Have: 0 <= n.
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'Partial' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       (havoc(Mint_undef_0, Mint_0, a_1, n)[shift_sint32(a, i_2)] = v))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= n).
   (* Else *)
   Have: n <= i.
 }
@@ -43,18 +43,20 @@ Assume {
   (* Heap *)
   Type: (region(a.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 <= i) /\ is_sint32(i_1).
+  When: (i_1 <= i) /\ (0 <= i_1) /\ is_sint32(i_1).
   (* Pre-condition *)
   Have: valid_rw(Malloc_0, a_1, n).
-  (* Pre-condition *)
+  (* Invariant 'Range' *)
   Have: 0 <= n.
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'Partial' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       (a_2[shift_sint32(a, i_2)] = v))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= n).
   (* Then *)
   Have: i < n.
+  (* Invariant 'Range' *)
+  Have: (-1) <= i.
 }
 Prove: a_2[shift_sint32(a, i) <- v][shift_sint32(a, i_1)] = v.
 
@@ -73,13 +75,13 @@ Assume {
   Type: (region(a.base) <= 0) /\ linked(Malloc_0).
   (* Pre-condition *)
   Have: valid_rw(Malloc_0, a_1, n).
-  (* Pre-condition *)
+  (* Invariant 'Range' *)
   Have: 0 <= n.
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= n).
   (* Invariant 'Partial' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       (havoc(Mint_undef_0, Mint_0, a_1, n)[shift_sint32(a, i_1)] = v))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= n).
   (* Then *)
   Have: i < n.
 }
@@ -106,26 +108,31 @@ Prove: true.
 Goal Loop assigns 'Zone' (3/3):
 Effect at line 20
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = shift_sint32(a, i).
+Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let x = i - 1.
+Let a_3 = shift_sint32(a, x).
 Assume {
-  Type: is_sint32(i) /\ is_sint32(n).
+  Type: is_sint32(i) /\ is_sint32(n) /\ is_sint32(x).
   (* Heap *)
   Type: (region(a.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
-  When: !invalid(Malloc_0, a_2, 1).
+  When: !invalid(Malloc_0, a_3, 1).
   (* Pre-condition *)
   Have: valid_rw(Malloc_0, a_1, n).
-  (* Pre-condition *)
+  (* Invariant 'Range' *)
   Have: 0 <= n.
-  (* Invariant 'Partial' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (havoc(Mint_undef_0, Mint_0, a_1, n)[shift_sint32(a, i_1)] = v))).
   (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= n).
+  Have: (0 < i) /\ (i <= (1 + n)).
+  (* Invariant 'Partial' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> (((2 + i_1) <= i) ->
+      (is_sint32(i_1) -> (a_2[shift_sint32(a, i_1)] = v)))).
   (* Then *)
-  Have: i < n.
+  Have: i <= n.
+  (* Invariant 'Partial' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_2[a_3 <- v][shift_sint32(a, i_1)] = v))).
 }
-Prove: included(a_2, 1, a_1, n).
+Prove: included(a_3, 1, a_1, n).
 
 ------------------------------------------------------------
 
@@ -153,10 +160,10 @@ Assume {
   Type: is_uint32(i_1).
   (* Goal *)
   When: (0 <= i) /\ (i <= 9).
-  (* Invariant 'Partial' *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) -> (t1_0[i_2] = v))).
   (* Invariant 'Range' *)
   Have: (0 <= i_1) /\ (i_1 <= 10).
+  (* Invariant 'Partial' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) -> (t1_0[i_2] = v))).
   (* Else *)
   Have: 10 <= i_1.
 }
@@ -165,16 +172,19 @@ Prove: t1_0[i] = v.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial' (file tests/wp_typed/user_init.i, line 32):
+Let x = to_uint32(1 + i).
 Assume {
   Type: is_uint32(i).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 < to_uint32(1 + i)).
-  (* Invariant 'Partial' *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) -> (t1_0[i_2] = v))).
+  When: (0 <= i_1) /\ (i_1 < x).
   (* Invariant 'Range' *)
   Have: (0 <= i) /\ (i <= 10).
+  (* Invariant 'Partial' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) -> (t1_0[i_2] = v))).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Range' *)
+  Have: x <= 10.
 }
 Prove: t1_0[i <- v][i_1] = v.
 
@@ -188,10 +198,10 @@ Prove: true.
 Goal Preservation of Invariant 'Range' (file tests/wp_typed/user_init.i, line 31):
 Assume {
   Type: is_uint32(i).
-  (* Invariant 'Partial' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> (t1_0[i_1] = v))).
   (* Invariant 'Range' *)
   Have: (0 <= i) /\ (i <= 10).
+  (* Invariant 'Partial' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> (t1_0[i_1] = v))).
   (* Then *)
   Have: i <= 9.
 }
@@ -222,16 +232,22 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 35):
+Let x = to_uint32(1 + i).
 Assume {
   Type: is_uint32(i).
-  (* Invariant 'Partial' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> (t1_0[i_1] = v))).
   (* Invariant 'Range' *)
   Have: (0 <= i) /\ (i <= 10).
+  (* Invariant 'Partial' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> (t1_0[i_1] = v))).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Range' *)
+  Have: x <= 10.
+  (* Invariant 'Partial' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < x) ->
+      (t1_0[i <- v][i_1] = v))).
 }
-Prove: i < to_uint32(1 + i).
+Prove: i < x.
 
 ------------------------------------------------------------
 
@@ -255,12 +271,12 @@ Assume {
         ((i_3 <= 19) ->
         (shift_sint32(shift_A20_sint32(a, i_4), i_3) != a_1)))))) ->
       (Mint_1[a_1] = Mint_0[a_1])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i_2) -> ((0 <= i_3) ->
       ((i_3 <= 19) ->
       (Mint_0[shift_sint32(shift_A20_sint32(a, i_4), i_3)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Else *)
   Have: 10 <= i_2.
 }
@@ -274,6 +290,7 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial' (file tests/wp_typed/user_init.i, line 136):
+Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
@@ -281,24 +298,26 @@ Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
-  When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < to_uint32(1 + i)) /\ (i_2 <= 19).
+  When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < x) /\ (i_2 <= 19).
   (* Loop assigns 'lack,Zone' *)
   Have: forall a_4 : addr.
       ((forall i_4,i_3 : Z. ((0 <= i_4) -> ((0 <= i_3) -> ((i_4 <= 9) ->
         ((i_3 <= 19) ->
         (shift_sint32(shift_A20_sint32(a, i_4), i_3) != a_4)))))) ->
       (Mint_1[a_4] = Mint_0[a_4])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) ->
       (Mint_0[shift_sint32(shift_A20_sint32(a, i_4), i_3)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Call 'init' *)
   Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) ->
       (a_3[shift_sint32(a_1, i_3)] = v))).
+  (* Invariant 'Range' *)
+  Have: x <= 10.
 }
 Prove: a_3[shift_sint32(shift_A20_sint32(a, i_1), i_2)] = Mint_undef_0[a_2].
 
@@ -320,12 +339,12 @@ Assume {
         ((i_1 <= 19) ->
         (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_2)))))) ->
       (Mint_0[a_2] = Mint_1[a_2])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) ->
       (Mint_1[shift_sint32(shift_A20_sint32(a, i_2), i_1)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Call 'init' *)
@@ -354,8 +373,11 @@ Prove: true.
 
 Goal Loop assigns 'lack,Zone' (2/3):
 Effect at line 139
+Let x = to_uint32(1 + i_2).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i_2).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
 Assume {
   Type: is_uint32(i_2) /\ is_sint32(v).
   (* Goal *)
@@ -363,23 +385,28 @@ Assume {
       (0 <= i_1) /\ (i_3 <= 9) /\ (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19) /\
       (i_6 <= 19) /\ (i_1 <= 19).
   (* Loop assigns 'lack,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_4 : addr.
       ((forall i_8,i_7 : Z. ((0 <= i_8) -> ((0 <= i_7) -> ((i_8 <= 9) ->
         ((i_7 <= 19) ->
-        (shift_sint32(shift_A20_sint32(a, i_8), i_7) != a_2)))))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_8), i_7) != a_4)))))) ->
+      (Mint_0[a_4] = Mint_1[a_4])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((i_8 < i_2) -> ((0 <= i_7) ->
       ((i_7 <= 19) ->
       (Mint_1[shift_sint32(shift_A20_sint32(a, i_8), i_7)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
   (* Call 'init' *)
   Have: forall i_7 : Z. ((0 <= i_7) -> ((i_7 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_7)] = v))).
+      (a_3[shift_sint32(a_1, i_7)] = v))).
+  (* Invariant 'Range' *)
+  Have: x <= 10.
+  (* Invariant 'Partial' *)
+  Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((0 <= i_7) -> ((i_8 < x) ->
+      ((i_7 <= 19) ->
+      (a_3[shift_sint32(shift_A20_sint32(a, i_8), i_7)] = Mint_undef_0[a_2]))))).
 }
 Prove: exists i_8,i_7 : Z. (i_8 <= i) /\ (i_7 <= i_1) /\ (0 <= i_8) /\
     (i <= i_8) /\ (0 <= i_7) /\ (i_1 <= i_7) /\ (i_8 <= 9) /\ (i_7 <= 19).
@@ -388,28 +415,36 @@ Prove: exists i_8,i_7 : Z. (i_8 <= i) /\ (i_7 <= i_1) /\ (0 <= i_8) /\
 
 Goal Loop assigns 'lack,Zone' (3/3):
 Call Effect at line 140
+Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
   When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19).
   (* Loop assigns 'lack,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_4 : addr.
       ((forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 <= 9) ->
         ((i_2 <= 19) ->
-        (shift_sint32(shift_A20_sint32(a, i_3), i_2) != a_2)))))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_3), i_2) != a_4)))))) ->
+      (Mint_0[a_4] = Mint_1[a_4])).
+  (* Invariant 'Range' *)
+  Have: i <= 10.
   (* Invariant 'Partial' *)
   Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) ->
       ((i_2 <= 19) ->
       (Mint_1[shift_sint32(shift_A20_sint32(a, i_3), i_2)] = v))))).
-  (* Invariant 'Range' *)
-  Have: i <= 10.
   (* Call 'init' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_2)] = v))).
+      (a_3[shift_sint32(a_1, i_2)] = v))).
+  (* Invariant 'Range' *)
+  Have: x <= 10.
+  (* Invariant 'Partial' *)
+  Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 < x) ->
+      ((i_2 <= 19) ->
+      (a_3[shift_sint32(shift_A20_sint32(a, i_3), i_2)] = Mint_undef_0[a_2]))))).
 }
 Prove: exists i_3,i_2 : Z. (i_3 <= i) /\ (i_2 <= i_1) /\ (0 <= i_3) /\
     (i <= i_3) /\ (0 <= i_2) /\ (i_1 <= i_2) /\ (i_3 <= 9) /\ (i_2 <= 19).
@@ -483,30 +518,38 @@ Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 139):
+Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'lack,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_4 : addr.
       ((forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
         ((i_1 <= 19) ->
-        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_2)))))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_4)))))) ->
+      (Mint_0[a_4] = Mint_1[a_4])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) ->
       (Mint_1[shift_sint32(shift_A20_sint32(a, i_2), i_1)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Call 'init' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_1)] = v))).
+      (a_3[shift_sint32(a_1, i_1)] = v))).
+  (* Invariant 'Range' *)
+  Have: x <= 10.
+  (* Invariant 'Partial' *)
+  Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 < x) ->
+      ((i_1 <= 19) ->
+      (a_3[shift_sint32(shift_A20_sint32(a, i_2), i_1)] = Mint_undef_0[a_2]))))).
 }
-Prove: i < to_uint32(1 + i).
+Prove: i < x.
 
 ------------------------------------------------------------
 
@@ -541,12 +584,12 @@ Assume {
       ((forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 <= 9) ->
         (shift_sint32(shift_A20_sint32(a, i_4), i_3) != a_1)))) ->
       (Mint_1[a_1] = Mint_0[a_1])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i_2) -> ((0 <= i_3) ->
       ((i_3 <= 19) ->
       (Mint_0[shift_sint32(shift_A20_sint32(a, i_4), i_3)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Else *)
   Have: 10 <= i_2.
 }
@@ -560,6 +603,7 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial' (file tests/wp_typed/user_init.i, line 154):
+Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
@@ -567,23 +611,25 @@ Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
-  When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < to_uint32(1 + i)) /\ (i_2 <= 19).
+  When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < x) /\ (i_2 <= 19).
   (* Loop assigns 'tactic,Zone' *)
   Have: forall a_4 : addr.
       ((forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 <= 9) ->
         (shift_sint32(shift_A20_sint32(a, i_4), i_3) != a_4)))) ->
       (Mint_1[a_4] = Mint_0[a_4])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) ->
       (Mint_0[shift_sint32(shift_A20_sint32(a, i_4), i_3)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Call 'init' *)
   Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) ->
       (a_3[shift_sint32(a_1, i_3)] = v))).
+  (* Invariant 'Range' *)
+  Have: x <= 10.
 }
 Prove: a_3[shift_sint32(shift_A20_sint32(a, i_1), i_2)] = Mint_undef_0[a_2].
 
@@ -604,12 +650,12 @@ Assume {
       ((forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 <= 9) ->
         (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_2)))) ->
       (Mint_0[a_2] = Mint_1[a_2])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) ->
       (Mint_1[shift_sint32(shift_A20_sint32(a, i_2), i_1)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Call 'init' *)
@@ -638,30 +684,38 @@ Prove: true.
 
 Goal Loop assigns 'tactic,Zone' (2/3):
 Effect at line 157
+Let x = to_uint32(1 + i_2).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i_2).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
 Assume {
   Type: is_uint32(i_2) /\ is_sint32(v).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\
       (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19).
   (* Loop assigns 'tactic,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_4 : addr.
       ((forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 <= 9) ->
-        (shift_sint32(shift_A20_sint32(a, i_7), i_6) != a_2)))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_7), i_6) != a_4)))) ->
+      (Mint_0[a_4] = Mint_1[a_4])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) ->
       ((i_6 <= 19) ->
       (Mint_1[shift_sint32(shift_A20_sint32(a, i_7), i_6)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
   (* Call 'init' *)
   Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_6)] = v))).
+      (a_3[shift_sint32(a_1, i_6)] = v))).
+  (* Invariant 'Range' *)
+  Have: x <= 10.
+  (* Invariant 'Partial' *)
+  Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 < x) ->
+      ((i_6 <= 19) ->
+      (a_3[shift_sint32(shift_A20_sint32(a, i_7), i_6)] = Mint_undef_0[a_2]))))).
 }
 Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
     (i <= i_7) /\ (i_1 <= i_6) /\ (i_7 <= 9).
@@ -670,27 +724,35 @@ Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
 
 Goal Loop assigns 'tactic,Zone' (3/3):
 Call Effect at line 158
+Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
   When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19).
   (* Loop assigns 'tactic,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_4 : addr.
       ((forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 <= 9) ->
-        (shift_sint32(shift_A20_sint32(a, i_3), i_2) != a_2)))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_3), i_2) != a_4)))) ->
+      (Mint_0[a_4] = Mint_1[a_4])).
+  (* Invariant 'Range' *)
+  Have: i <= 10.
   (* Invariant 'Partial' *)
   Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) ->
       ((i_2 <= 19) ->
       (Mint_1[shift_sint32(shift_A20_sint32(a, i_3), i_2)] = v))))).
-  (* Invariant 'Range' *)
-  Have: i <= 10.
   (* Call 'init' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_2)] = v))).
+      (a_3[shift_sint32(a_1, i_2)] = v))).
+  (* Invariant 'Range' *)
+  Have: x <= 10.
+  (* Invariant 'Partial' *)
+  Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 < x) ->
+      ((i_2 <= 19) ->
+      (a_3[shift_sint32(shift_A20_sint32(a, i_3), i_2)] = Mint_undef_0[a_2]))))).
 }
 Prove: exists i_3,i_2 : Z. (i_3 <= i) /\ (i_2 <= i_1) /\ (0 <= i_3) /\
     (i <= i_3) /\ (i_1 <= i_2) /\ (i_3 <= 9).
@@ -758,29 +820,37 @@ Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 157):
+Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'tactic,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_4 : addr.
       ((forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 <= 9) ->
-        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_2)))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_4)))) ->
+      (Mint_0[a_4] = Mint_1[a_4])).
+  (* Invariant 'Range' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) ->
       (Mint_1[shift_sint32(shift_A20_sint32(a, i_2), i_1)] = v))))).
-  (* Invariant 'Range' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Call 'init' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_1)] = v))).
+      (a_3[shift_sint32(a_1, i_1)] = v))).
+  (* Invariant 'Range' *)
+  Have: x <= 10.
+  (* Invariant 'Partial' *)
+  Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 < x) ->
+      ((i_1 <= 19) ->
+      (a_3[shift_sint32(shift_A20_sint32(a, i_2), i_1)] = Mint_undef_0[a_2]))))).
 }
-Prove: i < to_uint32(1 + i).
+Prove: i < x.
 
 ------------------------------------------------------------
 
@@ -824,23 +894,24 @@ Prove: t2_0[i][i_1] = v.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial_i' (file tests/wp_typed/user_init.i, line 48):
+Let x = to_uint32(1 + i).
 Let m = t2_0[i].
 Assume {
   Type: is_uint32(i).
   (* Heap *)
   Type: IsArray_d2_sint32(t2_1).
   (* Goal *)
-  When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < to_uint32(1 + i)) /\ (i_2 <= 19).
+  When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < x) /\ (i_2 <= 19).
   (* Loop assigns 'lack,Zone_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((0 <= i_3) -> ((i_4 <= 9) ->
       ((i_3 <= 19) ->
       (((i_4 < 0) \/ (i_3 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) ->
       (t2_1[i_4][i_3] = t2_2[i_4][i_3])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) -> (t2_2[i_4][i_3] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Loop assigns 'lack,Zone_j' *)
@@ -848,11 +919,13 @@ Assume {
       ((i_3 <= 19) ->
       (((i_4 < 0) \/ (i_3 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) ->
       (t2_2[i_4][i_3] = t2_0[i_4][i_3])))))).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (m[i_3] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) -> (t2_2[i_4][i_3] = t2_0[i_4][i_3]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (m[i_3] = v))).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
 }
 Prove: m[0] = t2_0[i_1][i_2].
 
@@ -873,11 +946,11 @@ Assume {
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Loop assigns 'lack,Zone_j' *)
@@ -885,11 +958,11 @@ Assume {
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_2[i][i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_2[i][i_1] = v))).
 }
 Prove: to_uint32(1 + i) <= 10.
 
@@ -901,23 +974,24 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial_j' (file tests/wp_typed/user_init.i, line 54):
+Let x = to_uint32(1 + j).
 Let m = t2_0[i].
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
   Type: IsArray_d2_sint32(t2_1).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 < to_uint32(1 + j)).
+  When: (0 <= i_1) /\ (i_1 < x).
   (* Loop assigns 'lack,Zone_i' *)
   Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 <= 9) ->
       ((i_2 <= 19) ->
       (((i_3 < 0) \/ (i_2 < 0) \/ (10 <= i_3) \/ (20 <= i_2)) ->
       (t2_1[i_3][i_2] = t2_2[i_3][i_2])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) ->
       ((i_2 <= 19) -> (t2_2[i_3][i_2] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Loop assigns 'lack,Zone_j' *)
@@ -925,15 +999,17 @@ Assume {
       ((i_2 <= 19) ->
       (((i_3 < 0) \/ (i_2 < 0) \/ (10 <= i_3) \/ (20 <= i_2)) ->
       (t2_0[i_3][i_2] = t2_2[i_3][i_2])))))).
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < j) -> (m[i_2] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) ->
       ((i_2 <= 19) -> (t2_0[i_3][i_2] = t2_2[i_3][i_2]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < j) -> (m[i_2] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
 }
 Prove: m[j <- v][i_1] = v.
 
@@ -945,7 +1021,9 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Previous_i' (file tests/wp_typed/user_init.i, line 55):
+Let x = to_uint32(1 + j).
 Let m = t2_0[i].
+Let m_1 = m[j <- v].
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
@@ -957,11 +1035,11 @@ Assume {
       ((i_3 <= 19) ->
       (((i_4 < 0) \/ (i_3 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) ->
       (t2_2[i_4][i_3] = t2_1[i_4][i_3])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Loop assigns 'lack,Zone_j' *)
@@ -969,17 +1047,21 @@ Assume {
       ((i_3 <= 19) ->
       (((i_4 < 0) \/ (i_3 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) ->
       (t2_0[i_4][i_3] = t2_1[i_4][i_3])))))).
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < j) -> (m[i_3] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) -> (t2_0[i_4][i_3] = t2_1[i_4][i_3]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < j) -> (m[i_3] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < x) -> (m_1[i_3] = v))).
 }
-Prove: t2_0[i <- m[j <- v]][i_1][i_2] = t2_1[i_1][i_2].
+Prove: t2_0[i <- m_1][i_1][i_2] = t2_1[i_1][i_2].
 
 ------------------------------------------------------------
 
@@ -998,11 +1080,11 @@ Assume {
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Loop assigns 'lack,Zone_j' *)
@@ -1010,13 +1092,13 @@ Assume {
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
 }
@@ -1046,6 +1128,8 @@ Prove: true.
 
 Goal Loop assigns 'lack,Zone_i' (2/3):
 Effect at line 51
+Let x = to_uint32(1 + i_2).
+Let m = t2_2[i_2].
 Assume {
   Type: is_uint32(i_2).
   (* Heap *)
@@ -1059,24 +1143,28 @@ Assume {
       ((i_7 <= 19) ->
       (((i_8 < 0) \/ (i_7 < 0) \/ (10 <= i_8) \/ (20 <= i_7)) ->
       (t2_0[i_8][i_7] = t2_1[i_8][i_7])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((i_8 < i_2) -> ((0 <= i_7) ->
       ((i_7 <= 19) -> (t2_1[i_8][i_7] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
   (* Loop assigns 'lack,Zone_j' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((0 <= i_7) -> ((i_8 <= 9) ->
       ((i_7 <= 19) ->
       (((i_8 < 0) \/ (i_7 < 0) \/ (10 <= i_8) \/ (20 <= i_7)) ->
-      (t2_2[i_8][i_7] = t2_1[i_8][i_7])))))).
+      (t2_1[i_8][i_7] = t2_2[i_8][i_7])))))).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_7 : Z. ((0 <= i_7) -> ((i_7 <= 19) -> (m[i_7] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((i_8 < i_2) -> ((0 <= i_7) ->
-      ((i_7 <= 19) -> (t2_2[i_8][i_7] = t2_1[i_8][i_7]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_7 : Z. ((0 <= i_7) -> ((i_7 <= 19) ->
-      (t2_2[i_2][i_7] = v))).
+      ((i_7 <= 19) -> (t2_1[i_8][i_7] = t2_2[i_8][i_7]))))).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((0 <= i_7) -> ((i_8 < x) ->
+      ((i_7 <= 19) -> (t2_2[i_8][i_7] = m[0]))))).
 }
 Prove: exists i_8,i_7 : Z. (i_8 <= i) /\ (i_7 <= i_1) /\ (0 <= i_8) /\
     (i <= i_8) /\ (0 <= i_7) /\ (i_1 <= i_7) /\ (i_8 <= 9) /\ (i_7 <= 19).
@@ -1085,6 +1173,8 @@ Prove: exists i_8,i_7 : Z. (i_8 <= i) /\ (i_7 <= i_1) /\ (0 <= i_8) /\
 
 Goal Loop assigns 'lack,Zone_i' (3/3):
 Effect at line 58
+Let x = to_uint32(1 + i_2).
+Let m = t2_2[i_2].
 Assume {
   Type: is_uint32(i_2).
   (* Heap *)
@@ -1098,24 +1188,28 @@ Assume {
       ((i_7 <= 19) ->
       (((i_8 < 0) \/ (i_7 < 0) \/ (10 <= i_8) \/ (20 <= i_7)) ->
       (t2_0[i_8][i_7] = t2_1[i_8][i_7])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((i_8 < i_2) -> ((0 <= i_7) ->
       ((i_7 <= 19) -> (t2_1[i_8][i_7] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
   (* Loop assigns 'lack,Zone_j' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((0 <= i_7) -> ((i_8 <= 9) ->
       ((i_7 <= 19) ->
       (((i_8 < 0) \/ (i_7 < 0) \/ (10 <= i_8) \/ (20 <= i_7)) ->
-      (t2_2[i_8][i_7] = t2_1[i_8][i_7])))))).
+      (t2_1[i_8][i_7] = t2_2[i_8][i_7])))))).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_7 : Z. ((0 <= i_7) -> ((i_7 <= 19) -> (m[i_7] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((i_8 < i_2) -> ((0 <= i_7) ->
-      ((i_7 <= 19) -> (t2_2[i_8][i_7] = t2_1[i_8][i_7]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_7 : Z. ((0 <= i_7) -> ((i_7 <= 19) ->
-      (t2_2[i_2][i_7] = v))).
+      ((i_7 <= 19) -> (t2_1[i_8][i_7] = t2_2[i_8][i_7]))))).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((0 <= i_7) -> ((i_8 < x) ->
+      ((i_7 <= 19) -> (t2_2[i_8][i_7] = m[0]))))).
 }
 Prove: exists i_8,i_7 : Z. (i_8 <= i) /\ (i_7 <= i_1) /\ (0 <= i_8) /\
     (i <= i_8) /\ (0 <= i_7) /\ (i_1 <= i_7) /\ (i_8 <= 9) /\ (i_7 <= 19).
@@ -1129,6 +1223,9 @@ Prove: true.
 
 Goal Loop assigns 'lack,Zone_j' (2/3):
 Effect at line 58
+Let m = t2_2[i_2].
+Let m_1 = m[j <- v].
+Let x = to_uint32(1 + j).
 Assume {
   Type: is_uint32(i_2) /\ is_uint32(j).
   (* Heap *)
@@ -1142,11 +1239,11 @@ Assume {
       ((i_7 <= 19) ->
       (((i_8 < 0) \/ (i_7 < 0) \/ (10 <= i_8) \/ (20 <= i_7)) ->
       (t2_0[i_8][i_7] = t2_1[i_8][i_7])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((i_8 < i_2) -> ((0 <= i_7) ->
       ((i_7 <= 19) -> (t2_1[i_8][i_7] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
   (* Loop assigns 'lack,Zone_j' *)
@@ -1154,15 +1251,22 @@ Assume {
       ((i_7 <= 19) ->
       (((i_8 < 0) \/ (i_7 < 0) \/ (10 <= i_8) \/ (20 <= i_7)) ->
       (t2_2[i_8][i_7] = t2_1[i_8][i_7])))))).
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_7 : Z. ((0 <= i_7) -> ((i_7 < j) -> (m[i_7] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((i_8 < i_2) -> ((0 <= i_7) ->
       ((i_7 <= 19) -> (t2_2[i_8][i_7] = t2_1[i_8][i_7]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_7 : Z. ((0 <= i_7) -> ((i_7 < j) -> (t2_2[i_2][i_7] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_7 : Z. ((0 <= i_7) -> ((i_7 < x) -> (m_1[i_7] = v))).
+  (* Invariant 'Previous_i' *)
+  Have: forall i_8,i_7 : Z. ((0 <= i_8) -> ((i_8 < i_2) -> ((0 <= i_7) ->
+      ((i_7 <= 19) -> (t2_2[i_2 <- m_1][i_8][i_7] = t2_1[i_8][i_7]))))).
 }
 Prove: exists i_8,i_7 : Z. (i_8 <= i) /\ (i_7 <= i_1) /\ (0 <= i_8) /\
     (i <= i_8) /\ (0 <= i_7) /\ (i_1 <= i_7) /\ (i_8 <= 9) /\ (i_7 <= 19).
@@ -1171,6 +1275,9 @@ Prove: exists i_8,i_7 : Z. (i_8 <= i) /\ (i_7 <= i_1) /\ (0 <= i_8) /\
 
 Goal Loop assigns 'lack,Zone_j' (3/3):
 Effect at line 59
+Let m = t2_2[i].
+Let m_1 = m[j <- v].
+Let x = to_uint32(1 + j).
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
@@ -1182,23 +1289,30 @@ Assume {
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Range_i' *)
+  Have: i <= 10.
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: i <= 10.
   (* Loop assigns 'lack,Zone_j' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Range_j' *)
+  Have: j <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (m[i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))).
   (* Invariant 'Range_j' *)
-  Have: j <= 20.
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < x) -> (m_1[i_1] = v))).
+  (* Invariant 'Previous_i' *)
+  Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
+      ((i_1 <= 19) -> (t2_2[i <- m_1][i_2][i_1] = t2_1[i_2][i_1]))))).
 }
 Prove: exists i_2,i_1 : Z. (i_2 <= i) /\ (0 <= i_2) /\ (i <= i_2) /\
     (0 <= i_1) /\ (j <= i_1) /\ (i_1 <= j) /\ (i_2 <= 9) /\ (i_1 <= 19).
@@ -1236,6 +1350,8 @@ Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 51):
+Let x = to_uint32(1 + i).
+Let m = t2_2[i].
 Assume {
   Type: is_uint32(i).
   (* Heap *)
@@ -1245,25 +1361,30 @@ Assume {
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Loop assigns 'lack,Zone_j' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
-      (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))).
+      (t2_1[i_2][i_1] = t2_2[i_2][i_1])))))).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (m[i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
-      ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_2[i][i_1] = v))).
+      ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_2[i_2][i_1]))))).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 < x) ->
+      ((i_1 <= 19) -> (t2_2[i_2][i_1] = m[0]))))).
 }
-Prove: i < to_uint32(1 + i).
+Prove: i < x.
 
 ------------------------------------------------------------
 
@@ -1273,6 +1394,9 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 58):
+Let m = t2_2[i].
+Let m_1 = m[j <- v].
+Let x = to_uint32(1 + j).
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
@@ -1282,11 +1406,11 @@ Assume {
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Loop assigns 'lack,Zone_j' *)
@@ -1294,17 +1418,24 @@ Assume {
       ((i_1 <= 19) ->
       (((i_2 < 0) \/ (i_1 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) ->
       (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))).
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (m[i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < x) -> (m_1[i_1] = v))).
+  (* Invariant 'Previous_i' *)
+  Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
+      ((i_1 <= 19) -> (t2_2[i <- m_1][i_2][i_1] = t2_1[i_2][i_1]))))).
 }
-Prove: j < to_uint32(1 + j).
+Prove: j < x.
 
 ------------------------------------------------------------
 
@@ -1329,23 +1460,26 @@ Prove: t2_0[i][i_1] = v.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial_i' (file tests/wp_typed/user_init.i, line 77):
+Let x = to_uint32(1 + i).
 Let m = t2_0[i].
 Assume {
   Type: is_uint32(i).
   (* Goal *)
-  When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < to_uint32(1 + i)) /\ (i_2 <= 19).
+  When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < x) /\ (i_2 <= 19).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (m[i_3] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) -> (t2_1[i_4][i_3] = t2_0[i_4][i_3]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (m[i_3] = v))).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
 }
 Prove: m[0] = t2_0[i_1][i_2].
 
@@ -1359,18 +1493,18 @@ Prove: true.
 Goal Preservation of Invariant 'Range_i' (file tests/wp_typed/user_init.i, line 76):
 Assume {
   Type: is_uint32(i).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_1[i][i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_1[i][i_1] = v))).
 }
 Prove: to_uint32(1 + i) <= 10.
 
@@ -1382,27 +1516,30 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial_j' (file tests/wp_typed/user_init.i, line 83):
+Let x = to_uint32(1 + j).
 Let m = t2_0[i].
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 < to_uint32(1 + j)).
+  When: (0 <= i_1) /\ (i_1 < x).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) ->
       ((i_2 <= 19) -> (t2_1[i_3][i_2] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < j) -> (m[i_2] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) ->
       ((i_2 <= 19) -> (t2_0[i_3][i_2] = t2_1[i_3][i_2]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < j) -> (m[i_2] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
 }
 Prove: m[j <- v][i_1] = v.
 
@@ -1414,29 +1551,35 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Previous_i' (file tests/wp_typed/user_init.i, line 84):
+Let x = to_uint32(1 + j).
 Let m = t2_0[i].
+Let m_1 = m[j <- v].
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 < i) /\ (0 <= i_2) /\ (i_2 <= 19).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < j) -> (m[i_3] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) ->
       ((i_3 <= 19) -> (t2_0[i_4][i_3] = t2_1[i_4][i_3]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < j) -> (m[i_3] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < x) -> (m_1[i_3] = v))).
 }
-Prove: t2_0[i <- m[j <- v]][i_1][i_2] = t2_1[i_1][i_2].
+Prove: t2_0[i <- m_1][i_1][i_2] = t2_1[i_1][i_2].
 
 ------------------------------------------------------------
 
@@ -1448,20 +1591,20 @@ Prove: true.
 Goal Preservation of Invariant 'Range_j' (file tests/wp_typed/user_init.i, line 82):
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_1[i][i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_1[i][i_1] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
 }
@@ -1491,24 +1634,30 @@ Prove: true.
 
 Goal Loop assigns 'tactic,Zone_i' (2/3):
 Effect at line 80
+Let x = to_uint32(1 + i_2).
+Let m = t2_1[i_2].
 Assume {
   Type: is_uint32(i_2).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\
       (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) ->
       ((i_6 <= 19) -> (t2_0[i_7][i_6] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 19) -> (m[i_6] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) ->
-      ((i_6 <= 19) -> (t2_1[i_7][i_6] = t2_0[i_7][i_6]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 19) ->
-      (t2_1[i_2][i_6] = v))).
+      ((i_6 <= 19) -> (t2_0[i_7][i_6] = t2_1[i_7][i_6]))))).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 < x) ->
+      ((i_6 <= 19) -> (t2_1[i_7][i_6] = m[0]))))).
 }
 Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
     (i <= i_7) /\ (i_1 <= i_6) /\ (i_7 <= 9).
@@ -1517,24 +1666,30 @@ Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
 
 Goal Loop assigns 'tactic,Zone_i' (3/3):
 Effect at line 87
+Let x = to_uint32(1 + i_2).
+Let m = t2_1[i_2].
 Assume {
   Type: is_uint32(i_2).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\
       (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) ->
       ((i_6 <= 19) -> (t2_0[i_7][i_6] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 19) -> (m[i_6] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) ->
-      ((i_6 <= 19) -> (t2_1[i_7][i_6] = t2_0[i_7][i_6]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 19) ->
-      (t2_1[i_2][i_6] = v))).
+      ((i_6 <= 19) -> (t2_0[i_7][i_6] = t2_1[i_7][i_6]))))).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 < x) ->
+      ((i_6 <= 19) -> (t2_1[i_7][i_6] = m[0]))))).
 }
 Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
     (i <= i_7) /\ (i_1 <= i_6) /\ (i_7 <= 9).
@@ -1548,27 +1703,37 @@ Prove: true.
 
 Goal Loop assigns 'tactic,Zone_j' (2/3):
 Effect at line 87
+Let m = t2_1[i_2].
+Let m_1 = m[j <- v].
+Let x = to_uint32(1 + j).
 Assume {
   Type: is_uint32(i_2) /\ is_uint32(j).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\
       (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) ->
       ((i_6 <= 19) -> (t2_0[i_7][i_6] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 < j) -> (m[i_6] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) ->
       ((i_6 <= 19) -> (t2_1[i_7][i_6] = t2_0[i_7][i_6]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 < j) -> (t2_1[i_2][i_6] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 < x) -> (m_1[i_6] = v))).
+  (* Invariant 'Previous_i' *)
+  Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) ->
+      ((i_6 <= 19) -> (t2_1[i_2 <- m_1][i_7][i_6] = t2_0[i_7][i_6]))))).
 }
 Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
     (i <= i_7) /\ (i_1 <= i_6) /\ (i_7 <= 9).
@@ -1577,22 +1742,32 @@ Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
 
 Goal Loop assigns 'tactic,Zone_j' (3/3):
 Effect at line 88
+Let m = t2_1[i].
+Let m_1 = m[j <- v].
+Let x = to_uint32(1 + j).
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Goal *)
   When: (0 <= i) /\ (0 <= j) /\ (i <= 9) /\ (j <= 19).
+  (* Invariant 'Range_i' *)
+  Have: i <= 10.
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: i <= 10.
+  (* Invariant 'Range_j' *)
+  Have: j <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (m[i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_1[i][i_1] = v))).
   (* Invariant 'Range_j' *)
-  Have: j <= 20.
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < x) -> (m_1[i_1] = v))).
+  (* Invariant 'Previous_i' *)
+  Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
+      ((i_1 <= 19) -> (t2_1[i <- m_1][i_2][i_1] = t2_0[i_2][i_1]))))).
 }
 Prove: exists i_2,i_1 : Z. (i_2 <= i) /\ (0 <= i_2) /\ (i <= i_2) /\
     (j <= i_1) /\ (i_1 <= j) /\ (i_2 <= 9).
@@ -1621,22 +1796,29 @@ Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 80):
+Let x = to_uint32(1 + i).
+Let m = t2_1[i].
 Assume {
   Type: is_uint32(i).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (m[i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
-      ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_1[i][i_1] = v))).
+      ((i_1 <= 19) -> (t2_0[i_2][i_1] = t2_1[i_2][i_1]))))).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 < x) ->
+      ((i_1 <= 19) -> (t2_1[i_2][i_1] = m[0]))))).
 }
-Prove: i < to_uint32(1 + i).
+Prove: i < x.
 
 ------------------------------------------------------------
 
@@ -1646,26 +1828,36 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 87):
+Let m = t2_1[i].
+Let m_1 = m[j <- v].
+Let x = to_uint32(1 + j).
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
+  (* Invariant 'Range_j' *)
+  Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (m[i_1] = v))).
   (* Invariant 'Previous_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
       ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))).
-  (* Invariant 'Partial_j' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_1[i][i_1] = v))).
-  (* Invariant 'Range_j' *)
-  Have: (0 <= j) /\ (j <= 20).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < x) -> (m_1[i_1] = v))).
+  (* Invariant 'Previous_i' *)
+  Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) ->
+      ((i_1 <= 19) -> (t2_1[i <- m_1][i_2][i_1] = t2_0[i_2][i_1]))))).
 }
-Prove: j < to_uint32(1 + j).
+Prove: j < x.
 
 ------------------------------------------------------------
 
@@ -1691,20 +1883,26 @@ Prove: P_MemSet20(t2_0[i], 20, v).
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial_i' (file tests/wp_typed/user_init.i, line 108):
+Let x = to_uint32(1 + i).
+Let m = t2_0[i].
 Assume {
   Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
-      IsArray_sint32(t2_0[i]).
+      IsArray_sint32(m).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 < to_uint32(1 + i)).
+  When: (0 <= i_1) /\ (i_1 < x).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       P_MemSet20(t2_0[i_2], 20, v_1))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(m, 0, v_1).
+  (* Invariant 'Partial_j' *)
   Have: P_MemSet20(v, 20, v_1).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
 }
 Prove: P_MemSet20(t2_0[i <- v][i_1], 20, v_1).
 
@@ -1716,17 +1914,20 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Range_i' (file tests/wp_typed/user_init.i, line 107):
+Let m = t2_0[i].
 Assume {
   Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
-      IsArray_sint32(t2_0[i]).
+      IsArray_sint32(m).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(m, 0, v_1).
+  (* Invariant 'Partial_j' *)
   Have: P_MemSet20(v, 20, v_1).
 }
 Prove: to_uint32(1 + i) <= 10.
@@ -1739,25 +1940,31 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial_j' (file tests/wp_typed/user_init.i, line 114):
-Let m = v[j <- v_1].
+Let x = to_uint32(1 + j).
+Let m = t2_0[i].
+Let m_1 = v[j <- v_1].
 Assume {
   Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
-      is_sint32(v_1) /\ IsArray_sint32(t2_0[i]) /\ IsArray_sint32(m).
+      is_sint32(v_1) /\ IsArray_sint32(m) /\ IsArray_sint32(m_1).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Invariant 'Partial_j' *)
-  Have: P_MemSet20(v, j, v_1).
+  Have: P_MemSet20(m, 0, v_1).
   (* Invariant 'Range_j' *)
   Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(v, j, v_1).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
 }
-Prove: P_MemSet20(m, to_uint32(1 + j), v_1).
+Prove: P_MemSet20(m_1, x, v_1).
 
 ------------------------------------------------------------
 
@@ -1765,11 +1972,11 @@ Goal Establishment of Invariant 'Partial_j' (file tests/wp_typed/user_init.i, li
 Let m = t2_0[i].
 Assume {
   Type: is_uint32(i) /\ is_sint32(v) /\ IsArray_sint32(m).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
 }
@@ -1778,20 +1985,23 @@ Prove: P_MemSet20(m, 0, v).
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Range_j' (file tests/wp_typed/user_init.i, line 113):
+Let m = t2_0[i].
 Assume {
   Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
-      is_sint32(v_1) /\ IsArray_sint32(t2_0[i]).
+      is_sint32(v_1) /\ IsArray_sint32(m).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Invariant 'Partial_j' *)
-  Have: P_MemSet20(v, j, v_1).
+  Have: P_MemSet20(m, 0, v_1).
   (* Invariant 'Range_j' *)
   Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(v, j, v_1).
   (* Then *)
   Have: j <= 19.
 }
@@ -1821,21 +2031,30 @@ Prove: true.
 
 Goal Loop assigns 'tactic,Zone_i' (2/3):
 Effect at line 111
+Let x = to_uint32(1 + i_2).
+Let m = t2_0[i_2].
 Assume {
   Type: IsArray_sint32(v) /\ is_uint32(i_2) /\ is_sint32(v_1) /\
-      IsArray_sint32(t2_0[i_2]).
+      IsArray_sint32(m).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\
       (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 < i_2) ->
       P_MemSet20(t2_0[i_6], 20, v_1))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i_2) /\ (i_2 <= 10).
   (* Then *)
   Have: i_2 <= 9.
   (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(m, 0, v_1).
+  (* Invariant 'Partial_j' *)
   Have: P_MemSet20(v, 20, v_1).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 < x) ->
+      P_MemSet20(t2_0[i_2 <- v][i_6], 20, v_1))).
 }
 Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
     (i <= i_7) /\ (i_1 <= i_6) /\ (i_7 <= 9).
@@ -1844,18 +2063,27 @@ Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
 
 Goal Loop assigns 'tactic,Zone_i' (3/3):
 Effect at line 117
+Let x = to_uint32(1 + i).
+Let m = t2_0[i].
 Assume {
   Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
-      IsArray_sint32(t2_0[i]).
+      IsArray_sint32(m).
   (* Goal *)
   When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19).
+  (* Invariant 'Range_i' *)
+  Have: i <= 10.
   (* Invariant 'Partial_i' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       P_MemSet20(t2_0[i_2], 20, v_1))).
-  (* Invariant 'Range_i' *)
-  Have: i <= 10.
+  (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(m, 0, v_1).
   (* Invariant 'Partial_j' *)
   Have: P_MemSet20(v, 20, v_1).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < x) ->
+      P_MemSet20(t2_0[i <- v][i_2], 20, v_1))).
 }
 Prove: exists i_3,i_2 : Z. (i_3 <= i) /\ (i_2 <= i_1) /\ (0 <= i_3) /\
     (i <= i_3) /\ (i_1 <= i_2) /\ (i_3 <= 9).
@@ -1895,20 +2123,29 @@ Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 111):
+Let x = to_uint32(1 + i).
+Let m = t2_0[i].
 Assume {
   Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
-      IsArray_sint32(t2_0[i]).
+      IsArray_sint32(m).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(m, 0, v_1).
+  (* Invariant 'Partial_j' *)
   Have: P_MemSet20(v, 20, v_1).
+  (* Invariant 'Range_i' *)
+  Have: x <= 10.
+  (* Invariant 'Partial_i' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < x) ->
+      P_MemSet20(t2_0[i <- v][i_1], 20, v_1))).
 }
-Prove: i < to_uint32(1 + i).
+Prove: i < x.
 
 ------------------------------------------------------------
 
@@ -1918,24 +2155,33 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 117):
+Let m = v[j <- v_1].
+Let x = to_uint32(1 + j).
+Let m_1 = t2_0[i].
 Assume {
   Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
-      is_sint32(v_1) /\ IsArray_sint32(t2_0[i]).
+      is_sint32(v_1) /\ IsArray_sint32(m_1) /\ IsArray_sint32(m).
+  (* Invariant 'Range_i' *)
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
-  (* Invariant 'Range_i' *)
-  Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
   (* Invariant 'Partial_j' *)
-  Have: P_MemSet20(v, j, v_1).
+  Have: P_MemSet20(m_1, 0, v_1).
   (* Invariant 'Range_j' *)
   Have: (0 <= j) /\ (j <= 20).
+  (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(v, j, v_1).
   (* Then *)
   Have: j <= 19.
+  (* Invariant 'Range_j' *)
+  Have: x <= 20.
+  (* Invariant 'Partial_j' *)
+  Have: P_MemSet20(m, x, v_1).
 }
-Prove: j < to_uint32(1 + j).
+Prove: j < x.
 
 ------------------------------------------------------------
 
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_rec.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_rec.0.res.oracle
index 48d804d0c823fef23c125984780eaed6cc1ce3b8..13654bda662e5cff82b8d1969988bfad67631339 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_rec.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_rec.0.res.oracle
@@ -29,9 +29,13 @@ Assume {
   Then { Have: F1_0 = 1. }
   Else {
     (* Invariant *)
-    Have: L_fact(i - 1) = F1_0.
+    Have: 0 < n.
+    (* Invariant *)
+    Have: L_fact(1) = 1.
     (* Invariant *)
     Have: (2 <= i) /\ (i <= (1 + n)).
+    (* Invariant *)
+    Have: L_fact(i - 1) = F1_0.
     (* Else *)
     Have: n < i.
   }
@@ -47,6 +51,10 @@ Assume {
   (* Else *)
   Have: 2 <= n.
   (* Invariant *)
+  Have: 0 < n.
+  (* Invariant *)
+  Have: L_fact(1) = 1.
+  (* Invariant *)
   Have: (2 <= i) /\ (i <= (1 + n)).
   (* Then *)
   Have: i <= n.
@@ -70,16 +78,28 @@ Assume {
   (* Else *)
   Have: 2 <= n.
   (* Invariant *)
+  Have: 0 < n.
+  (* Invariant *)
+  Have: L_fact(1) = 1.
+  (* Invariant *)
   Have: (2 <= i) /\ (i <= (1 + n)).
   (* Then *)
   Have: i <= n.
+  (* Invariant *)
+  Have: 0 < i.
 }
 Prove: x_1 = L_fact(i).
 
 ------------------------------------------------------------
 
 Goal Establishment of Invariant (file tests/wp_typed/user_rec.i, line 16):
-Assume { Type: is_sint32(n). (* Else *) Have: 2 <= n. }
+Assume {
+  Type: is_sint32(n).
+  (* Else *)
+  Have: 2 <= n.
+  (* Invariant *)
+  Have: 0 < n.
+}
 Prove: L_fact(1) = 1.
 
 ------------------------------------------------------------
@@ -95,10 +115,14 @@ Prove: true.
 Goal Post-condition (file tests/wp_typed/user_rec.i, line 23) in 'F2':
 Assume {
   Type: is_sint32(F2_0) /\ is_sint32(i) /\ is_sint32(n).
+  (* Invariant 'RANGE' *)
+  Have: (0 < n) \/ (n <= 1).
   (* Invariant 'PART' *)
-  Have: if (n <= 1) then (F2_0 = 1) else (L_fact(i - 1) = F2_0).
+  Have: (L_fact(1) = 1) \/ (n <= 1).
   (* Invariant 'RANGE' *)
   Have: if (n <= 1) then (i = 2) else ((2 <= i) /\ (i <= (1 + n))).
+  (* Invariant 'PART' *)
+  Have: if (n <= 1) then (F2_0 = 1) else (L_fact(i - 1) = F2_0).
   (* Else *)
   Have: n < i.
 }
@@ -111,19 +135,29 @@ Let x = i * p.
 Assume {
   Type: is_sint32(i) /\ is_sint32(n) /\ is_sint32(p) /\ is_sint32(1 + i) /\
       is_sint32(x).
+  (* Invariant 'RANGE' *)
+  Have: (0 < n) \/ (n <= 1).
   (* Invariant 'PART' *)
-  Have: if (n <= 1) then (p = 1) else (L_fact(i - 1) = p).
+  Have: (L_fact(1) = 1) \/ (n <= 1).
   (* Invariant 'RANGE' *)
   Have: if (n <= 1) then (i = 2) else ((2 <= i) /\ (i <= (1 + n))).
+  (* Invariant 'PART' *)
+  Have: if (n <= 1) then (p = 1) else (L_fact(i - 1) = p).
   (* Then *)
   Have: i <= n.
+  (* Invariant 'RANGE' *)
+  Have: if (n <= 1) then (i = 1) else (0 < i).
 }
 Prove: if (n <= 1) then (x = 1) else (x = L_fact(i)).
 
 ------------------------------------------------------------
 
 Goal Establishment of Invariant 'PART' (file tests/wp_typed/user_rec.i, line 29):
-Assume { Type: is_sint32(n). }
+Assume {
+  Type: is_sint32(n).
+  (* Invariant 'RANGE' *)
+  Have: (0 < n) \/ (n <= 1).
+}
 Prove: (L_fact(1) = 1) \/ (n <= 1).
 
 ------------------------------------------------------------
@@ -131,10 +165,14 @@ Prove: (L_fact(1) = 1) \/ (n <= 1).
 Goal Preservation of Invariant 'RANGE' (file tests/wp_typed/user_rec.i, line 28):
 Assume {
   Type: is_sint32(i) /\ is_sint32(n) /\ is_sint32(p) /\ is_sint32(1 + i).
+  (* Invariant 'RANGE' *)
+  Have: (0 < n) \/ (n <= 1).
   (* Invariant 'PART' *)
-  Have: if (n <= 1) then (p = 1) else (L_fact(i - 1) = p).
+  Have: (L_fact(1) = 1) \/ (n <= 1).
   (* Invariant 'RANGE' *)
   Have: if (n <= 1) then (i = 2) else ((2 <= i) /\ (i <= (1 + n))).
+  (* Invariant 'PART' *)
+  Have: if (n <= 1) then (p = 1) else (L_fact(i - 1) = p).
   (* Then *)
   Have: i <= n.
 }
@@ -160,10 +198,14 @@ Goal Post-condition (file tests/wp_typed/user_rec.i, line 36) in 'F4':
 Let x = L_fact(n).
 Assume {
   Type: is_sint32(F4_0) /\ is_sint32(n) /\ is_sint32(n_1).
+  (* Invariant 'RANGE' *)
+  Have: (0 < n) \/ (n <= 1).
   (* Invariant 'NEVER' *)
-  Have: if (n <= 1) then (F4_0 = 1) else ((x / L_fact(n_1)) = F4_0).
+  Have: ((x / x) = 1) \/ (n <= 1).
   (* Invariant 'RANGE' *)
   Have: if (n <= 1) then (n_1 = n) else ((0 < n_1) /\ (n_1 <= n)).
+  (* Invariant 'NEVER' *)
+  Have: if (n <= 1) then (F4_0 = 1) else ((x / L_fact(n_1)) = F4_0).
   (* Else *)
   Have: n_1 <= 1.
 }
@@ -172,41 +214,58 @@ Prove: x = F4_0.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'NEVER' (file tests/wp_typed/user_rec.i, line 42):
-Let x = L_fact(n).
-Let x_1 = n_1 - 1.
-Let x_2 = n_1 * p.
+Let x = 1 + n.
+Let x_1 = L_fact(n).
+Let x_2 = n_1 - 1.
+Let x_3 = n_1 * p.
 Assume {
-  Type: is_sint32(n) /\ is_sint32(n_1) /\ is_sint32(p) /\ is_sint32(x_1) /\
-      is_sint32(x_2).
+  Type: is_sint32(n) /\ is_sint32(n_1) /\ is_sint32(p) /\ is_sint32(x_2) /\
+      is_sint32(x_3).
+  (* Invariant 'RANGE' *)
+  Have: (0 < n) \/ (n <= 1).
   (* Invariant 'NEVER' *)
-  Have: if (n <= 1) then (p = 1) else ((x / L_fact(n_1)) = p).
+  Have: ((x_1 / x_1) = 1) \/ (n <= 1).
   (* Invariant 'RANGE' *)
   Have: if (n <= 1) then (n_1 = n) else ((0 < n_1) /\ (n_1 <= n)).
+  (* Invariant 'NEVER' *)
+  Have: if (n <= 1) then (p = 1) else ((x_1 / L_fact(n_1)) = p).
   (* Then *)
   Have: 2 <= n_1.
+  (* Invariant 'RANGE' *)
+  Have: if (n <= 1) then (x = n_1) else (n_1 <= x).
 }
-Prove: if (n <= 1) then (x_2 = 1) else ((x / L_fact(x_1)) = x_2).
+Prove: if (n <= 1) then (x_3 = 1) else ((x_1 / L_fact(x_2)) = x_3).
 
 ------------------------------------------------------------
 
 Goal Establishment of Invariant 'NEVER' (file tests/wp_typed/user_rec.i, line 42):
-Let x = L_fact(n). Assume { Type: is_sint32(n). }
+Let x = L_fact(n).
+Assume {
+  Type: is_sint32(n).
+  (* Invariant 'RANGE' *)
+  Have: (0 < n) \/ (n <= 1).
+}
 Prove: ((x / x) = 1) \/ (n <= 1).
 
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'RANGE' (file tests/wp_typed/user_rec.i, line 41):
-Let x = 1 + n.
+Let x = L_fact(n).
+Let x_1 = 1 + n.
 Assume {
   Type: is_sint32(n) /\ is_sint32(n_1) /\ is_sint32(p) /\ is_sint32(n_1 - 1).
+  (* Invariant 'RANGE' *)
+  Have: (0 < n) \/ (n <= 1).
   (* Invariant 'NEVER' *)
-  Have: if (n <= 1) then (p = 1) else ((L_fact(n) / L_fact(n_1)) = p).
+  Have: ((x / x) = 1) \/ (n <= 1).
   (* Invariant 'RANGE' *)
   Have: if (n <= 1) then (n_1 = n) else ((0 < n_1) /\ (n_1 <= n)).
+  (* Invariant 'NEVER' *)
+  Have: if (n <= 1) then (p = 1) else ((x / L_fact(n_1)) = p).
   (* Then *)
   Have: 2 <= n_1.
 }
-Prove: if (n <= 1) then (x = n_1) else (n_1 <= x).
+Prove: if (n <= 1) then (x_1 = n_1) else (n_1 <= x_1).
 
 ------------------------------------------------------------
 
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_rec.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_rec.1.res.oracle
index 7ee8668e53c9d73b825da70fa28b6ab9fe06994d..f9941a0cd6fe3a766c5334ff77b0992b3bf8e800 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_rec.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_rec.1.res.oracle
@@ -29,9 +29,13 @@ Assume {
   Then { Have: F1_0 = 1. }
   Else {
     (* Invariant *)
-    Have: L_fact(i - 1) = F1_0.
+    Have: 0 < n.
+    (* Invariant *)
+    Have: L_fact(1) = 1.
     (* Invariant *)
     Have: (2 <= i) /\ (i <= (1 + n)).
+    (* Invariant *)
+    Have: L_fact(i - 1) = F1_0.
     (* Else *)
     Have: n < i.
   }
@@ -47,6 +51,10 @@ Assume {
   (* Else *)
   Have: 2 <= n.
   (* Invariant *)
+  Have: 0 < n.
+  (* Invariant *)
+  Have: L_fact(1) = 1.
+  (* Invariant *)
   Have: (2 <= i) /\ (i <= (1 + n)).
   (* Then *)
   Have: i <= n.
@@ -70,16 +78,28 @@ Assume {
   (* Else *)
   Have: 2 <= n.
   (* Invariant *)
+  Have: 0 < n.
+  (* Invariant *)
+  Have: L_fact(1) = 1.
+  (* Invariant *)
   Have: (2 <= i) /\ (i <= (1 + n)).
   (* Then *)
   Have: i <= n.
+  (* Invariant *)
+  Have: 0 < i.
 }
 Prove: x_1 = L_fact(i).
 
 ------------------------------------------------------------
 
 Goal Establishment of Invariant (file tests/wp_typed/user_rec.i, line 16):
-Assume { Type: is_sint32(n). (* Else *) Have: 2 <= n. }
+Assume {
+  Type: is_sint32(n).
+  (* Else *)
+  Have: 2 <= n.
+  (* Invariant *)
+  Have: 0 < n.
+}
 Prove: L_fact(1) = 1.
 
 ------------------------------------------------------------
@@ -95,10 +115,14 @@ Prove: true.
 Goal Post-condition (file tests/wp_typed/user_rec.i, line 23) in 'F2':
 Assume {
   Type: is_sint32(F2_0) /\ is_sint32(i) /\ is_sint32(n).
+  (* Invariant 'RANGE' *)
+  Have: (0 < n) \/ (n <= 1).
   (* Invariant 'PART' *)
-  Have: if (n <= 1) then (F2_0 = 1) else (L_fact(i - 1) = F2_0).
+  Have: (L_fact(1) = 1) \/ (n <= 1).
   (* Invariant 'RANGE' *)
   Have: if (n <= 1) then (i = 2) else ((2 <= i) /\ (i <= (1 + n))).
+  (* Invariant 'PART' *)
+  Have: if (n <= 1) then (F2_0 = 1) else (L_fact(i - 1) = F2_0).
   (* Else *)
   Have: n < i.
 }
@@ -111,19 +135,29 @@ Let x = i * p.
 Assume {
   Type: is_sint32(i) /\ is_sint32(n) /\ is_sint32(p) /\ is_sint32(1 + i) /\
       is_sint32(x).
+  (* Invariant 'RANGE' *)
+  Have: (0 < n) \/ (n <= 1).
   (* Invariant 'PART' *)
-  Have: if (n <= 1) then (p = 1) else (L_fact(i - 1) = p).
+  Have: (L_fact(1) = 1) \/ (n <= 1).
   (* Invariant 'RANGE' *)
   Have: if (n <= 1) then (i = 2) else ((2 <= i) /\ (i <= (1 + n))).
+  (* Invariant 'PART' *)
+  Have: if (n <= 1) then (p = 1) else (L_fact(i - 1) = p).
   (* Then *)
   Have: i <= n.
+  (* Invariant 'RANGE' *)
+  Have: if (n <= 1) then (i = 1) else (0 < i).
 }
 Prove: if (n <= 1) then (x = 1) else (x = L_fact(i)).
 
 ------------------------------------------------------------
 
 Goal Establishment of Invariant 'PART' (file tests/wp_typed/user_rec.i, line 29):
-Assume { Type: is_sint32(n). }
+Assume {
+  Type: is_sint32(n).
+  (* Invariant 'RANGE' *)
+  Have: (0 < n) \/ (n <= 1).
+}
 Prove: (L_fact(1) = 1) \/ (n <= 1).
 
 ------------------------------------------------------------
@@ -131,10 +165,14 @@ Prove: (L_fact(1) = 1) \/ (n <= 1).
 Goal Preservation of Invariant 'RANGE' (file tests/wp_typed/user_rec.i, line 28):
 Assume {
   Type: is_sint32(i) /\ is_sint32(n) /\ is_sint32(p) /\ is_sint32(1 + i).
+  (* Invariant 'RANGE' *)
+  Have: (0 < n) \/ (n <= 1).
   (* Invariant 'PART' *)
-  Have: if (n <= 1) then (p = 1) else (L_fact(i - 1) = p).
+  Have: (L_fact(1) = 1) \/ (n <= 1).
   (* Invariant 'RANGE' *)
   Have: if (n <= 1) then (i = 2) else ((2 <= i) /\ (i <= (1 + n))).
+  (* Invariant 'PART' *)
+  Have: if (n <= 1) then (p = 1) else (L_fact(i - 1) = p).
   (* Then *)
   Have: i <= n.
 }
@@ -160,10 +198,14 @@ Goal Post-condition (file tests/wp_typed/user_rec.i, line 36) in 'F4':
 Let x = L_fact(n).
 Assume {
   Type: is_sint32(F4_0) /\ is_sint32(n) /\ is_sint32(n_1).
+  (* Invariant 'RANGE' *)
+  Have: (0 < n) \/ (n <= 1).
   (* Invariant 'NEVER' *)
-  Have: if (n <= 1) then (F4_0 = 1) else ((x / L_fact(n_1)) = F4_0).
+  Have: ((x / x) = 1) \/ (n <= 1).
   (* Invariant 'RANGE' *)
   Have: if (n <= 1) then (n_1 = n) else ((0 < n_1) /\ (n_1 <= n)).
+  (* Invariant 'NEVER' *)
+  Have: if (n <= 1) then (F4_0 = 1) else ((x / L_fact(n_1)) = F4_0).
   (* Else *)
   Have: n_1 <= 1.
 }
@@ -172,41 +214,58 @@ Prove: x = F4_0.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'NEVER' (file tests/wp_typed/user_rec.i, line 42):
-Let x = L_fact(n).
-Let x_1 = n_1 - 1.
-Let x_2 = n_1 * p.
+Let x = 1 + n.
+Let x_1 = L_fact(n).
+Let x_2 = n_1 - 1.
+Let x_3 = n_1 * p.
 Assume {
-  Type: is_sint32(n) /\ is_sint32(n_1) /\ is_sint32(p) /\ is_sint32(x_1) /\
-      is_sint32(x_2).
+  Type: is_sint32(n) /\ is_sint32(n_1) /\ is_sint32(p) /\ is_sint32(x_2) /\
+      is_sint32(x_3).
+  (* Invariant 'RANGE' *)
+  Have: (0 < n) \/ (n <= 1).
   (* Invariant 'NEVER' *)
-  Have: if (n <= 1) then (p = 1) else ((x / L_fact(n_1)) = p).
+  Have: ((x_1 / x_1) = 1) \/ (n <= 1).
   (* Invariant 'RANGE' *)
   Have: if (n <= 1) then (n_1 = n) else ((0 < n_1) /\ (n_1 <= n)).
+  (* Invariant 'NEVER' *)
+  Have: if (n <= 1) then (p = 1) else ((x_1 / L_fact(n_1)) = p).
   (* Then *)
   Have: 2 <= n_1.
+  (* Invariant 'RANGE' *)
+  Have: if (n <= 1) then (x = n_1) else (n_1 <= x).
 }
-Prove: if (n <= 1) then (x_2 = 1) else ((x / L_fact(x_1)) = x_2).
+Prove: if (n <= 1) then (x_3 = 1) else ((x_1 / L_fact(x_2)) = x_3).
 
 ------------------------------------------------------------
 
 Goal Establishment of Invariant 'NEVER' (file tests/wp_typed/user_rec.i, line 42):
-Let x = L_fact(n). Assume { Type: is_sint32(n). }
+Let x = L_fact(n).
+Assume {
+  Type: is_sint32(n).
+  (* Invariant 'RANGE' *)
+  Have: (0 < n) \/ (n <= 1).
+}
 Prove: ((x / x) = 1) \/ (n <= 1).
 
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'RANGE' (file tests/wp_typed/user_rec.i, line 41):
-Let x = 1 + n.
+Let x = L_fact(n).
+Let x_1 = 1 + n.
 Assume {
   Type: is_sint32(n) /\ is_sint32(n_1) /\ is_sint32(p) /\ is_sint32(n_1 - 1).
+  (* Invariant 'RANGE' *)
+  Have: (0 < n) \/ (n <= 1).
   (* Invariant 'NEVER' *)
-  Have: if (n <= 1) then (p = 1) else ((L_fact(n) / L_fact(n_1)) = p).
+  Have: ((x / x) = 1) \/ (n <= 1).
   (* Invariant 'RANGE' *)
   Have: if (n <= 1) then (n_1 = n) else ((0 < n_1) /\ (n_1 <= n)).
+  (* Invariant 'NEVER' *)
+  Have: if (n <= 1) then (p = 1) else ((x / L_fact(n_1)) = p).
   (* Then *)
   Have: 2 <= n_1.
 }
-Prove: if (n <= 1) then (x = n_1) else (n_1 <= x).
+Prove: if (n <= 1) then (x_1 = n_1) else (n_1 <= x_1).
 
 ------------------------------------------------------------
 
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_string.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_string.0.res.oracle
index f6ac9a650aea8ed15b1ca16eb05f2209f1930beb..b4064b7e456bf12587e7955b68599430469ffddc 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_string.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_string.0.res.oracle
@@ -23,8 +23,8 @@ Prove: true.
 
 Goal Preservation of Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29):
 Let x = Mchar_0[ss_0].
-Let x_1 = s.base.
 Let a = shift_sint8(s, L_Length(Mchar_0, s)).
+Let x_1 = s.base.
 Let a_1 = shift_sint8(ss_0, 1).
 Assume {
   Type: is_sint8(x).
@@ -34,13 +34,15 @@ Assume {
   Have: P_Length_of_str_is(Malloc_0, Mchar_0, s, i).
   (* Pre-condition *)
   Have: P_Length_of_str_is(Malloc_0, Mchar_0, s, i_1).
-  (* Invariant 'ZERO' *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> (((i_2 + s.offset) < ss_0.offset) ->
-      (Mchar_0[shift_sint8(s, i_2)] != 0))).
   (* Invariant 'RANGE' *)
-  Have: addr_le(s, ss_0) /\ addr_le(ss_0, a).
+  Have: addr_le(s, s) /\ addr_le(s, a).
   (* Invariant 'BASE' *)
   Have: ss_0.base = x_1.
+  (* Invariant 'RANGE' *)
+  Have: addr_le(s, ss_0) /\ addr_le(ss_0, a).
+  (* Invariant 'ZERO' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> (((i_2 + s.offset) < ss_0.offset) ->
+      (Mchar_0[shift_sint8(s, i_2)] != 0))).
   (* Then *)
   Have: x != 0.
 }
@@ -62,30 +64,35 @@ Prove: addr_le(s, s) /\ addr_le(s, shift_sint8(s, L_Length(Mchar_0, s))).
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30):
+Let a = shift_sint8(ss_0, 1).
+Let a_1 = shift_sint8(s, L_Length(Mchar_0, s)).
 Let x = Mchar_0[ss_0].
-Let x_1 = s.base.
-Let x_2 = s.offset.
-Let x_3 = ss_0.offset.
+Let x_1 = s.offset.
+Let x_2 = ss_0.offset.
+Let x_3 = s.base.
 Assume {
   Type: is_sint8(x).
   (* Heap *)
-  Type: (region(x_1) <= 0) /\ linked(Malloc_0) /\ sconst(Mchar_0).
+  Type: (region(x_3) <= 0) /\ linked(Malloc_0) /\ sconst(Mchar_0).
   (* Goal *)
-  When: (0 <= i) /\ ((i + x_2) <= x_3).
+  When: (0 <= i) /\ ((i + x_1) <= x_2).
   (* Pre-condition *)
   Have: P_Length_of_str_is(Malloc_0, Mchar_0, s, i_1).
   (* Pre-condition *)
   Have: P_Length_of_str_is(Malloc_0, Mchar_0, s, i_2).
-  (* Invariant 'ZERO' *)
-  Have: forall i_3 : Z. ((0 <= i_3) -> (((i_3 + x_2) < x_3) ->
-      (Mchar_0[shift_sint8(s, i_3)] != 0))).
   (* Invariant 'RANGE' *)
-  Have: addr_le(s, ss_0) /\
-      addr_le(ss_0, shift_sint8(s, L_Length(Mchar_0, s))).
+  Have: addr_le(s, s) /\ addr_le(s, a_1).
   (* Invariant 'BASE' *)
-  Have: ss_0.base = x_1.
+  Have: ss_0.base = x_3.
+  (* Invariant 'RANGE' *)
+  Have: addr_le(s, ss_0) /\ addr_le(ss_0, a_1).
+  (* Invariant 'ZERO' *)
+  Have: forall i_3 : Z. ((0 <= i_3) -> (((i_3 + x_1) < x_2) ->
+      (Mchar_0[shift_sint8(s, i_3)] != 0))).
   (* Then *)
   Have: x != 0.
+  (* Invariant 'RANGE' *)
+  Have: addr_le(s, a) /\ addr_le(a, a_1).
 }
 Prove: Mchar_0[shift_sint8(s, i)] != 0.
 
@@ -97,28 +104,30 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Assertion 'END' (file tests/wp_typed/user_string.i, line 37):
-Let x = s.base.
-Let x_1 = s.offset.
-Let x_2 = ss_0.offset.
+Let x = s.offset.
+Let x_1 = ss_0.offset.
+Let a = shift_sint8(s, L_Length(Mchar_0, s)).
+Let x_2 = s.base.
 Assume {
   (* Heap *)
-  Type: (region(x) <= 0) /\ linked(Malloc_0) /\ sconst(Mchar_0).
+  Type: (region(x_2) <= 0) /\ linked(Malloc_0) /\ sconst(Mchar_0).
   (* Pre-condition *)
   Have: P_Length_of_str_is(Malloc_0, Mchar_0, s, i).
   (* Pre-condition *)
   Have: P_Length_of_str_is(Malloc_0, Mchar_0, s, i_1).
-  (* Invariant 'ZERO' *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> (((i_2 + x_1) < x_2) ->
-      (Mchar_0[shift_sint8(s, i_2)] != 0))).
   (* Invariant 'RANGE' *)
-  Have: addr_le(s, ss_0) /\
-      addr_le(ss_0, shift_sint8(s, L_Length(Mchar_0, s))).
+  Have: addr_le(s, s) /\ addr_le(s, a).
   (* Invariant 'BASE' *)
-  Have: ss_0.base = x.
+  Have: ss_0.base = x_2.
+  (* Invariant 'RANGE' *)
+  Have: addr_le(s, ss_0) /\ addr_le(ss_0, a).
+  (* Invariant 'ZERO' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> (((i_2 + x) < x_1) ->
+      (Mchar_0[shift_sint8(s, i_2)] != 0))).
   (* Else *)
   Have: Mchar_0[ss_0] = 0.
 }
-Prove: P_Length_of_str_is(Malloc_0, Mchar_0, s, x_2 - x_1).
+Prove: P_Length_of_str_is(Malloc_0, Mchar_0, s, x_1 - x).
 
 ------------------------------------------------------------
 
@@ -145,29 +154,38 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Positivity of Loop variant at loop (file tests/wp_typed/user_string.i, line 34):
-Let x = Mchar_0[ss_0].
-Let x_1 = s.base.
+Let x = s.offset.
+Let x_1 = ss_0.offset.
+Let a = shift_sint8(ss_0, 1).
 Let x_2 = L_Length(Mchar_0, s).
-Let x_3 = s.offset.
-Let x_4 = ss_0.offset.
+Let a_1 = shift_sint8(s, x_2).
+Let x_3 = Mchar_0[ss_0].
+Let x_4 = s.base.
 Assume {
-  Type: is_sint8(x).
+  Type: is_sint8(x_3).
   (* Heap *)
-  Type: (region(x_1) <= 0) /\ linked(Malloc_0) /\ sconst(Mchar_0).
+  Type: (region(x_4) <= 0) /\ linked(Malloc_0) /\ sconst(Mchar_0).
   (* Pre-condition *)
   Have: P_Length_of_str_is(Malloc_0, Mchar_0, s, i).
   (* Pre-condition *)
   Have: P_Length_of_str_is(Malloc_0, Mchar_0, s, i_1).
-  (* Invariant 'ZERO' *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> (((i_2 + x_3) < x_4) ->
-      (Mchar_0[shift_sint8(s, i_2)] != 0))).
   (* Invariant 'RANGE' *)
-  Have: addr_le(s, ss_0) /\ addr_le(ss_0, shift_sint8(s, x_2)).
+  Have: addr_le(s, s) /\ addr_le(s, a_1).
   (* Invariant 'BASE' *)
-  Have: ss_0.base = x_1.
+  Have: ss_0.base = x_4.
+  (* Invariant 'RANGE' *)
+  Have: addr_le(s, ss_0) /\ addr_le(ss_0, a_1).
+  (* Invariant 'ZERO' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> (((i_2 + x) < x_1) ->
+      (Mchar_0[shift_sint8(s, i_2)] != 0))).
   (* Then *)
-  Have: x != 0.
+  Have: x_3 != 0.
+  (* Invariant 'RANGE' *)
+  Have: addr_le(s, a) /\ addr_le(a, a_1).
+  (* Invariant 'ZERO' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> (((i_2 + x) <= x_1) ->
+      (Mchar_0[shift_sint8(s, i_2)] != 0))).
 }
-Prove: x_4 <= (x_3 + x_2).
+Prove: x_1 <= (x + x_2).
 
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_string.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_string.1.res.oracle
index b0256f00b0c4d77b72ad77ee1e2fd7ab3bb14df3..eebd87021afbb6c20969ed937a9d851eae92ae54 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_string.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_string.1.res.oracle
@@ -23,8 +23,8 @@ Prove: true.
 
 Goal Preservation of Invariant 'RANGE' (file tests/wp_typed/user_string.i, line 29):
 Let x = Mchar_0[ss_0].
-Let x_1 = s.base.
 Let a = shift_sint8(s, L_Length(Mchar_0, s)).
+Let x_1 = s.base.
 Let a_1 = shift_sint8(ss_0, 1).
 Assume {
   Type: is_sint8(x).
@@ -34,13 +34,15 @@ Assume {
   Have: P_Length_of_str_is(Malloc_0, Mchar_0, s, i).
   (* Pre-condition *)
   Have: P_Length_of_str_is(Malloc_0, Mchar_0, s, i_1).
-  (* Invariant 'ZERO' *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> (((i_2 + s.offset) < ss_0.offset) ->
-      (Mchar_0[shift_sint8(s, i_2)] != 0))).
   (* Invariant 'RANGE' *)
-  Have: addr_le(s, ss_0) /\ addr_le(ss_0, a).
+  Have: addr_le(s, s) /\ addr_le(s, a).
   (* Invariant 'BASE' *)
   Have: ss_0.base = x_1.
+  (* Invariant 'RANGE' *)
+  Have: addr_le(s, ss_0) /\ addr_le(ss_0, a).
+  (* Invariant 'ZERO' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> (((i_2 + s.offset) < ss_0.offset) ->
+      (Mchar_0[shift_sint8(s, i_2)] != 0))).
   (* Then *)
   Have: x != 0.
 }
@@ -62,30 +64,35 @@ Prove: addr_le(s, s) /\ addr_le(s, shift_sint8(s, L_Length(Mchar_0, s))).
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'ZERO' (file tests/wp_typed/user_string.i, line 30):
+Let a = shift_sint8(ss_0, 1).
+Let a_1 = shift_sint8(s, L_Length(Mchar_0, s)).
 Let x = Mchar_0[ss_0].
-Let x_1 = s.base.
-Let x_2 = s.offset.
-Let x_3 = ss_0.offset.
+Let x_1 = s.offset.
+Let x_2 = ss_0.offset.
+Let x_3 = s.base.
 Assume {
   Type: is_sint8(x).
   (* Heap *)
-  Type: (region(x_1) <= 0) /\ linked(Malloc_0) /\ sconst(Mchar_0).
+  Type: (region(x_3) <= 0) /\ linked(Malloc_0) /\ sconst(Mchar_0).
   (* Goal *)
-  When: (0 <= i) /\ ((i + x_2) <= x_3).
+  When: (0 <= i) /\ ((i + x_1) <= x_2).
   (* Pre-condition *)
   Have: P_Length_of_str_is(Malloc_0, Mchar_0, s, i_1).
   (* Pre-condition *)
   Have: P_Length_of_str_is(Malloc_0, Mchar_0, s, i_2).
-  (* Invariant 'ZERO' *)
-  Have: forall i_3 : Z. ((0 <= i_3) -> (((i_3 + x_2) < x_3) ->
-      (Mchar_0[shift_sint8(s, i_3)] != 0))).
   (* Invariant 'RANGE' *)
-  Have: addr_le(s, ss_0) /\
-      addr_le(ss_0, shift_sint8(s, L_Length(Mchar_0, s))).
+  Have: addr_le(s, s) /\ addr_le(s, a_1).
   (* Invariant 'BASE' *)
-  Have: ss_0.base = x_1.
+  Have: ss_0.base = x_3.
+  (* Invariant 'RANGE' *)
+  Have: addr_le(s, ss_0) /\ addr_le(ss_0, a_1).
+  (* Invariant 'ZERO' *)
+  Have: forall i_3 : Z. ((0 <= i_3) -> (((i_3 + x_1) < x_2) ->
+      (Mchar_0[shift_sint8(s, i_3)] != 0))).
   (* Then *)
   Have: x != 0.
+  (* Invariant 'RANGE' *)
+  Have: addr_le(s, a) /\ addr_le(a, a_1).
 }
 Prove: Mchar_0[shift_sint8(s, i)] != 0.
 
@@ -97,28 +104,30 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Assertion 'END' (file tests/wp_typed/user_string.i, line 37):
-Let x = s.base.
-Let x_1 = s.offset.
-Let x_2 = ss_0.offset.
+Let x = s.offset.
+Let x_1 = ss_0.offset.
+Let a = shift_sint8(s, L_Length(Mchar_0, s)).
+Let x_2 = s.base.
 Assume {
   (* Heap *)
-  Type: (region(x) <= 0) /\ linked(Malloc_0) /\ sconst(Mchar_0).
+  Type: (region(x_2) <= 0) /\ linked(Malloc_0) /\ sconst(Mchar_0).
   (* Pre-condition *)
   Have: P_Length_of_str_is(Malloc_0, Mchar_0, s, i).
   (* Pre-condition *)
   Have: P_Length_of_str_is(Malloc_0, Mchar_0, s, i_1).
-  (* Invariant 'ZERO' *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> (((i_2 + x_1) < x_2) ->
-      (Mchar_0[shift_sint8(s, i_2)] != 0))).
   (* Invariant 'RANGE' *)
-  Have: addr_le(s, ss_0) /\
-      addr_le(ss_0, shift_sint8(s, L_Length(Mchar_0, s))).
+  Have: addr_le(s, s) /\ addr_le(s, a).
   (* Invariant 'BASE' *)
-  Have: ss_0.base = x.
+  Have: ss_0.base = x_2.
+  (* Invariant 'RANGE' *)
+  Have: addr_le(s, ss_0) /\ addr_le(ss_0, a).
+  (* Invariant 'ZERO' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> (((i_2 + x) < x_1) ->
+      (Mchar_0[shift_sint8(s, i_2)] != 0))).
   (* Else *)
   Have: Mchar_0[ss_0] = 0.
 }
-Prove: P_Length_of_str_is(Malloc_0, Mchar_0, s, x_2 - x_1).
+Prove: P_Length_of_str_is(Malloc_0, Mchar_0, s, x_1 - x).
 
 ------------------------------------------------------------
 
@@ -145,29 +154,38 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Positivity of Loop variant at loop (file tests/wp_typed/user_string.i, line 34):
-Let x = Mchar_0[ss_0].
-Let x_1 = s.base.
+Let x = s.offset.
+Let x_1 = ss_0.offset.
+Let a = shift_sint8(ss_0, 1).
 Let x_2 = L_Length(Mchar_0, s).
-Let x_3 = s.offset.
-Let x_4 = ss_0.offset.
+Let a_1 = shift_sint8(s, x_2).
+Let x_3 = Mchar_0[ss_0].
+Let x_4 = s.base.
 Assume {
-  Type: is_sint8(x).
+  Type: is_sint8(x_3).
   (* Heap *)
-  Type: (region(x_1) <= 0) /\ linked(Malloc_0) /\ sconst(Mchar_0).
+  Type: (region(x_4) <= 0) /\ linked(Malloc_0) /\ sconst(Mchar_0).
   (* Pre-condition *)
   Have: P_Length_of_str_is(Malloc_0, Mchar_0, s, i).
   (* Pre-condition *)
   Have: P_Length_of_str_is(Malloc_0, Mchar_0, s, i_1).
-  (* Invariant 'ZERO' *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> (((i_2 + x_3) < x_4) ->
-      (Mchar_0[shift_sint8(s, i_2)] != 0))).
   (* Invariant 'RANGE' *)
-  Have: addr_le(s, ss_0) /\ addr_le(ss_0, shift_sint8(s, x_2)).
+  Have: addr_le(s, s) /\ addr_le(s, a_1).
   (* Invariant 'BASE' *)
-  Have: ss_0.base = x_1.
+  Have: ss_0.base = x_4.
+  (* Invariant 'RANGE' *)
+  Have: addr_le(s, ss_0) /\ addr_le(ss_0, a_1).
+  (* Invariant 'ZERO' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> (((i_2 + x) < x_1) ->
+      (Mchar_0[shift_sint8(s, i_2)] != 0))).
   (* Then *)
-  Have: x != 0.
+  Have: x_3 != 0.
+  (* Invariant 'RANGE' *)
+  Have: addr_le(s, a) /\ addr_le(a, a_1).
+  (* Invariant 'ZERO' *)
+  Have: forall i_2 : Z. ((0 <= i_2) -> (((i_2 + x) <= x_1) ->
+      (Mchar_0[shift_sint8(s, i_2)] != 0))).
 }
-Prove: x_4 <= (x_3 + x_2).
+Prove: x_1 <= (x + x_2).
 
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_exit_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_exit_part2.json
index a187150cc649f2fe0559e01565b0547de2fada18..aa52fbebd0ceb26b098784cbb877f8bdadb051e6 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_exit_part2.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_exit_part2.json
@@ -1,6 +1,6 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
-                "target": "exists i_0,i_1:int.\n(i_0<=i_136) /\\ (i_1<=i_137) /\\ (0<=i_0) /\\ (i_136<=i_0) /\\ (i_137<=i_1)\n/\\ (i_0<=9)",
+                "target": "exists i_0,i_1:int.\n(i_0<=i_138) /\\ (i_1<=i_139) /\\ (0<=i_0) /\\ (i_138<=i_0) /\\ (i_139<=i_1)\n/\\ (i_0<=9)",
                 "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
                                   "verdict": "valid", "time": 0.0088,
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_normal_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_normal_part2.json
index a187150cc649f2fe0559e01565b0547de2fada18..aa52fbebd0ceb26b098784cbb877f8bdadb051e6 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_normal_part2.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_normal_part2.json
@@ -1,6 +1,6 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
-                "target": "exists i_0,i_1:int.\n(i_0<=i_136) /\\ (i_1<=i_137) /\\ (0<=i_0) /\\ (i_136<=i_0) /\\ (i_137<=i_1)\n/\\ (i_0<=9)",
+                "target": "exists i_0,i_1:int.\n(i_0<=i_138) /\\ (i_1<=i_139) /\\ (0<=i_0) /\\ (i_138<=i_0) /\\ (i_139<=i_1)\n/\\ (i_0<=9)",
                 "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
                                   "verdict": "valid", "time": 0.0088,
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part2.json
index baf7c5bf62b542aa313b0d746286e799b93e67b8..820cbd3fc5e4f803e38f914bb981e386dfc27b4a 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part2.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part2.json
@@ -3,8 +3,8 @@
                 "target": "exists i_0,i_1:int.\n(i_0<=i_9) /\\ (i_1<=i_10) /\\ (0<=i_0) /\\ (i_9<=i_0) /\\ (i_10<=i_1)\n/\\ (i_0<=9)",
                 "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0279,
-                                  "steps": 41 } ],
+                                  "verdict": "valid", "time": 0.0124,
+                                  "steps": 43 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.021,
-                                  "steps": 41 } ] } } ]
+                                  "verdict": "valid", "time": 0.0121,
+                                  "steps": 43 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part3.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part3.json
index cae89d2a942aa4f3f67bfeab7a4b6962d46fc0a4..abaf79ffd0a939aaa9f4c60806bc8f8890d897a9 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part3.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part3.json
@@ -1,10 +1,10 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
-                "target": "exists i_1,i_2:int.\n(i_1<=i_0) /\\ (i_2<=i_3) /\\ (0<=i_1) /\\ (i_0<=i_1) /\\ (i_3<=i_2) /\\ (i_1<=9)",
+                "target": "exists i_0,i_2:int.\n(i_0<=i_1) /\\ (i_2<=i_3) /\\ (0<=i_0) /\\ (i_1<=i_0) /\\ (i_3<=i_2) /\\ (i_0<=9)",
                 "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.009,
-                                  "steps": 29 } ],
+                                  "verdict": "valid", "time": 0.0074,
+                                  "steps": 31 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0131,
-                                  "steps": 29 } ] } } ]
+                                  "verdict": "valid", "time": 0.0078,
+                                  "steps": 31 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_assigns_part2.json
index 2ee61e01ef268896d390d325575ef4051af1088e..a158cb35d7024c69250c2c6f61b9f41654bcb56a 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_assigns_part2.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_assigns_part2.json
@@ -1,6 +1,6 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
-                "target": "exists i_0,i_1:int.\n(i_0<=i_156) /\\ (i_1<=i_157) /\\ (0<=i_0) /\\ (i_156<=i_0) /\\ (i_157<=i_1)\n/\\ (i_0<=9)",
+                "target": "exists i_0,i_1:int.\n(i_0<=i_158) /\\ (i_1<=i_159) /\\ (0<=i_0) /\\ (i_158<=i_0) /\\ (i_159<=i_1)\n/\\ (i_0<=9)",
                 "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
                                   "verdict": "valid", "time": 0.011,
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part2.json
index 6a684ed4e4fa19eaae36dd09d3b7717df0c65a0e..18643516046a339dee16a82e44473e2dc722f1ac 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part2.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part2.json
@@ -3,8 +3,8 @@
                 "target": "exists i_0,i_1:int.\n(i_0<=i_13) /\\ (i_1<=i_14) /\\ (0<=i_0) /\\ (i_13<=i_0) /\\ (i_14<=i_1)\n/\\ (i_0<=9)",
                 "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0202,
-                                  "steps": 40 } ],
+                                  "verdict": "valid", "time": 0.0099,
+                                  "steps": 42 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0177,
-                                  "steps": 40 } ] } } ]
+                                  "verdict": "valid", "time": 0.0124,
+                                  "steps": 42 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part3.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part3.json
index 578ffb9958aef6bacf33cb5680b0ecbafe0f5efe..522d6695a5bb42790b4084770155336d47a74f8e 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part3.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part3.json
@@ -1,10 +1,10 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
-                "target": "exists i_0,i_2:int.\n(i_0<=i_1) /\\ (0<=i_0) /\\ (i_1<=i_0) /\\ (j_0<=i_2) /\\ (i_2<=j_0) /\\ (i_0<=9)",
+                "target": "exists i_0,i_2:int.\n(i_0<=i_1) /\\ (0<=i_0) /\\ (i_1<=i_0) /\\ (j_1<=i_2) /\\ (i_2<=j_1) /\\ (i_0<=9)",
                 "pattern": "\\E$i0$i$j$j9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0143,
-                                  "steps": 24 } ],
+                                  "verdict": "valid", "time": 0.0094,
+                                  "steps": 26 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0146,
-                                  "steps": 24 } ] } } ]
+                                  "verdict": "valid", "time": 0.0101,
+                                  "steps": 26 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part2.json
index 72b93b5526df3a049e39f88a0d1809d9e3ec6941..71531584b1405a92d8ecee2ed8fe30b8fd988d3f 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part2.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part2.json
@@ -3,8 +3,8 @@
                 "target": "exists i_0,i_1:int.\n(i_0<=i_21) /\\ (i_1<=i_22) /\\ (0<=i_0) /\\ (i_21<=i_0) /\\ (i_22<=i_1)\n/\\ (i_0<=9)",
                 "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.016,
-                                  "steps": 33 } ],
+                                  "verdict": "valid", "time": 0.0098,
+                                  "steps": 35 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0161,
-                                  "steps": 33 } ] } } ]
+                                  "verdict": "valid", "time": 0.0048,
+                                  "steps": 35 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part3.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part3.json
index 09755e2c851424c8871e943d93a05b0253bf1db9..0528b3f539e087d7ffe5b4a4a6ebc4bbce7590eb 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part3.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part3.json
@@ -3,8 +3,8 @@
                 "target": "exists i_0,i_1:int.\n(i_0<=i_8) /\\ (i_1<=i_9) /\\ (0<=i_0) /\\ (i_8<=i_0) /\\ (i_9<=i_1) /\\ (i_0<=9)",
                 "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.016,
-                                  "steps": 33 } ],
+                                  "verdict": "valid", "time": 0.0098,
+                                  "steps": 35 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0161,
-                                  "steps": 33 } ] } } ]
+                                  "verdict": "valid", "time": 0.0048,
+                                  "steps": 35 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_assigns_part2.json
index cb380dd3e39f3d5b41787e5481e2eb7b62264873..aa273fd1e8bb18e8fc52a27351743fe17f464122 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_assigns_part2.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_assigns_part2.json
@@ -1,6 +1,6 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
-                "target": "exists i_0,i_1:int.\n(i_0<=i_148) /\\ (i_1<=i_149) /\\ (0<=i_0) /\\ (i_148<=i_0) /\\ (i_149<=i_1)\n/\\ (i_0<=9)",
+                "target": "exists i_0,i_1:int.\n(i_0<=i_149) /\\ (i_1<=i_150) /\\ (0<=i_0) /\\ (i_149<=i_0) /\\ (i_150<=i_1)\n/\\ (i_0<=9)",
                 "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
                                   "verdict": "valid", "time": 0.011,
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part2.json
index 706eac2712b2643fdff1c6caaea6ca9725f711ad..3b3491906df49d091101db28c4d58660fed8180a 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part2.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part2.json
@@ -3,8 +3,8 @@
                 "target": "exists i_0,i_1:int.\n(i_0<=i_13) /\\ (i_1<=i_14) /\\ (0<=i_0) /\\ (i_13<=i_0) /\\ (i_14<=i_1)\n/\\ (i_0<=9)",
                 "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0209,
-                                  "steps": 39 } ],
+                                  "verdict": "valid", "time": 0.0139,
+                                  "steps": 45 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0184,
-                                  "steps": 39 } ] } } ]
+                                  "verdict": "valid", "time": 0.0127,
+                                  "steps": 45 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part3.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part3.json
index d035bcd5046d5abb9450a6bd66795f980f87369f..c31beeea1dd2a6726bca67f972e4aebb07a292c7 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part3.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part3.json
@@ -3,8 +3,8 @@
                 "target": "exists i_0,i_1:int.\n(i_0<=i_4) /\\ (i_1<=i_6) /\\ (0<=i_0) /\\ (i_4<=i_0) /\\ (i_6<=i_1) /\\ (i_0<=9)",
                 "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0146,
-                                  "steps": 27 } ],
+                                  "verdict": "valid", "time": 0.0169,
+                                  "steps": 33 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0143,
-                                  "steps": 27 } ] } } ]
+                                  "verdict": "valid", "time": 0.0081,
+                                  "steps": 33 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_typed/user_init.i b/src/plugins/wp/tests/wp_typed/user_init.i
index 6bda4f9640bfb6620309aca3950bd93c093b81e5..251dcd36298a05a068bd1d12adb9cc898e1de159 100644
--- a/src/plugins/wp/tests/wp_typed/user_init.i
+++ b/src/plugins/wp/tests/wp_typed/user_init.i
@@ -1,5 +1,5 @@
 /* run.config_qualif
-   EXECNOW: rm -rf @PTEST_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.1.session/script
+   EXECNOW: rm -rf @PTEST_SUITE_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.1.session/script
    OPT: -wp-prop=-lack,-tactic
    OPT: -wp-prop=tactic -wp-auto=wp:split,wp:range -wp-prover=tip,alt-ergo
    OPT: -wp-prop=lack
diff --git a/src/plugins/wp/tests/wp_usage/oracle/caveat2.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/caveat2.res.oracle
index e5407bbcb4c8cf4efe72f5628e6a2a6edd6cdb67..486046a75d95dd31ea6983a70226967d14b556bf 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/caveat2.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/caveat2.res.oracle
@@ -22,15 +22,17 @@ Assume {
   (* Goal *)
   When: (0 <= i) /\ (i < n).
   (* Pre-condition *)
-  Have: (0 <= n) /\ (n <= 3).
+  Have: n <= 3.
   Have: ({ Init_p_0 with Init_F1_S_n = true }) = Init_p_0.
+  (* Invariant *)
+  Have: 0 <= n.
   (* Loop assigns ... *)
   Have: ({ Init_p_0 with Init_F1_S_a = v_1 }) = Init_p_0.
   (* Invariant *)
+  Have: (0 <= i_1) /\ (i_1 <= n).
+  (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
       (Mint_0[shift_sint32(a, i_2)] = v[i_2]))).
-  (* Invariant *)
-  Have: (0 <= i_1) /\ (i_1 <= n).
   (* Else *)
   Have: n <= i_1.
 }
@@ -42,15 +44,17 @@ Goal Preservation of Invariant (file tests/wp_usage/caveat2.i, line 21):
 Assume {
   Type: is_sint32(i) /\ is_sint32(n) /\ is_sint32(1 + i).
   (* Pre-condition *)
-  Have: (0 <= n) /\ (n <= 3).
+  Have: n <= 3.
   Have: ({ Init_p_0 with Init_F1_S_n = true }) = Init_p_0.
+  (* Invariant *)
+  Have: 0 <= n.
   (* Loop assigns ... *)
   Have: ({ Init_p_0 with Init_F1_S_a = v }) = Init_p_0.
   (* Invariant *)
+  Have: (0 <= i) /\ (i <= n).
+  (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       (Mint_0[shift_sint32(global(G_b_26), i_1)] = v_1[i_1]))).
-  (* Invariant *)
-  Have: (0 <= i) /\ (i <= n).
   (* Then *)
   Have: i < n.
 }
@@ -70,17 +74,21 @@ Assume {
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 <= i).
   (* Pre-condition *)
-  Have: (0 <= n) /\ (n <= 3).
+  Have: n <= 3.
   Have: ({ Init_p_0 with Init_F1_S_n = true }) = Init_p_0.
+  (* Invariant *)
+  Have: 0 <= n.
   (* Loop assigns ... *)
   Have: ({ Init_p_0 with Init_F1_S_a = v_1 }) = Init_p_0.
   (* Invariant *)
+  Have: (0 <= i) /\ (i <= n).
+  (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       (Mint_0[shift_sint32(a, i_2)] = v[i_2]))).
-  (* Invariant *)
-  Have: (0 <= i) /\ (i <= n).
   (* Then *)
   Have: i < n.
+  (* Invariant *)
+  Have: (-1) <= i.
 }
 Prove: v[i <- Mint_0[shift_sint32(a, i)]][i_1] = Mint_0[shift_sint32(a, i_1)].
 
diff --git a/src/plugins/wp/tests/wp_usage/oracle/caveat_range.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/caveat_range.res.oracle
index ed2e13b489691f40aaf2bad6e32707de396479f7..1d87f4750391556230fd7dcb7018245a44713b6f 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/caveat_range.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/caveat_range.res.oracle
@@ -14,13 +14,13 @@ Assume {
   (* Goal *)
   When: (0 <= i) /\ (i <= 9).
   (* Invariant *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
+  Have: (0 <= i_1) /\ (i_1 <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
       (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
   (* Invariant *)
-  Have: (0 <= i_1) /\ (i_1 <= 10).
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
+      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
   (* Else *)
   Have: 10 <= i_1.
 }
@@ -36,13 +36,13 @@ Assume {
   (* Goal *)
   When: (0 <= i) /\ (i <= 9).
   (* Invariant *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
+  Have: (0 <= i_1) /\ (i_1 <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
       (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
   (* Invariant *)
-  Have: (0 <= i_1) /\ (i_1 <= 10).
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
+      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
   (* Else *)
   Have: 10 <= i_1.
 }
@@ -56,13 +56,13 @@ Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S1_S(a, 0), 20).
 Assume {
   Type: is_sint32(i) /\ is_sint32(1 + i).
   (* Invariant *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_1))] = 2))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_1))] = 1))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
+      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_1))] = 2))).
   (* Then *)
   Have: i <= 9.
 }
@@ -83,15 +83,17 @@ Assume {
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 <= i).
   (* Invariant *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
+      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
   (* Then *)
   Have: i <= 9.
+  (* Invariant *)
+  Have: (-1) <= i.
 }
 Prove: a_1[shiftfield_F1_S_f(shift_S1_S(a, i)) <- 1]
          [shiftfield_F1_S_f(shift_S1_S(a, i_1))] = 1.
@@ -107,22 +109,28 @@ Goal Preservation of Invariant (file tests/wp_usage/caveat_range.i, line 21):
 Let a = global(G_p_22).
 Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S1_S(a, 0), 20).
 Let a_2 = shift_S1_S(a, i).
+Let a_3 = a_1[shiftfield_F1_S_f(a_2) <- 1].
 Assume {
   Type: is_sint32(i) /\ is_sint32(1 + i).
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 <= i).
   (* Invariant *)
-  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
+  Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
       (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
   (* Invariant *)
-  Have: (0 <= i) /\ (i <= 10).
+  Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
+      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
   (* Then *)
   Have: i <= 9.
+  (* Invariant *)
+  Have: (-1) <= i.
+  (* Invariant *)
+  Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
+      (a_3[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
 }
-Prove: a_1[shiftfield_F1_S_f(a_2) <- 1][shiftfield_F1_S_g(a_2) <- 2]
+Prove: a_3[shiftfield_F1_S_g(a_2) <- 2]
          [shiftfield_F1_S_g(shift_S1_S(a, i_1))] = 2.
 
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.0.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.0.res.oracle
index f5e6746b9b82b0a337df477dc3fd35f1053fd278..3d4ea749002b687906322345b288b9470ab18698 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.0.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.0.res.oracle
@@ -7,11 +7,11 @@
 ------------------------------------------------------------
 
 Goal Post-condition 'memcpy' in 'memcpy_alias_vars':
-Let a = Mptr_0[global(P_src_24)].
-Let a_1 = Mptr_0[global(P_dst_25)].
-Let a_2 = shift_uint8(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, len_0).
-Let a_4 = shift_uint8(a, 0).
+Let a = Mptr_0[global(P_dst_25)].
+Let a_1 = shift_uint8(a, 0).
+Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_3 = Mptr_0[global(P_src_24)].
+Let a_4 = shift_uint8(a_3, 0).
 Assume {
   Type: is_sint32(len_0) /\ is_sint32(len_1).
   (* Heap *)
@@ -19,34 +19,34 @@ Assume {
   (* Goal *)
   When: (0 <= i) /\ ((2 + i) <= len_0).
   (* Pre-condition 'write_access' *)
-  Have: valid_rw(Malloc_0, a_2, len_0).
+  Have: valid_rw(Malloc_0, a_1, len_0).
   (* Pre-condition 'read_access' *)
   Have: valid_rd(Malloc_0, a_4, len_0).
   (* Pre-condition 'unaliasing' *)
-  Have: separated(a_2, len_0, a_4, len_0).
-  (* Invariant 'cpy' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
-      (a_3[shift_uint8(a, i_1)] = a_3[shift_uint8(a_1, i_1)]))).
-  (* Invariant 'dst' *)
-  Have: shift_uint8(a_1, len_0) = shift_uint8(v, len_1).
-  (* Invariant 'src' *)
-  Have: shift_uint8(a, len_0) = shift_uint8(v_1, len_1).
+  Have: separated(a_1, len_0, a_4, len_0).
   (* Invariant 'len' *)
   Have: len_1 <= len_0.
+  (* Invariant 'src' *)
+  Have: shift_uint8(a_3, len_0) = shift_uint8(v, len_1).
+  (* Invariant 'dst' *)
+  Have: shift_uint8(a, len_0) = shift_uint8(v_1, len_1).
+  (* Invariant 'cpy' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
+      (a_2[shift_uint8(a_3, i_1)] = a_2[shift_uint8(a, i_1)]))).
   (* Else *)
   Have: len_1 <= 0.
 }
-Prove: a_3[shift_uint8(a_1, i)] = Mint_0[shift_uint8(a, i)].
+Prove: a_2[shift_uint8(a, i)] = Mint_0[shift_uint8(a_3, i)].
 
 ------------------------------------------------------------
 
 Goal Post-condition 'unmodified' in 'memcpy_alias_vars':
-Let a = Mptr_0[global(P_src_24)].
-Let a_1 = Mptr_0[global(P_dst_25)].
-Let a_2 = shift_uint8(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, len_0).
-Let a_4 = shift_uint8(a, 0).
-Let a_5 = shift_uint8(a, i).
+Let a = Mptr_0[global(P_dst_25)].
+Let a_1 = shift_uint8(a, 0).
+Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_3 = Mptr_0[global(P_src_24)].
+Let a_4 = shift_uint8(a_3, 0).
+Let a_5 = shift_uint8(a_3, i).
 Assume {
   Type: is_sint32(len_0) /\ is_sint32(len_1).
   (* Heap *)
@@ -54,34 +54,34 @@ Assume {
   (* Goal *)
   When: (0 <= i) /\ ((2 + i) <= len_0).
   (* Pre-condition 'write_access' *)
-  Have: valid_rw(Malloc_0, a_2, len_0).
+  Have: valid_rw(Malloc_0, a_1, len_0).
   (* Pre-condition 'read_access' *)
   Have: valid_rd(Malloc_0, a_4, len_0).
   (* Pre-condition 'unaliasing' *)
-  Have: separated(a_2, len_0, a_4, len_0).
-  (* Invariant 'cpy' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
-      (a_3[shift_uint8(a, i_1)] = a_3[shift_uint8(a_1, i_1)]))).
-  (* Invariant 'dst' *)
-  Have: shift_uint8(a_1, len_0) = shift_uint8(v, len_1).
-  (* Invariant 'src' *)
-  Have: shift_uint8(a, len_0) = shift_uint8(v_1, len_1).
+  Have: separated(a_1, len_0, a_4, len_0).
   (* Invariant 'len' *)
   Have: len_1 <= len_0.
+  (* Invariant 'src' *)
+  Have: shift_uint8(a_3, len_0) = shift_uint8(v, len_1).
+  (* Invariant 'dst' *)
+  Have: shift_uint8(a, len_0) = shift_uint8(v_1, len_1).
+  (* Invariant 'cpy' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
+      (a_2[shift_uint8(a_3, i_1)] = a_2[shift_uint8(a, i_1)]))).
   (* Else *)
   Have: len_1 <= 0.
 }
-Prove: a_3[a_5] = Mint_0[a_5].
+Prove: a_2[a_5] = Mint_0[a_5].
 
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'cpy' (file tests/wp_usage/issue-189-bis.i, line 27):
-Let a = Mptr_0[global(P_src_24)].
-Let a_1 = Mptr_0[global(P_dst_25)].
-Let a_2 = shift_uint8(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, len_0).
-Let a_4 = shift_uint8(a, 0).
-Let a_5 = a_3[v <- a_3[v_1]].
+Let a = Mptr_0[global(P_dst_25)].
+Let a_1 = shift_uint8(a, 0).
+Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_3 = Mptr_0[global(P_src_24)].
+Let a_4 = shift_uint8(a_3, 0).
+Let a_5 = a_2[v <- a_2[v_1]].
 Assume {
   Type: is_sint32(len_0) /\ is_sint32(len_1) /\ is_sint32(len_1 - 1).
   (* Heap *)
@@ -89,24 +89,26 @@ Assume {
   (* Goal *)
   When: (0 <= i) /\ ((i + len_1) <= len_0).
   (* Pre-condition 'write_access' *)
-  Have: valid_rw(Malloc_0, a_2, len_0).
+  Have: valid_rw(Malloc_0, a_1, len_0).
   (* Pre-condition 'read_access' *)
   Have: valid_rd(Malloc_0, a_4, len_0).
   (* Pre-condition 'unaliasing' *)
-  Have: separated(a_2, len_0, a_4, len_0).
-  (* Invariant 'cpy' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
-      (a_3[shift_uint8(a, i_1)] = a_3[shift_uint8(a_1, i_1)]))).
-  (* Invariant 'dst' *)
-  Have: shift_uint8(a_1, len_0) = shift_uint8(v, len_1).
-  (* Invariant 'src' *)
-  Have: shift_uint8(a, len_0) = shift_uint8(v_1, len_1).
+  Have: separated(a_1, len_0, a_4, len_0).
   (* Invariant 'len' *)
   Have: len_1 <= len_0.
+  (* Invariant 'src' *)
+  Have: shift_uint8(a_3, len_0) = shift_uint8(v_1, len_1).
+  (* Invariant 'dst' *)
+  Have: shift_uint8(a, len_0) = shift_uint8(v, len_1).
+  (* Invariant 'cpy' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
+      (a_2[shift_uint8(a_3, i_1)] = a_2[shift_uint8(a, i_1)]))).
   (* Then *)
   Have: 0 < len_1.
+  (* Invariant 'len' *)
+  Have: len_1 <= (1 + len_0).
 }
-Prove: a_5[shift_uint8(a, i)] = a_5[shift_uint8(a_1, i)].
+Prove: a_5[shift_uint8(a_3, i)] = a_5[shift_uint8(a, i)].
 
 ------------------------------------------------------------
 
@@ -126,30 +128,30 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'len' (file tests/wp_usage/issue-189-bis.i, line 23):
-Let a = Mptr_0[global(P_src_24)].
-Let a_1 = Mptr_0[global(P_dst_25)].
-Let a_2 = shift_uint8(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, len_1).
-Let a_4 = shift_uint8(a, 0).
+Let a = Mptr_0[global(P_dst_25)].
+Let a_1 = shift_uint8(a, 0).
+Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_1).
+Let a_3 = Mptr_0[global(P_src_24)].
+Let a_4 = shift_uint8(a_3, 0).
 Assume {
   Type: is_sint32(len_1) /\ is_sint32(len_0) /\ is_sint32(len_0 - 1).
   (* Heap *)
   Type: framed(Mptr_0) /\ linked(Malloc_0).
   (* Pre-condition 'write_access' *)
-  Have: valid_rw(Malloc_0, a_2, len_1).
+  Have: valid_rw(Malloc_0, a_1, len_1).
   (* Pre-condition 'read_access' *)
   Have: valid_rd(Malloc_0, a_4, len_1).
   (* Pre-condition 'unaliasing' *)
-  Have: separated(a_2, len_1, a_4, len_1).
-  (* Invariant 'cpy' *)
-  Have: forall i : Z. ((0 <= i) -> (((len_0 + i) < len_1) ->
-      (a_3[shift_uint8(a, i)] = a_3[shift_uint8(a_1, i)]))).
-  (* Invariant 'dst' *)
-  Have: shift_uint8(a_1, len_1) = shift_uint8(v, len_0).
-  (* Invariant 'src' *)
-  Have: shift_uint8(a, len_1) = shift_uint8(v_1, len_0).
+  Have: separated(a_1, len_1, a_4, len_1).
   (* Invariant 'len' *)
   Have: len_0 <= len_1.
+  (* Invariant 'src' *)
+  Have: shift_uint8(a_3, len_1) = shift_uint8(v, len_0).
+  (* Invariant 'dst' *)
+  Have: shift_uint8(a, len_1) = shift_uint8(v_1, len_0).
+  (* Invariant 'cpy' *)
+  Have: forall i : Z. ((0 <= i) -> (((len_0 + i) < len_1) ->
+      (a_2[shift_uint8(a_3, i)] = a_2[shift_uint8(a, i)]))).
   (* Then *)
   Have: 0 < len_0.
 }
@@ -191,38 +193,44 @@ Prove: true.
 
 Goal Loop assigns (file tests/wp_usage/issue-189-bis.i, line 26) (4/4):
 Effect at line 32
-Let a = global(P_src_24).
+Let a = global(P_dst_25).
 Let a_1 = Mptr_0[a].
-Let a_2 = global(P_dst_25).
-Let a_3 = Mptr_0[a_2].
-Let a_4 = shift_uint8(a_3, 0).
-Let a_5 = havoc(Mint_undef_0, Mint_0, a_4, len_0).
-Let a_6 = shift_uint8(a_1, 0).
+Let a_2 = shift_uint8(a_1, 0).
+Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, len_0).
+Let a_4 = a_3[v <- a_3[v_1]].
+Let a_5 = global(P_src_24).
+Let a_6 = Mptr_0[a_5].
+Let a_7 = shift_uint8(a_6, 0).
 Assume {
-  Type: is_sint32(len_0) /\ is_sint32(len_1).
+  Type: is_sint32(len_0) /\ is_sint32(len_1) /\ is_sint32(len_1 - 1).
   (* Heap *)
   Type: framed(Mptr_0) /\ linked(Malloc_0).
   (* Goal *)
   When: !invalid(Malloc_0[P_src_24 <- 1][P_dst_25 <- 1], v, 1).
   (* Pre-condition 'write_access' *)
-  Have: valid_rw(Malloc_0, a_4, len_0).
+  Have: valid_rw(Malloc_0, a_2, len_0).
   (* Pre-condition 'read_access' *)
-  Have: valid_rd(Malloc_0, a_6, len_0).
+  Have: valid_rd(Malloc_0, a_7, len_0).
   (* Pre-condition 'unaliasing' *)
-  Have: separated(a_4, len_0, a_6, len_0).
-  (* Invariant 'cpy' *)
-  Have: forall i : Z. ((0 <= i) -> (((len_1 + i) < len_0) ->
-      (a_5[shift_uint8(a_1, i)] = a_5[shift_uint8(a_3, i)]))).
-  (* Invariant 'dst' *)
-  Have: shift_uint8(a_3, len_0) = shift_uint8(v, len_1).
-  (* Invariant 'src' *)
-  Have: shift_uint8(a_1, len_0) = shift_uint8(v_1, len_1).
+  Have: separated(a_2, len_0, a_7, len_0).
   (* Invariant 'len' *)
   Have: len_1 <= len_0.
+  (* Invariant 'src' *)
+  Have: shift_uint8(a_6, len_0) = shift_uint8(v_1, len_1).
+  (* Invariant 'dst' *)
+  Have: shift_uint8(a_1, len_0) = shift_uint8(v, len_1).
+  (* Invariant 'cpy' *)
+  Have: forall i : Z. ((0 <= i) -> (((len_1 + i) < len_0) ->
+      (a_3[shift_uint8(a_6, i)] = a_3[shift_uint8(a_1, i)]))).
   (* Then *)
   Have: 0 < len_1.
+  (* Invariant 'len' *)
+  Have: len_1 <= (1 + len_0).
+  (* Invariant 'cpy' *)
+  Have: forall i : Z. ((0 <= i) -> (((len_1 + i) <= len_0) ->
+      (a_4[shift_uint8(a_6, i)] = a_4[shift_uint8(a_1, i)]))).
 }
-Prove: (a_2 = v) \/ (a = v) \/ included(v, 1, a_4, len_0).
+Prove: (a = v) \/ (a_5 = v) \/ included(v, 1, a_2, len_0).
 
 ------------------------------------------------------------
 
@@ -236,11 +244,11 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Post-condition 'memcpy,ok' in 'memcpy_context_vars':
-Let a = Mptr_0[global(P_src_47)].
-Let a_1 = Mptr_0[global(P_dst_48)].
-Let a_2 = shift_uint8(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, len_0).
-Let a_4 = shift_uint8(a, 0).
+Let a = Mptr_0[global(P_dst_48)].
+Let a_1 = shift_uint8(a, 0).
+Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_3 = Mptr_0[global(P_src_47)].
+Let a_4 = shift_uint8(a_3, 0).
 Assume {
   Type: is_sint32(len_0) /\ is_sint32(len_1).
   (* Heap *)
@@ -248,34 +256,34 @@ Assume {
   (* Goal *)
   When: (0 <= i) /\ ((2 + i) <= len_0).
   (* Pre-condition 'write_access' *)
-  Have: valid_rw(Malloc_0, a_2, len_0).
+  Have: valid_rw(Malloc_0, a_1, len_0).
   (* Pre-condition 'read_access' *)
   Have: valid_rd(Malloc_0, a_4, len_0).
   (* Pre-condition 'unaliasing' *)
-  Have: separated(a_2, len_0, a_4, len_0).
-  (* Invariant 'ok,cpy' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
-      (a_3[shift_uint8(a, i_1)] = a_3[shift_uint8(a_1, i_1)]))).
-  (* Invariant 'ok,dst' *)
-  Have: shift_uint8(a_1, len_0) = shift_uint8(dst2_0, len_1).
-  (* Invariant 'ok,src' *)
-  Have: shift_uint8(a, len_0) = shift_uint8(src2_0, len_1).
+  Have: separated(a_1, len_0, a_4, len_0).
   (* Invariant 'ok,len' *)
   Have: len_1 <= len_0.
+  (* Invariant 'ok,src' *)
+  Have: shift_uint8(a_3, len_0) = shift_uint8(src2_0, len_1).
+  (* Invariant 'ok,dst' *)
+  Have: shift_uint8(a, len_0) = shift_uint8(dst2_0, len_1).
+  (* Invariant 'ok,cpy' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
+      (a_2[shift_uint8(a_3, i_1)] = a_2[shift_uint8(a, i_1)]))).
   (* Else *)
   Have: len_1 <= 0.
 }
-Prove: a_3[shift_uint8(a_1, i)] = Mint_0[shift_uint8(a, i)].
+Prove: a_2[shift_uint8(a, i)] = Mint_0[shift_uint8(a_3, i)].
 
 ------------------------------------------------------------
 
 Goal Post-condition 'unmodified,ok' in 'memcpy_context_vars':
-Let a = Mptr_0[global(P_src_47)].
-Let a_1 = Mptr_0[global(P_dst_48)].
-Let a_2 = shift_uint8(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, len_0).
-Let a_4 = shift_uint8(a, 0).
-Let a_5 = shift_uint8(a, i).
+Let a = Mptr_0[global(P_dst_48)].
+Let a_1 = shift_uint8(a, 0).
+Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_3 = Mptr_0[global(P_src_47)].
+Let a_4 = shift_uint8(a_3, 0).
+Let a_5 = shift_uint8(a_3, i).
 Assume {
   Type: is_sint32(len_0) /\ is_sint32(len_1).
   (* Heap *)
@@ -283,34 +291,34 @@ Assume {
   (* Goal *)
   When: (0 <= i) /\ ((2 + i) <= len_0).
   (* Pre-condition 'write_access' *)
-  Have: valid_rw(Malloc_0, a_2, len_0).
+  Have: valid_rw(Malloc_0, a_1, len_0).
   (* Pre-condition 'read_access' *)
   Have: valid_rd(Malloc_0, a_4, len_0).
   (* Pre-condition 'unaliasing' *)
-  Have: separated(a_2, len_0, a_4, len_0).
-  (* Invariant 'ok,cpy' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
-      (a_3[shift_uint8(a, i_1)] = a_3[shift_uint8(a_1, i_1)]))).
-  (* Invariant 'ok,dst' *)
-  Have: shift_uint8(a_1, len_0) = shift_uint8(dst2_0, len_1).
-  (* Invariant 'ok,src' *)
-  Have: shift_uint8(a, len_0) = shift_uint8(src2_0, len_1).
+  Have: separated(a_1, len_0, a_4, len_0).
   (* Invariant 'ok,len' *)
   Have: len_1 <= len_0.
+  (* Invariant 'ok,src' *)
+  Have: shift_uint8(a_3, len_0) = shift_uint8(src2_0, len_1).
+  (* Invariant 'ok,dst' *)
+  Have: shift_uint8(a, len_0) = shift_uint8(dst2_0, len_1).
+  (* Invariant 'ok,cpy' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
+      (a_2[shift_uint8(a_3, i_1)] = a_2[shift_uint8(a, i_1)]))).
   (* Else *)
   Have: len_1 <= 0.
 }
-Prove: a_3[a_5] = Mint_0[a_5].
+Prove: a_2[a_5] = Mint_0[a_5].
 
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'ok,cpy' (file tests/wp_usage/issue-189-bis.i, line 55):
-Let a = Mptr_0[global(P_src_47)].
-Let a_1 = Mptr_0[global(P_dst_48)].
-Let a_2 = shift_uint8(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, len_0).
-Let a_4 = shift_uint8(a, 0).
-Let a_5 = a_3[dst2_0 <- a_3[src2_0]].
+Let a = Mptr_0[global(P_dst_48)].
+Let a_1 = shift_uint8(a, 0).
+Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_3 = Mptr_0[global(P_src_47)].
+Let a_4 = shift_uint8(a_3, 0).
+Let a_5 = a_2[dst2_0 <- a_2[src2_0]].
 Assume {
   Type: is_sint32(len_0) /\ is_sint32(len_1) /\ is_sint32(len_1 - 1).
   (* Heap *)
@@ -318,24 +326,26 @@ Assume {
   (* Goal *)
   When: (0 <= i) /\ ((i + len_1) <= len_0).
   (* Pre-condition 'write_access' *)
-  Have: valid_rw(Malloc_0, a_2, len_0).
+  Have: valid_rw(Malloc_0, a_1, len_0).
   (* Pre-condition 'read_access' *)
   Have: valid_rd(Malloc_0, a_4, len_0).
   (* Pre-condition 'unaliasing' *)
-  Have: separated(a_2, len_0, a_4, len_0).
-  (* Invariant 'ok,cpy' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
-      (a_3[shift_uint8(a, i_1)] = a_3[shift_uint8(a_1, i_1)]))).
-  (* Invariant 'ok,dst' *)
-  Have: shift_uint8(a_1, len_0) = shift_uint8(dst2_0, len_1).
-  (* Invariant 'ok,src' *)
-  Have: shift_uint8(a, len_0) = shift_uint8(src2_0, len_1).
+  Have: separated(a_1, len_0, a_4, len_0).
   (* Invariant 'ok,len' *)
   Have: len_1 <= len_0.
+  (* Invariant 'ok,src' *)
+  Have: shift_uint8(a_3, len_0) = shift_uint8(src2_0, len_1).
+  (* Invariant 'ok,dst' *)
+  Have: shift_uint8(a, len_0) = shift_uint8(dst2_0, len_1).
+  (* Invariant 'ok,cpy' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
+      (a_2[shift_uint8(a_3, i_1)] = a_2[shift_uint8(a, i_1)]))).
   (* Then *)
   Have: 0 < len_1.
+  (* Invariant 'ok,len' *)
+  Have: len_1 <= (1 + len_0).
 }
-Prove: a_5[shift_uint8(a, i)] = a_5[shift_uint8(a_1, i)].
+Prove: a_5[shift_uint8(a_3, i)] = a_5[shift_uint8(a, i)].
 
 ------------------------------------------------------------
 
@@ -355,30 +365,30 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'ok,len' (file tests/wp_usage/issue-189-bis.i, line 51):
-Let a = Mptr_0[global(P_src_47)].
-Let a_1 = Mptr_0[global(P_dst_48)].
-Let a_2 = shift_uint8(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, len_1).
-Let a_4 = shift_uint8(a, 0).
+Let a = Mptr_0[global(P_dst_48)].
+Let a_1 = shift_uint8(a, 0).
+Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_1).
+Let a_3 = Mptr_0[global(P_src_47)].
+Let a_4 = shift_uint8(a_3, 0).
 Assume {
   Type: is_sint32(len_1) /\ is_sint32(len_0) /\ is_sint32(len_0 - 1).
   (* Heap *)
   Type: framed(Mptr_0) /\ linked(Malloc_0).
   (* Pre-condition 'write_access' *)
-  Have: valid_rw(Malloc_0, a_2, len_1).
+  Have: valid_rw(Malloc_0, a_1, len_1).
   (* Pre-condition 'read_access' *)
   Have: valid_rd(Malloc_0, a_4, len_1).
   (* Pre-condition 'unaliasing' *)
-  Have: separated(a_2, len_1, a_4, len_1).
-  (* Invariant 'ok,cpy' *)
-  Have: forall i : Z. ((0 <= i) -> (((len_0 + i) < len_1) ->
-      (a_3[shift_uint8(a, i)] = a_3[shift_uint8(a_1, i)]))).
-  (* Invariant 'ok,dst' *)
-  Have: shift_uint8(a_1, len_1) = shift_uint8(dst2_0, len_0).
-  (* Invariant 'ok,src' *)
-  Have: shift_uint8(a, len_1) = shift_uint8(src2_0, len_0).
+  Have: separated(a_1, len_1, a_4, len_1).
   (* Invariant 'ok,len' *)
   Have: len_0 <= len_1.
+  (* Invariant 'ok,src' *)
+  Have: shift_uint8(a_3, len_1) = shift_uint8(src2_0, len_0).
+  (* Invariant 'ok,dst' *)
+  Have: shift_uint8(a, len_1) = shift_uint8(dst2_0, len_0).
+  (* Invariant 'ok,cpy' *)
+  Have: forall i : Z. ((0 <= i) -> (((len_0 + i) < len_1) ->
+      (a_2[shift_uint8(a_3, i)] = a_2[shift_uint8(a, i)]))).
   (* Then *)
   Have: 0 < len_0.
 }
@@ -420,36 +430,42 @@ Prove: true.
 
 Goal Loop assigns (file tests/wp_usage/issue-189-bis.i, line 54) (4/4):
 Effect at line 60
-Let a = Mptr_0[global(P_src_47)].
-Let a_1 = Mptr_0[global(P_dst_48)].
-Let a_2 = shift_uint8(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, len_0).
-Let a_4 = shift_uint8(a, 0).
+Let a = Mptr_0[global(P_dst_48)].
+Let a_1 = shift_uint8(a, 0).
+Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_3 = a_2[tmp_0 <- a_2[src2_0]].
+Let a_4 = Mptr_0[global(P_src_47)].
+Let a_5 = shift_uint8(a_4, 0).
 Assume {
-  Type: is_sint32(len_0) /\ is_sint32(len_1).
+  Type: is_sint32(len_0) /\ is_sint32(len_1) /\ is_sint32(len_1 - 1).
   (* Heap *)
   Type: framed(Mptr_0) /\ linked(Malloc_0).
   (* Goal *)
   When: !invalid(Malloc_0[P_src_47 <- 1][P_dst_48 <- 1], tmp_0, 1).
   (* Pre-condition 'write_access' *)
-  Have: valid_rw(Malloc_0, a_2, len_0).
+  Have: valid_rw(Malloc_0, a_1, len_0).
   (* Pre-condition 'read_access' *)
-  Have: valid_rd(Malloc_0, a_4, len_0).
+  Have: valid_rd(Malloc_0, a_5, len_0).
   (* Pre-condition 'unaliasing' *)
-  Have: separated(a_2, len_0, a_4, len_0).
-  (* Invariant 'ok,cpy' *)
-  Have: forall i : Z. ((0 <= i) -> (((len_1 + i) < len_0) ->
-      (a_3[shift_uint8(a, i)] = a_3[shift_uint8(a_1, i)]))).
-  (* Invariant 'ok,dst' *)
-  Have: shift_uint8(a_1, len_0) = shift_uint8(tmp_0, len_1).
-  (* Invariant 'ok,src' *)
-  Have: shift_uint8(a, len_0) = shift_uint8(src2_0, len_1).
+  Have: separated(a_1, len_0, a_5, len_0).
   (* Invariant 'ok,len' *)
   Have: len_1 <= len_0.
+  (* Invariant 'ok,src' *)
+  Have: shift_uint8(a_4, len_0) = shift_uint8(src2_0, len_1).
+  (* Invariant 'ok,dst' *)
+  Have: shift_uint8(a, len_0) = shift_uint8(tmp_0, len_1).
+  (* Invariant 'ok,cpy' *)
+  Have: forall i : Z. ((0 <= i) -> (((len_1 + i) < len_0) ->
+      (a_2[shift_uint8(a_4, i)] = a_2[shift_uint8(a, i)]))).
   (* Then *)
   Have: 0 < len_1.
+  (* Invariant 'ok,len' *)
+  Have: len_1 <= (1 + len_0).
+  (* Invariant 'ok,cpy' *)
+  Have: forall i : Z. ((0 <= i) -> (((len_1 + i) <= len_0) ->
+      (a_3[shift_uint8(a_4, i)] = a_3[shift_uint8(a, i)]))).
 }
-Prove: included(tmp_0, 1, a_2, len_0).
+Prove: included(tmp_0, 1, a_1, len_0).
 
 ------------------------------------------------------------
 
diff --git a/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.1.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.1.res.oracle
index 34ca97dda06b736d3e49cb0a7c787fca2ce32e30..a33ddb69c93825da6e494fdb99f61e7fa614ab1d 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.1.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.1.res.oracle
@@ -4,28 +4,28 @@
 [wp] Warning: Missing RTE guards
 
 Goal Post-condition 'memcpy,ok' in 'memcpy_context_vars':
-Let a = global(G_src_47).
-Let a_1 = global(G_dst_48).
-Let a_2 = havoc(Mint_undef_0, Mint_0, shift_uint8(a_1, 0), len_0).
+Let a = global(G_dst_48).
+Let a_1 = havoc(Mint_undef_0, Mint_0, shift_uint8(a, 0), len_0).
+Let a_2 = global(G_src_47).
 Assume {
   Type: is_sint32(len_0) /\ is_sint32(len_1).
   (* Goal *)
   When: (0 <= i) /\ ((2 + i) <= len_0).
   (* Pre-condition 'write_access' *)
   Have: ((0 < len_0) -> (len_0 <= 1)).
-  (* Invariant 'ok,cpy' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
-      (a_2[shift_uint8(a_1, i_1)] = Mint_0[shift_uint8(a, i_1)]))).
-  (* Invariant 'ok,dst' *)
-  Have: shift_uint8(a_1, len_0) = shift_uint8(dst2_0, len_1).
-  (* Invariant 'ok,src' *)
-  Have: shift_uint8(a, len_0) = shift_uint8(src2_0, len_1).
   (* Invariant 'ok,len' *)
   Have: len_1 <= len_0.
+  (* Invariant 'ok,src' *)
+  Have: shift_uint8(a_2, len_0) = shift_uint8(src2_0, len_1).
+  (* Invariant 'ok,dst' *)
+  Have: shift_uint8(a, len_0) = shift_uint8(dst2_0, len_1).
+  (* Invariant 'ok,cpy' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
+      (a_1[shift_uint8(a, i_1)] = Mint_0[shift_uint8(a_2, i_1)]))).
   (* Else *)
   Have: len_1 <= 0.
 }
-Prove: a_2[shift_uint8(a_1, i)] = Mint_0[shift_uint8(a, i)].
+Prove: a_1[shift_uint8(a, i)] = Mint_0[shift_uint8(a_2, i)].
 
 ------------------------------------------------------------
 
@@ -35,29 +35,31 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'ok,cpy' (file tests/wp_usage/issue-189-bis.i, line 55):
-Let a = global(G_src_47).
-Let a_1 = global(G_dst_48).
-Let a_2 = havoc(Mint_undef_0, Mint_0, shift_uint8(a_1, 0), len_0).
-Let a_3 = a_2[dst2_0 <- a_2[src2_0]].
+Let a = global(G_dst_48).
+Let a_1 = havoc(Mint_undef_0, Mint_0, shift_uint8(a, 0), len_0).
+Let a_2 = global(G_src_47).
+Let a_3 = a_1[dst2_0 <- a_1[src2_0]].
 Assume {
   Type: is_sint32(len_0) /\ is_sint32(len_1) /\ is_sint32(len_1 - 1).
   (* Goal *)
   When: (0 <= i) /\ ((i + len_1) <= len_0).
   (* Pre-condition 'write_access' *)
   Have: ((0 < len_0) -> (len_0 <= 1)).
-  (* Invariant 'ok,cpy' *)
-  Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
-      (a_2[shift_uint8(a_1, i_1)] = Mint_0[shift_uint8(a, i_1)]))).
-  (* Invariant 'ok,dst' *)
-  Have: shift_uint8(a_1, len_0) = shift_uint8(dst2_0, len_1).
-  (* Invariant 'ok,src' *)
-  Have: shift_uint8(a, len_0) = shift_uint8(src2_0, len_1).
   (* Invariant 'ok,len' *)
   Have: len_1 <= len_0.
+  (* Invariant 'ok,src' *)
+  Have: shift_uint8(a_2, len_0) = shift_uint8(src2_0, len_1).
+  (* Invariant 'ok,dst' *)
+  Have: shift_uint8(a, len_0) = shift_uint8(dst2_0, len_1).
+  (* Invariant 'ok,cpy' *)
+  Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
+      (a_1[shift_uint8(a, i_1)] = Mint_0[shift_uint8(a_2, i_1)]))).
   (* Then *)
   Have: 0 < len_1.
+  (* Invariant 'ok,len' *)
+  Have: len_1 <= (1 + len_0).
 }
-Prove: a_3[shift_uint8(a, i)] = a_3[shift_uint8(a_1, i)].
+Prove: a_3[shift_uint8(a_2, i)] = a_3[shift_uint8(a, i)].
 
 ------------------------------------------------------------
 
@@ -77,22 +79,22 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'ok,len' (file tests/wp_usage/issue-189-bis.i, line 51):
-Let a = global(G_src_47).
-Let a_1 = global(G_dst_48).
+Let a = global(G_dst_48).
+Let a_1 = global(G_src_47).
 Assume {
   Type: is_sint32(len_1) /\ is_sint32(len_0) /\ is_sint32(len_0 - 1).
   (* Pre-condition 'write_access' *)
   Have: ((0 < len_1) -> (len_1 <= 1)).
-  (* Invariant 'ok,cpy' *)
-  Have: forall i : Z. ((0 <= i) -> (((len_0 + i) < len_1) ->
-      (havoc(Mint_undef_0, Mint_0, shift_uint8(a_1, 0), len_1)
-         [shift_uint8(a_1, i)] = Mint_0[shift_uint8(a, i)]))).
-  (* Invariant 'ok,dst' *)
-  Have: shift_uint8(a_1, len_1) = shift_uint8(dst2_0, len_0).
-  (* Invariant 'ok,src' *)
-  Have: shift_uint8(a, len_1) = shift_uint8(src2_0, len_0).
   (* Invariant 'ok,len' *)
   Have: len_0 <= len_1.
+  (* Invariant 'ok,src' *)
+  Have: shift_uint8(a_1, len_1) = shift_uint8(src2_0, len_0).
+  (* Invariant 'ok,dst' *)
+  Have: shift_uint8(a, len_1) = shift_uint8(dst2_0, len_0).
+  (* Invariant 'ok,cpy' *)
+  Have: forall i : Z. ((0 <= i) -> (((len_0 + i) < len_1) ->
+      (havoc(Mint_undef_0, Mint_0, shift_uint8(a, 0), len_1)
+         [shift_uint8(a, i)] = Mint_0[shift_uint8(a_1, i)]))).
   (* Then *)
   Have: 0 < len_0.
 }
@@ -134,31 +136,37 @@ Prove: true.
 
 Goal Loop assigns (file tests/wp_usage/issue-189-bis.i, line 54) (4/4):
 Effect at line 60
-Let a = global(G_src_47).
-Let a_1 = global(G_dst_48).
-Let a_2 = shift_uint8(a_1, 0).
+Let a = global(G_dst_48).
+Let a_1 = shift_uint8(a, 0).
+Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_3 = a_2[tmp_0 <- a_2[src2_0]].
+Let a_4 = global(G_src_47).
 Assume {
-  Type: is_sint32(len_0) /\ is_sint32(len_1).
+  Type: is_sint32(len_0) /\ is_sint32(len_1) /\ is_sint32(len_1 - 1).
   (* Heap *)
   Type: linked(Malloc_0).
   (* Goal *)
   When: !invalid(Malloc_0, tmp_0, 1).
   (* Pre-condition 'write_access' *)
   Have: ((0 < len_0) -> (len_0 <= 1)).
-  (* Invariant 'ok,cpy' *)
-  Have: forall i : Z. ((0 <= i) -> (((len_1 + i) < len_0) ->
-      (havoc(Mint_undef_0, Mint_0, a_2, len_0)[shift_uint8(a_1, i)] =
-       Mint_0[shift_uint8(a, i)]))).
-  (* Invariant 'ok,dst' *)
-  Have: shift_uint8(a_1, len_0) = shift_uint8(tmp_0, len_1).
-  (* Invariant 'ok,src' *)
-  Have: shift_uint8(a, len_0) = shift_uint8(src2_0, len_1).
   (* Invariant 'ok,len' *)
   Have: len_1 <= len_0.
+  (* Invariant 'ok,src' *)
+  Have: shift_uint8(a_4, len_0) = shift_uint8(src2_0, len_1).
+  (* Invariant 'ok,dst' *)
+  Have: shift_uint8(a, len_0) = shift_uint8(tmp_0, len_1).
+  (* Invariant 'ok,cpy' *)
+  Have: forall i : Z. ((0 <= i) -> (((len_1 + i) < len_0) ->
+      (a_2[shift_uint8(a, i)] = Mint_0[shift_uint8(a_4, i)]))).
   (* Then *)
   Have: 0 < len_1.
+  (* Invariant 'ok,len' *)
+  Have: len_1 <= (1 + len_0).
+  (* Invariant 'ok,cpy' *)
+  Have: forall i : Z. ((0 <= i) -> (((len_1 + i) <= len_0) ->
+      (a_3[shift_uint8(a_4, i)] = a_3[shift_uint8(a, i)]))).
 }
-Prove: included(tmp_0, 1, a_2, len_0).
+Prove: included(tmp_0, 1, a_1, len_0).
 
 ------------------------------------------------------------
 
diff --git a/src/plugins/wp/tests/wp_usage/save_load.i b/src/plugins/wp/tests/wp_usage/save_load.i
index 0e3111eeace52fb92fdba25217bebf8e1ec551e3..8d6c5f320e6e8832c1a1259d49db83952a0cbe80 100644
--- a/src/plugins/wp/tests/wp_usage/save_load.i
+++ b/src/plugins/wp/tests/wp_usage/save_load.i
@@ -1,5 +1,5 @@
 /* run.config
-   EXECNOW: LOG save_load.sav.res LOG save_load.sav.err BIN @PTEST_NAME@.sav @frama-c@ -wp-warn-key pedantic-assigns=inactive -wp-share ./share -wp -wp-print -wp-prover none @PTEST_FILE@ -save @PTEST_RESULT@/@PTEST_NAME@.sav > @PTEST_RESULT@/@PTEST_NAME@.sav.res 2> @PTEST_RESULT@/@PTEST_NAME@.sav.err
+   EXECNOW: LOG save_load.sav.res LOG save_load.sav.err BIN @PTEST_NAME@.sav @frama-c@ -wp-warn-key pedantic-assigns=inactive -wp-share @PTEST_SHARE_DIR@ -wp -wp-print -wp-prover none @PTEST_FILE@ -save @PTEST_RESULT@/@PTEST_NAME@.sav > @PTEST_RESULT@/@PTEST_NAME@.sav.res 2> @PTEST_RESULT@/@PTEST_NAME@.sav.err
    CMD: @frama-c@ -load %{dep:@PTEST_RESULT@/@PTEST_NAME@.sav} -wp-warn-key pedantic-assigns=inactive
    OPT: -print
    OPT: -wp -wp-prover none -wp-print
diff --git a/tests/builtins/big_local_array_script.ml b/tests/builtins/big_local_array_script.ml
index d54de2f49c941315c7e7d8d5c5046dd485a4836e..fd3254716f91c30442ce23323bbff0c4cc2681c5 100644
--- a/tests/builtins/big_local_array_script.ml
+++ b/tests/builtins/big_local_array_script.ml
@@ -1,8 +1,16 @@
+let ptest_file =
+  try
+    let session = Unix.getenv "FRAMAC_SESSION" in
+    if session = Unix.getcwd () then fun dir file -> dir ^ file
+    else fun _ file -> file
+  with Not_found -> fun dir file -> dir ^ file
+
+
 let foo () =
   if Project.get_name (Project.current ()) <> "prj" then begin
     let prj = Project.create "prj" in
     let () = Project.set_current prj in
-    let f = Filepath.Normalized.of_string "tests/builtins/big_local_array.i" in
+    let f = Filepath.Normalized.of_string (ptest_file "tests/builtins/" "big_local_array.i") in
     File.init_from_c_files [File.from_filename f]
   end
 
diff --git a/tests/builtins/from_result.c b/tests/builtins/from_result.c
index c7e6b87f2e2c9119c98dbda36a09634b8760e081..e04c3978a755ccca665bb69c8782ea00006448d4 100644
--- a/tests/builtins/from_result.c
+++ b/tests/builtins/from_result.c
@@ -1,8 +1,8 @@
 /* run.config*
-   OPT:  @EVA_CONFIG@ -eva-alloc-builtin fresh -deps
+   OPT:  -cpp-extra-args=-I@PTEST_SHARE_DIR@ @EVA_CONFIG@ -eva-alloc-builtin fresh -deps
 */
 
-#include "../../share/libc/stdlib.c"
+#include "libc/stdlib.c"
 
 struct T { int a; int b; };
 
diff --git a/tests/compliance/check-json.i b/tests/compliance/check-json.i
index 88d6a106f0362fafce2346750cd8442688257a5d..b4c5e6c33fc7f804398a3320873a02c67a4440cc 100644
--- a/tests/compliance/check-json.i
+++ b/tests/compliance/check-json.i
@@ -1,5 +1,5 @@
 /*run.config
- MACRO: SHARE share/compliance
+ MACRO: SHARE @PTEST_SHARE_DIR@/compliance
  NOFRAMAC:
   EXECNOW: LOG json_@PTEST_NAME@_1.txt python3 -m json.tool < @SHARE@/c11_functions.json | head -n 2 > @PTEST_RESULT@/json_@PTEST_NAME@_1.txt 2> @DEV_NULL@
   EXECNOW: LOG json_@PTEST_NAME@_2.txt python3 -m json.tool < @SHARE@/glibc_functions.json | head -n 2 > @PTEST_RESULT@/json_@PTEST_NAME@_2.txt 2> @DEV_NULL@
diff --git a/tests/fc_script/build-callgraph.i b/tests/fc_script/build-callgraph.i
index 32d7f8785037ce143f729181fd7d3e8ef20d42ae..7ec5a976aeb0b98d696992b666850cb7c6e497fa 100644
--- a/tests/fc_script/build-callgraph.i
+++ b/tests/fc_script/build-callgraph.i
@@ -1,6 +1,6 @@
 /* run.config
    NOFRAMAC: testing frama-c-script, not frama-c itself
-   EXECNOW: LOG build-callgraph.res LOG build-callgraph.err bin/frama-c-script heuristic-print-callgraph @PTEST_DIR@/@PTEST_NAME@.i > @PTEST_RESULT@/build-callgraph.res 2> @PTEST_RESULT@/build-callgraph.err
+   EXECNOW: LOG build-callgraph.res LOG build-callgraph.err %{bin:frama-c-script} heuristic-print-callgraph @PTEST_DIR@/@PTEST_NAME@.i > @PTEST_RESULT@/build-callgraph.res 2> @PTEST_RESULT@/build-callgraph.err
  */
 
 #include <stdio.h>
diff --git a/tests/fc_script/main.c b/tests/fc_script/main.c
index 34a456e008ee9c04c99aec5dbe70560232a1201b..d6526f2b234c2d45c42862eaf1d7c231c85f268f 100644
--- a/tests/fc_script/main.c
+++ b/tests/fc_script/main.c
@@ -1,7 +1,7 @@
 /* run.config
  NOFRAMAC: testing frama-c-script, not frama-c itself
  DEPS: for-find-fun2.c for-find-fun.c main.c main2.c main3.c
-   EXECNOW: LOG GNUmakefile LOG make_template.res LOG make_template.err PTESTS_TESTING= %{bin:frama-c-script} -C @PTEST_DIR@ make-template result < %{dep:@PTEST_DIR@/make_template.input} > @PTEST_RESULT@/make_template.res 2> @PTEST_RESULT@/make_template.err
+   EXECNOW: LOG GNUmakefile LOG make_template.res LOG make_template.err PTESTS_TESTING= %{bin:frama-c-script} -C @PTEST_DIR@ make-template $(basename @PTEST_RESULT@) < %{dep:@PTEST_DIR@/make_template.input} > @PTEST_RESULT@/make_template.res 2> @PTEST_RESULT@/make_template.err
  DEPS: main2.c main3.c main.c
    EXECNOW: LOG list_files.res LOG list_files.err %{bin:frama-c-script} list-files %{dep:@PTEST_DIR@/list_files.json} > @PTEST_RESULT@/list_files.res 2> @PTEST_RESULT@/list_files.err
  DEPS: for-find-fun2.c for-find-fun.c for-list-functions.c main2.c main3.c main.c make-wrapper2.c make-wrapper3.c make-wrapper.c
diff --git a/tests/fc_script/make-wrapper.c b/tests/fc_script/make-wrapper.c
index 909a33cf6540749ec896583d0d2ef47555b27933..89700bc4aa9ecaac4668c8010ebc73edec3d2c26 100644
--- a/tests/fc_script/make-wrapper.c
+++ b/tests/fc_script/make-wrapper.c
@@ -1,9 +1,9 @@
 /* run.config
+MACRO: RM_TMP_DIR rm -rf make-for-make-wrapper.parse make-for-make-wrapper.eva
    NOFRAMAC: testing frama-c-script
    COMMENT: in case of errors, remove the 'grep' part to get the full output
-   EXECNOW: LOG make-wrapper.res LOG make-wrapper.err cd @PTEST_DIR@ && touch make-wrapper2.c && touch make-wrapper3.c && FRAMAC=../../bin/frama-c ../../bin/frama-c-script make-wrapper --make-dir . -f make-for-make-wrapper.mk | grep -A999999 "make-wrapper recommendations" > result/make-wrapper.res 2> result/make-wrapper.err && rm -rf make-for-make-wrapper.parse make-for-make-wrapper.eva
+   EXECNOW: LOG make-wrapper.res LOG make-wrapper.err (cd @PTEST_DIR@ && touch make-wrapper2.c && touch make-wrapper3.c && @RM_TMP_DIR@ && FRAMAC=%{bin:frama-c} %{bin:frama-c-script} make-wrapper --make-dir . -f make-for-make-wrapper.mk | grep -A999999 "make-wrapper recommendations" && @RM_TMP_DIR@) > @PTEST_RESULT@/make-wrapper.res 2> @PTEST_RESULT@/make-wrapper.err
 */
-
 int defined(int a);
 
 int specified(int a);
diff --git a/tests/fc_script/recursions.i b/tests/fc_script/recursions.i
index 1a167347f75321356a77c06c019f140bcca1791a..7d7cbfe0daab55000e646e4f72ada4a7a4d6525a 100644
--- a/tests/fc_script/recursions.i
+++ b/tests/fc_script/recursions.i
@@ -1,6 +1,6 @@
 /* run.config
    NOFRAMAC: testing frama-c-script, not frama-c itself
-   EXECNOW: LOG recursions.res LOG recursions.err bin/frama-c-script heuristic-detect-recursion @PTEST_FILE@ > @PTEST_RESULT@/recursions.res 2> @PTEST_RESULT@/recursions.err
+   EXECNOW: LOG recursions.res LOG recursions.err %{bin:frama-c-script} heuristic-detect-recursion @PTEST_FILE@ > @PTEST_RESULT@/recursions.res 2> @PTEST_RESULT@/recursions.err
 */
 
 volatile int v;
diff --git a/tests/journal/control.i b/tests/journal/control.i
index d531607a34cc031bf0d2d321097b44804624eacd..092afe2d239cccf9ed270389b444989500316f10 100644
--- a/tests/journal/control.i
+++ b/tests/journal/control.i
@@ -2,16 +2,16 @@
  COMMENT: do not compare generated journals since they depend on current time
  PLUGIN: @EVA_PLUGINS@
    EXECNOW: BIN control_journal.ml @frama-c@ @PTEST_FILE@ -journal-enable -eva -deps -out @EVA_OPTIONS@ -main f -journal-name @PTEST_RESULT@/control_journal.ml > @DEV_NULL@ 2> @DEV_NULL@
- SCRIPT: result/control_journal.ml
+ SCRIPT: @PTEST_RESULT@/control_journal.ml
    OPT:
  MODULE:
- SCRIPT: result/control_journal_bis.ml
+ SCRIPT: @PTEST_RESULT@/control_journal_bis.ml
    EXECNOW: BIN control_journal_bis.ml cp %{dep:@PTEST_RESULT@/control_journal.ml} @PTEST_RESULT@/control_journal_bis.ml > @DEV_NULL@ 2> @DEV_NULL@
    OPT: -calldeps
  MODULE: abstract_cpt use_cpt
  SCRIPT:
    EXECNOW: BIN abstract_cpt_journal.ml @frama-c@ -journal-enable -journal-name @PTEST_RESULT@/abstract_cpt_journal.ml > @DEV_NULL@ 2> @DEV_NULL@
- SCRIPT: result/abstract_cpt_journal.ml
+ SCRIPT: @PTEST_RESULT@/abstract_cpt_journal.ml
    OPT:
 */
 
diff --git a/tests/journal/control2.c b/tests/journal/control2.c
index 98470c1e45b7bcdfcdce05c9d3fb5ba8994f13cc..885d7f07b81496997a68cdd8dc6f8473b7dbd5b8 100644
--- a/tests/journal/control2.c
+++ b/tests/journal/control2.c
@@ -1,9 +1,9 @@
 /* run.config
  PLUGIN: @EVA_PLUGINS@
    EXECNOW: BIN control_journal2.ml @frama-c@ -journal-enable -eva -deps -out -main f -journal-name @PTEST_RESULT@/control_journal2.ml @PTEST_FILE@ > @DEV_NULL@ 2> @DEV_NULL@
- SCRIPT: result/control_journal2
+ SCRIPT: @PTEST_RESULT@/control_journal2.ml
    EXECNOW: LOG control2_sav.res LOG control2_sav.err BIN control_journal_next2.ml @frama-c@ -journal-enable -lib-entry -journal-name @PTEST_RESULT@/control_journal_next2.ml @PTEST_FILE@ > @PTEST_RESULT@/control2_sav.res 2> @PTEST_RESULT@/control2_sav.err
- SCRIPT: result/control_journal_next2
+ SCRIPT: @PTEST_RESULT@/control_journal_next2.ml
    OPT:
 */
 int x,y,c,d;
diff --git a/tests/journal/intra.i b/tests/journal/intra.i
index 95251316f0439ba2e13936850f9afd2a9f4a356a..f19b1d606e2881b0abda42cc04213ea7cd16dc23 100644
--- a/tests/journal/intra.i
+++ b/tests/journal/intra.i
@@ -2,7 +2,7 @@
  PLUGIN: @EVA_PLUGINS@ sparecode
  MODULE: @PTEST_NAME@
    EXECNOW: BIN intra_journal.ml @frama-c@ -eva-show-progress -journal-enable -journal-name @PTEST_RESULT@/intra_journal.ml @PTEST_FILE@ > @DEV_NULL@ 2> @DEV_NULL@
- SCRIPT: result/intra_journal
+ SCRIPT: @PTEST_RESULT@/intra_journal.ml
    OPT:
 */
 
diff --git a/tests/libc/check_full_libc.sh b/tests/libc/check_full_libc.sh
index 7725be701dad428d3090f5b7cb26ff92ad6e545e..bce6a2f6159cad9a016c4032538ab74852c32dce 100755
--- a/tests/libc/check_full_libc.sh
+++ b/tests/libc/check_full_libc.sh
@@ -1,8 +1,14 @@
 #!/bin/sh -eu
 
+# Script used by the test "fc_libc.c"
+
 errors=0
 
-cd share/libc
+if [ "$#" -ge 1 ] && [ -d "$1" ]; then
+    cd "$1"
+else
+    cd share/libc
+fi
 
 for A in *.h */*.h; do
     if ! grep -q $A ../../tests/libc/fc_libc.c
diff --git a/tests/libc/coverage.c b/tests/libc/coverage.c
index 8f628572259c0844ff92bea687695c87757e4cd1..e8eda467f288b9461285f737f220bff999e0243f 100644
--- a/tests/libc/coverage.c
+++ b/tests/libc/coverage.c
@@ -1,6 +1,6 @@
 /* run.config*
 PLUGIN: @PTEST_PLUGIN@ metrics
-   OPT: -eva-no-builtins-auto @EVA_OPTIONS@ share/libc/string.c -eva -eva-slevel 6 -metrics-eva-cover -then -metrics-libc
+   OPT: -eva-no-builtins-auto @EVA_OPTIONS@ @PTEST_SHARE_DIR@/libc/string.c -eva -eva-slevel 6 -metrics-eva-cover -then -metrics-libc
 */
 #include "string.h"
 
diff --git a/tests/libc/fc_libc.c b/tests/libc/fc_libc.c
index ad542ec311f9aae9dbb55704e12f9d45b0dfaa44..23ce1d6fe4b7b3497c76fcdd552788e964daeae5 100644
--- a/tests/libc/fc_libc.c
+++ b/tests/libc/fc_libc.c
@@ -1,7 +1,7 @@
 /* run.config*
  PLUGIN: @EVA_PLUGINS@ metrics
  MODULE: check_libc_naming_conventions, check_const
-   OPT: -print -cpp-extra-args='-nostdinc -Ishare/libc' -metrics -metrics-libc -eva @EVA_CONFIG@ -then -lib-entry -no-print -metrics-no-libc
+   OPT: -print -cpp-extra-args='-nostdinc -I@PTEST_SHARE_DIR@/libc' -metrics -metrics-libc -eva @EVA_CONFIG@ -then -lib-entry -no-print -metrics-no-libc
  MODULE:
    OPT: -print -print-libc -machdep x86_32
  MODULE: check_parsing_individual_headers
@@ -11,7 +11,7 @@
  MODULE: check_compliance
    OPT: -kernel-msg-key printer:attrs
  MODULE:
- CMD: %{dep:@PTEST_DIR@/check_full_libc.sh}
+ CMD: %{dep:@PTEST_DIR@/check_full_libc.sh} @PTEST_SHARE_DIR@/libc
    OPT:
 **/
 #define __FC_REG_TEST
diff --git a/tests/libc/runtime.c b/tests/libc/runtime.c
index 22567e6e4de9558ddb133b356f041295fde4a0ca..05600e9550914c4df46a46b4c5ee321fd43f6e38 100644
--- a/tests/libc/runtime.c
+++ b/tests/libc/runtime.c
@@ -1,6 +1,6 @@
 /* run.config*
    COMMENT: tests that the runtime can compile without errors (for PathCrawler, E-ACSL, ...)
-   CMD: gcc -D__FC_MACHDEP_X86_64 share/libc/__fc_runtime.c -Wno-attributes -std=c99 -Wall -Wwrite-strings -o @DEV_NULL@
+   CMD: gcc -D__FC_MACHDEP_X86_64 @PTEST_SHARE_DIR@/libc/__fc_runtime.c -Wno-attributes -std=c99 -Wall -Wwrite-strings -o @DEV_NULL@
    OPT:
  */
 
diff --git a/tests/libc/string_c_generic.c b/tests/libc/string_c_generic.c
index 4470a3d07b525b8b4e45e785be34dd8d5dcfa151..e139d9e467d58148978c85c48be979fbe5a0030d 100644
--- a/tests/libc/string_c_generic.c
+++ b/tests/libc/string_c_generic.c
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: #"-eva-no-builtins-auto -cpp-extra-args=-includeshare/libc/string.c -eva-slevel-function strcpy:20,strncpy:5,strcmp:6,strchr:20,strrchr:20,strncat:4,memset:32,strlen:20,memcmp:8 -eva-no-skip-stdlib-specs"
+   STDOPT: #"-eva-no-builtins-auto -cpp-extra-args=-include@PTEST_SHARE_DIR@/libc/string.c -eva-slevel-function strcpy:20,strncpy:5,strcmp:6,strchr:20,strrchr:20,strncat:4,memset:32,strlen:20,memcmp:8 -eva-no-skip-stdlib-specs"
 */
 /* This file has been adapted from libc-test, which is licensed under the
    following standard MIT license:
diff --git a/tests/libc/string_c_strchr.c b/tests/libc/string_c_strchr.c
index 83ea787bc73c2df126834751d060407781a888b1..4f1bd74747d116b089e6d0598cb2522e83263518 100644
--- a/tests/libc/string_c_strchr.c
+++ b/tests/libc/string_c_strchr.c
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: #"-cpp-extra-args=-includeshare/libc/string.c -eva-slevel-function strchr:256,main:256 -eva-slevel-merge-after-loop main -eva-no-builtins-auto -eva-no-skip-stdlib-specs"
+   STDOPT: #"-cpp-extra-args=-include@PTEST_SHARE_DIR@/libc/string.c -eva-slevel-function strchr:256,main:256 -eva-slevel-merge-after-loop main -eva-no-builtins-auto -eva-no-skip-stdlib-specs"
  */
 /* This file has been adapted from libc-test, which is licensed under the
    following standard MIT license:
diff --git a/tests/libc/string_c_strstr.c b/tests/libc/string_c_strstr.c
index 3dd1d13d8904d0e92b9b44ca207323abdd1715f6..14f2597d49ab7e8c9417ac50aa31a84f2c275b82 100644
--- a/tests/libc/string_c_strstr.c
+++ b/tests/libc/string_c_strstr.c
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: #"-cpp-extra-args=-includeshare/libc/string.c -eva-slevel-function strstr:30 -eva-no-skip-stdlib-specs"
+   STDOPT: #"-cpp-extra-args=-include@PTEST_SHARE_DIR@/libc/string.c -eva-slevel-function strstr:30 -eva-no-skip-stdlib-specs"
  */
 /* This file has been adapted from libc-test, which is licensed under the
    following standard MIT license:
diff --git a/tests/libc/test_config b/tests/libc/test_config
index 069a4888d38f81544d6797ecad65e1e1070e3198..7ffaf3b052ad072e5dd60b64156040e8d2789475 100644
--- a/tests/libc/test_config
+++ b/tests/libc/test_config
@@ -1,2 +1,2 @@
 PLUGIN: @EVA_PLUGINS@
-OPT: -eva @EVA_CONFIG@ -cpp-extra-args='-nostdinc -Ishare/libc'
+OPT: -eva @EVA_CONFIG@ -cpp-extra-args='-nostdinc -I@PTEST_SHARE_DIR@/libc'
diff --git a/tests/misc/audit-in.json b/tests/misc/audit-in.json
index 580f8ac0b0bf71f754b3f4a4b99a41655e8886e6..b4713ef08bbf58a39774a8b6952975872153f4a3 100644
--- a/tests/misc/audit-in.json
+++ b/tests/misc/audit-in.json
@@ -1,8 +1,8 @@
 {
   "sources": {
-    "tests/misc/audit.c": "01010101010101010101010101010101",
-    "tests/misc/audit_included.h": "c2cc488143a476f69cf2ed04c3439e6e",
-    "tests/misc/non_existing_file.h": "1234567890abcdef1234567890abcdef"
+    "PTEST_DIR/audit.c": "01010101010101010101010101010101",
+    "PTEST_DIR/audit_included.h": "c2cc488143a476f69cf2ed04c3439e6e",
+    "PTEST_DIR/non_existing_file.h": "1234567890abcdef1234567890abcdef"
   },
   "kernel": {
     "warning-categories": {
diff --git a/tests/misc/audit.c b/tests/misc/audit.c
index f9111560e09ba541fdef93e09f563fc2b75d5707..7582fc95e7fdabdaf04d50c468dfe1932c596eb1 100644
--- a/tests/misc/audit.c
+++ b/tests/misc/audit.c
@@ -1,7 +1,9 @@
 /* run.config
-PLUGIN: @EVA_PLUGINS@
-   LOG: audit-out.json
-   STDOPT: #"-audit-check %{dep:@PTEST_DIR@/audit-in.json} -audit-prepare @PTEST_RESULT@/audit-out.json -kernel-warn-key audit=active"
+ PLUGIN: @EVA_PLUGINS@
+   EXECNOW: BIN audit.json cat %{dep:@PTEST_DIR@/audit-in.json} | sed -e 's:PTEST_DIR:@PTEST_DIR@:' > @PTEST_RESULT@/audit.json 2> @DEV_NULL@
+ DEPS: audit_included.h, audit_included_but_not_listed.h
+ LOG: audit-out.json
+   STDOPT: #"-audit-check %{dep:@PTEST_RESULT@/audit.json} -audit-prepare @PTEST_RESULT@/audit-out.json -kernel-warn-key audit=active"
 */
 #include "audit_included.h"
 #include "audit_included_but_not_listed.h"
diff --git a/tests/misc/interpreted_automata_dataflow_backward.ml b/tests/misc/interpreted_automata_dataflow_backward.ml
index 6eba2fdd6bd82afedadcd44e4d577435278aead5..be12ce941874d759193954a5f85e43fa013c111b 100644
--- a/tests/misc/interpreted_automata_dataflow_backward.ml
+++ b/tests/misc/interpreted_automata_dataflow_backward.ml
@@ -57,6 +57,13 @@ end
 
 module Dataflow = Interpreted_automata.BackwardAnalysis (LivenessDomain)
 
+let ptest_file =
+  try
+    let session = Unix.getenv "FRAMAC_SESSION" in
+    if session = Unix.getcwd () then fun dir file -> dir ^ file
+    else fun _ file -> file
+  with Not_found -> fun dir file -> dir ^ file
+
 let run () =
   let main_kf, _ = Globals.entry_point () in
   (* Run the analysis *)
@@ -64,8 +71,7 @@ let run () =
   (* Output to dot *)
   let filepath =
     let open Filename in
-    let (/) = concat in
-    dirname __FILE__ / "result" / remove_extension (basename __FILE__) ^ ".dot"
+    ptest_file (dirname __FILE__ ^ "/result/") (remove_extension (basename __FILE__) ^ ".dot")
   in
   let filepath = Filepath.Normalized.of_string filepath in
   Dataflow.Result.to_dot_file LivenessDomain.pretty results filepath
diff --git a/tests/misc/interpreted_automata_dataflow_forward.ml b/tests/misc/interpreted_automata_dataflow_forward.ml
index 4f9d2aa51ed8b031bc29afaba08158f246a7b8cd..157457d58a14898adc9fcca73a555ab202a0fe89 100644
--- a/tests/misc/interpreted_automata_dataflow_forward.ml
+++ b/tests/misc/interpreted_automata_dataflow_forward.ml
@@ -99,6 +99,13 @@ end
 
 module Dataflow = Interpreted_automata.ForwardAnalysis (ConstantsDomain)
 
+let ptest_file =
+  try
+    let session = Unix.getenv "FRAMAC_SESSION" in
+    if session = Unix.getcwd () then fun dir file -> dir ^ file
+    else fun _ file -> file
+  with Not_found -> fun dir file -> dir ^ file
+
 let run () =
   let main_kf, _ = Globals.entry_point () in
   let main_name = Kernel_function.get_name main_kf in
@@ -107,8 +114,7 @@ let run () =
   (* Output to dot *)
   let filepath =
     let open Filename in
-    let (/) = concat in
-    dirname __FILE__ / "result" / remove_extension (basename __FILE__) ^ ".dot"
+    ptest_file ((dirname __FILE__) ^ "/result/") (remove_extension (basename __FILE__) ^ ".dot")
   in
   let filepath = Filepath.Normalized.of_string filepath in
   Dataflow.Result.to_dot_file ConstantsDomain.pretty results filepath;
diff --git a/tests/misc/issue109.ml b/tests/misc/issue109.ml
index 7aee9ffd3243a05442c495f4ad6ec7169184008b..98cc840b15e7d55bbe01e7c1b6083c3bc28c9fbe 100644
--- a/tests/misc/issue109.ml
+++ b/tests/misc/issue109.ml
@@ -1,7 +1,14 @@
+let ptest_file =
+  try
+    let session = Unix.getenv "FRAMAC_SESSION" in
+    if session = Unix.getcwd () then fun dir file -> dir ^ file
+    else fun _ file -> file
+  with Not_found -> fun dir file -> dir ^ file
+
 let main () =
   !Db.Value.compute ();
   Dynamic.Parameter.String.set "" "";
-  Dynamic.Parameter.String.set "" "tests/misc/issue109.i";
+  Dynamic.Parameter.String.set "" (ptest_file "tests/misc/" "issue109.i");
   File.init_from_cmdline ();
   !Db.Value.compute ()
 
diff --git a/tests/misc/oracle/audit-out.json b/tests/misc/oracle/audit-out.json
index c151c12fdce623f1fe68d3bc676efd2014ddf206..30cc9049f1ea959f8a1b169fdd3b58d2c5d95dc4 100644
--- a/tests/misc/oracle/audit-out.json
+++ b/tests/misc/oracle/audit-out.json
@@ -72,7 +72,7 @@
     }
   },
   "sources": {
-    "tests/misc/audit.c": "849a5c434063ac353bc07ba7e8ca7109",
+    "tests/misc/audit.c": "4707fbd9cf9d2b4b97da7e3cc446e7ba",
     "tests/misc/audit_included.h": "c2cc488143a476f69cf2ed04c3439e6e",
     "tests/misc/audit_included_but_not_listed.h":
       "c2cc488143a476f69cf2ed04c3439e6e"
diff --git a/tests/misc/oracle/audit.res.oracle b/tests/misc/oracle/audit.res.oracle
index 040c0629cdf7834af8207a62ba3d96e361136a7b..37134b1c37db62e2f8b7ea79f0a50558e7f1687e 100644
--- a/tests/misc/oracle/audit.res.oracle
+++ b/tests/misc/oracle/audit.res.oracle
@@ -1,12 +1,12 @@
 [kernel:audit] Warning: 
-  different hashes for tests/misc/audit.c: got 849a5c434063ac353bc07ba7e8ca7109, expected 01010101010101010101010101010101
+  different hashes for tests/misc/audit.c: got 4707fbd9cf9d2b4b97da7e3cc446e7ba, expected 01010101010101010101010101010101
 [kernel:audit] Warning: 
   different hashes for tests/misc/audit_included_but_not_listed.h: got c2cc488143a476f69cf2ed04c3439e6e, expected <none> (not in list)
 [kernel:audit] Warning: 
   missing files:
   tests/misc/non_existing_file.h
 [kernel] Parsing tests/misc/audit.c (with preprocessing)
-[kernel:parser:decimal-float] tests/misc/audit.c:10: Warning: 
+[kernel:parser:decimal-float] tests/misc/audit.c:12: Warning: 
   Floating-point constant 2.1 is not represented exactly. Will use 0x1.0cccccccccccdp1.
   (warn-once: no further messages from category 'parser:decimal-float' will be emitted)
 [eva] Analyzing a complete application starting at main
diff --git a/tests/misc/with-space.i b/tests/misc/with-space.i
index 4e9efa5b156b97abc144bd790cb390794976c275..98f36854e12589e89b66c49274a8bd9556998b20 100644
--- a/tests/misc/with-space.i
+++ b/tests/misc/with-space.i
@@ -1,4 +1,4 @@
 /* run.config
-  SCRIPT: with\ space/module
+ SCRIPT: @PTEST_DIR@/with\ space/module
    OPT:
  */
diff --git a/tests/pdg/dyn_dpds.ml b/tests/pdg/dyn_dpds.ml
index caa5d09a5d892e1b58bb6259b31f83630610aa53..02dc6d7d49dcd3560fdba0187fe569e2f40ca4c1 100644
--- a/tests/pdg/dyn_dpds.ml
+++ b/tests/pdg/dyn_dpds.ml
@@ -5,6 +5,13 @@ zgrviewer tests/pdg/dyn_dpds_1.dot ; \
 zgrviewer tests/pdg/dyn_dpds_2.dot ;
 *)
 
+let ptest_file =
+  try
+    let session = Unix.getenv "FRAMAC_SESSION" in
+    if session = Unix.getcwd () then fun dir file -> dir ^ file
+    else fun _ file -> file
+  with Not_found -> fun dir file -> dir ^ file
+
 let get_zones str_data (stmt, kf) =
   let lval_term = !Db.Properties.Interp.term_lval kf str_data in
   let lval = !Db.Properties.Interp.term_lval_to_lval ~result:None lval_term in
@@ -23,7 +30,7 @@ let main _ =
   let kf =  Globals.Functions.find_def_by_name "main" in
   let pdg = !Db.Pdg.get kf in
   Format.printf "%a@." (!Db.Pdg.pretty ~bw:false) pdg;
-  !Db.Pdg.extract pdg "tests/pdg/result/dyn_dpds_0.dot";
+  !Db.Pdg.extract pdg (ptest_file "tests/pdg/result/" "dyn_dpds_0.dot");
   let assert_sid = 5 in (* assert ( *p>G) *)
   let assert_stmt, kf = Kernel_function.find_from_sid assert_sid in
   let _assert_node =
@@ -44,6 +51,6 @@ let main _ =
   Format.printf "Warning : cannot select %a in this function...@\n"
     Locations.Zone.pretty undef;
   Format.printf "%a@." (!Db.Pdg.pretty ~bw:false) pdg;
-  !Db.Pdg.extract pdg "tests/pdg/result/dyn_dpds_1.dot"
+  !Db.Pdg.extract pdg (ptest_file "tests/pdg/result/" "dyn_dpds_1.dot")
 
 let () = Db.Main.extend main
diff --git a/tests/saveload/load_one.ml b/tests/saveload/load_one.ml
index c59e9cd3b7874dde5250c1f4d9a0e2f095ec327a..cef2bc0f80bd94c3a90a943c49997a932664cade 100644
--- a/tests/saveload/load_one.ml
+++ b/tests/saveload/load_one.ml
@@ -1,10 +1,19 @@
-let () = at_exit (fun _ -> Sys.remove "tests/saveload/result/load_one.sav")
+let ptest_file =
+  try
+    let session = Unix.getenv "FRAMAC_SESSION" in
+    if session = Unix.getcwd () then fun dir file -> dir ^ file
+    else fun _ file -> file
+  with Not_found -> fun dir file -> dir ^ file
+
+let sav_file = ptest_file "tests/saveload/result/" "load_one.sav"
+
+let () = at_exit (fun _ -> Sys.remove sav_file)
 
 let main () =
   let sparecode () =
     Sparecode.Register.get ~select_annot:false ~select_slice_pragma:false
   in
-  let fp = Filepath.Normalized.of_string "tests/saveload/result/load_one.sav" in
+  let fp = Filepath.Normalized.of_string sav_file in
   let p = sparecode () in
   Project.save fp;
   Project.remove ~project:p ();
@@ -23,4 +32,3 @@ let main2 () =
   File.pretty_ast ~prj ()
 
 let () = Db.Main.extend main2
-
diff --git a/tests/slicing/adpcm.c b/tests/slicing/adpcm.c
index d5a940af6ce4b3e0f38686b06bd58aaaa1ce7b32..1d10e25ac4f391f3c4eb6f884236509dac3f9622 100644
--- a/tests/slicing/adpcm.c
+++ b/tests/slicing/adpcm.c
@@ -1,8 +1,5 @@
 /* run.config
  LIBS: libSelect
  MODULE: @PTEST_NAME@
- DEPS: ../test/adpcm.c
-   STDOPT: +"-ulevel -1 -deps -slicing-level 2"
+   STDOPT: +"-ulevel -1 -deps -slicing-level 2" #"%{dep:@PTEST_SUITE_DIR@/../test/adpcm.c}"
 */
-
-#include "../test/adpcm.c"
diff --git a/tests/slicing/oracle/adpcm.res.oracle b/tests/slicing/oracle/adpcm.res.oracle
index bcf5570fb7bf878789c98d30a6bcc9569956b1f1..988a2cf104498be1afd24bdaa2d8e322854cf146 100644
--- a/tests/slicing/oracle/adpcm.res.oracle
+++ b/tests/slicing/oracle/adpcm.res.oracle
@@ -1,4 +1,5 @@
 [kernel] Parsing tests/slicing/adpcm.c (with preprocessing)
+[kernel] Parsing tests/test/adpcm.c (with preprocessing)
 [eva] Analyzing a complete application starting at main
 [eva] Computing initial state
 [eva] Initial state computed
diff --git a/tests/slicing/oracle/variadic.0.res.oracle b/tests/slicing/oracle/variadic.0.res.oracle
index f9e68d81428e8fec22c094bc01e6bfb4f2e7bd8f..7669ba0d8ee05eab460543a235ae1aff41aff547 100644
--- a/tests/slicing/oracle/variadic.0.res.oracle
+++ b/tests/slicing/oracle/variadic.0.res.oracle
@@ -1,4 +1,5 @@
 [kernel] Parsing tests/slicing/variadic.c (with preprocessing)
+[kernel] Parsing tests/pdg/variadic.c (with preprocessing)
 [slicing] slicing requests in progress...
 [eva] Analyzing a complete application starting at main
 [eva] Computing initial state
diff --git a/tests/slicing/oracle/variadic.1.res.oracle b/tests/slicing/oracle/variadic.1.res.oracle
index 5d7828ceaa8967ff22c964132009d2e6e2b7bd02..c35e51dbe0ceee2e3fbfbd07cfbe8429acc25cb0 100644
--- a/tests/slicing/oracle/variadic.1.res.oracle
+++ b/tests/slicing/oracle/variadic.1.res.oracle
@@ -1,4 +1,5 @@
 [kernel] Parsing tests/slicing/variadic.c (with preprocessing)
+[kernel] Parsing tests/pdg/variadic.c (with preprocessing)
 [slicing] slicing requests in progress...
 [eva] Analyzing a complete application starting at main
 [eva] Computing initial state
diff --git a/tests/slicing/oracle/variadic.2.res.oracle b/tests/slicing/oracle/variadic.2.res.oracle
index d5c0ef206f02959b4b22384124cddf1c5e649d02..bffda4493c16dbff88660dc58653e0333ab08283 100644
--- a/tests/slicing/oracle/variadic.2.res.oracle
+++ b/tests/slicing/oracle/variadic.2.res.oracle
@@ -1,4 +1,5 @@
 [kernel] Parsing tests/slicing/variadic.c (with preprocessing)
+[kernel] Parsing tests/pdg/variadic.c (with preprocessing)
 [slicing] slicing requests in progress...
 [eva] Analyzing a complete application starting at main
 [eva] Computing initial state
diff --git a/tests/slicing/oracle/variadic.3.res.oracle b/tests/slicing/oracle/variadic.3.res.oracle
index 73ee87c31a613ad4bb5b2d2fd856c6bc8a09ba03..9ea0ba3b4978d7a14b1b67e8afe34171009106da 100644
--- a/tests/slicing/oracle/variadic.3.res.oracle
+++ b/tests/slicing/oracle/variadic.3.res.oracle
@@ -1,4 +1,5 @@
 [kernel] Parsing tests/slicing/variadic.c (with preprocessing)
+[kernel] Parsing tests/pdg/variadic.c (with preprocessing)
 [slicing] slicing requests in progress...
 [eva] Analyzing a complete application starting at main
 [eva] Computing initial state
diff --git a/tests/slicing/oracle/variadic.4.res.oracle b/tests/slicing/oracle/variadic.4.res.oracle
index 73ee87c31a613ad4bb5b2d2fd856c6bc8a09ba03..9ea0ba3b4978d7a14b1b67e8afe34171009106da 100644
--- a/tests/slicing/oracle/variadic.4.res.oracle
+++ b/tests/slicing/oracle/variadic.4.res.oracle
@@ -1,4 +1,5 @@
 [kernel] Parsing tests/slicing/variadic.c (with preprocessing)
+[kernel] Parsing tests/pdg/variadic.c (with preprocessing)
 [slicing] slicing requests in progress...
 [eva] Analyzing a complete application starting at main
 [eva] Computing initial state
diff --git a/tests/slicing/variadic.c b/tests/slicing/variadic.c
index d22dce051c6785a206bee4e44b59c914293a7b45..f509bbf53823837a028d25d210f9a82e64beb619 100644
--- a/tests/slicing/variadic.c
+++ b/tests/slicing/variadic.c
@@ -1,10 +1,8 @@
 /* run.config
-  DEPS: ../pdg/variadic.c
-    STDOPT: +"-slice-return f3 -no-slice-callers -then-on 'Slicing export' -print"
-    STDOPT: +"-slice-return f3 -no-slice-callers -variadic-no-translation -then-last -print"
-    STDOPT: +"-slice-return f3 -then-on 'Slicing export' -print"
-    STDOPT: +"-slice-return main -then-on 'Slicing export' -print"
-    STDOPT: +"-slice-return main -slicing-level 3  -then-on 'Slicing export' -print"
+  MACRO: PATHNAME  #"%{dep:@PTEST_SUITE_DIR@/../pdg/variadic.c}"
+    STDOPT: @PATHNAME@ +"-slice-return f3 -no-slice-callers -then-on 'Slicing export' -print"
+    STDOPT: @PATHNAME@ +"-slice-return f3 -no-slice-callers -variadic-no-translation -then-last -print"
+    STDOPT: @PATHNAME@ +"-slice-return f3 -then-on 'Slicing export' -print"
+    STDOPT: @PATHNAME@ +"-slice-return main -then-on 'Slicing export' -print"
+    STDOPT: @PATHNAME@ +"-slice-return main -slicing-level 3  -then-on 'Slicing export' -print"
 */
-
-#include "../pdg/variadic.c"
diff --git a/tests/syntax/cpp-command.c b/tests/syntax/cpp-command.c
index 48585271169f5f929f117075c3011689e3011168..8dc2482bb3c60c73ff47398a23b10b69d9252607 100644
--- a/tests/syntax/cpp-command.c
+++ b/tests/syntax/cpp-command.c
@@ -1,11 +1,11 @@
 /* run.config*
-   FILTER: sed "s:/[^ ]*[/]cpp-command\.[^ ]*\.i:TMPDIR/FILE.i:g; s:$PWD/::g; s: -m32::"
+   FILTER: sed "s:/[^ ]*[/]cpp-command\.[^ ]*\.i:TMPDIR/FILE.i:g; s:$PWD/::g; s:@PTEST_MAKE_DIR@/result@PTEST_CONFIG@/::g; s: -m32::"
    OPT: -machdep x86_32 -cpp-frama-c-compliant -cpp-command "echo [\$(basename '%1') \$(basename '%1') \$(basename '%i') \$(basename '%input')] ['%2' '%2' '%o' '%output'] ['%args']"
    OPT: -machdep x86_32 -cpp-frama-c-compliant -cpp-command "echo %%1 = \$(basename '%1') %%2 = '%2' %%args = '%args'"
    OPT: -machdep x86_32 -cpp-frama-c-compliant -cpp-command "printf \"%s\n\" \"using \\% has no effect : \$(basename \"\%input\")\""
    OPT: -machdep x86_32 -cpp-frama-c-compliant -cpp-command "echo %var is not an interpreted placeholder"
    OPT: -machdep x86_32 -print-cpp-commands
-   OPT: -cpp-extra-args-per-file=@PTEST_FILE@:"-DPF=\\\"cp%02d_3f\\\"" -no-autoload-plugins @PTEST_FILE@ -print
+   OPT: -cpp-extra-args-per-file=@PTEST_FILE@:"-DPF=\\\"cp%02d_3f\\\"" @PTEST_FILE@ -print
    */
 
 #include <stdio.h>
diff --git a/tests/syntax/multiple_decls_contracts.c b/tests/syntax/multiple_decls_contracts.c
index 3ac56b12d72e1800376ceb32e99c82755cca9076..f79505c2b03a7798b228f71157c1b53022a7d54f 100644
--- a/tests/syntax/multiple_decls_contracts.c
+++ b/tests/syntax/multiple_decls_contracts.c
@@ -1,7 +1,7 @@
 /* run.config
-OPT: share/libc/string.h @PTEST_FILE@ @PTEST_FILE@ -cpp-extra-args="-Ishare/libc" -print
-OPT: @PTEST_FILE@ share/libc/string.h @PTEST_FILE@ -cpp-extra-args="-Ishare/libc" -print
-OPT: @PTEST_FILE@ @PTEST_FILE@ share/libc/string.h -cpp-extra-args="-Ishare/libc" -print
+OPT: @PTEST_SHARE_DIR@/libc/string.h @PTEST_FILE@ @PTEST_FILE@ -cpp-extra-args="-I@PTEST_SHARE_DIR@/libc" -print
+OPT: @PTEST_FILE@ @PTEST_SHARE_DIR@/libc/string.h @PTEST_FILE@ -cpp-extra-args="-I@PTEST_SHARE_DIR@/libc" -print
+OPT: @PTEST_FILE@ @PTEST_FILE@ @PTEST_SHARE_DIR@/libc/string.h -cpp-extra-args="-I@PTEST_SHARE_DIR@/libc" -print
 */
 
 #include "string.h"
diff --git a/tests/test_config_apron b/tests/test_config_apron
index 32de05d7c0f20a999b8499e88ce3d40627a5b121..5bc02fb2551b5cbdfece488b945456d79adbb705 100644
--- a/tests/test_config_apron
+++ b/tests/test_config_apron
@@ -6,7 +6,7 @@ MACRO: EVA_TEST -eva @EVA_CONFIG@ -out -input -deps
 MACRO: RTE_TEST -rte -no-warn-invalid-pointer
 
 # Compare the result with the oracle of the default config.
-FILTER: diff --new-file @PTEST_DIR@/oracle/@PTEST_ORACLE@ -
+FILTER: diff --new-file %{dep:@PTEST_SUITE_DIR@/oracle/@PTEST_ORACLE@} -
 
 PLUGIN: @EVA_PLUGINS@
 OPT: @EVA_TEST@
diff --git a/tests/test_config_bitwise b/tests/test_config_bitwise
index 1407e25287add669eb01538c3c86bd36b87341bd..7cb2da1759921ae1004517f41c903f76a9067bcf 100644
--- a/tests/test_config_bitwise
+++ b/tests/test_config_bitwise
@@ -6,7 +6,7 @@ MACRO: EVA_TEST -eva @EVA_CONFIG@ -out -input -deps
 MACRO: RTE_TEST -rte -no-warn-invalid-pointer
 
 # Compare the result with the oracle of the default config.
-FILTER: diff --new-file @PTEST_DIR@/oracle/@PTEST_ORACLE@ -
+FILTER: diff --new-file %{dep:@PTEST_SUITE_DIR@/oracle/@PTEST_ORACLE@} -
 
 PLUGIN: @EVA_PLUGINS@
 OPT: @EVA_TEST@
diff --git a/tests/test_config_equality b/tests/test_config_equality
index 58feee37a95057215515fc805ecdd7d5274b6c7a..5dab3a18f41d57260d9b0e38ecbc357a1af12314 100644
--- a/tests/test_config_equality
+++ b/tests/test_config_equality
@@ -6,7 +6,7 @@ MACRO: EVA_TEST -eva @EVA_CONFIG@ -out -input -deps
 MACRO: RTE_TEST -rte -no-warn-invalid-pointer
 
 # Compare the result with the oracle of the default config.
-FILTER: diff --new-file @PTEST_DIR@/oracle/@PTEST_ORACLE@ -
+FILTER: diff --new-file %{dep:@PTEST_SUITE_DIR@/oracle/@PTEST_ORACLE@} -
 
 PLUGIN: @EVA_PLUGINS@
 OPT: @EVA_TEST@
diff --git a/tests/test_config_gauges b/tests/test_config_gauges
index ca7078ec30dbb54ea9d451edc8fdfcc4aab6516e..93f3294a8f30b92c71212f7d7e7a0569e7d7cbe3 100644
--- a/tests/test_config_gauges
+++ b/tests/test_config_gauges
@@ -6,7 +6,7 @@ MACRO: EVA_TEST -eva @EVA_CONFIG@ -out -input -deps
 MACRO: RTE_TEST -rte -no-warn-invalid-pointer
 
 # Compare the result with the oracle of the default config.
-FILTER: diff --new-file @PTEST_DIR@/oracle/@PTEST_ORACLE@ -
+FILTER: diff --new-file %{dep:@PTEST_SUITE_DIR@/oracle/@PTEST_ORACLE@} -
 
 PLUGIN: @EVA_PLUGINS@
 OPT: @EVA_TEST@
diff --git a/tests/test_config_octagon b/tests/test_config_octagon
index fe1773cc1ea9069cfaea369e8adf0a8c296add6a..eadb9a73a24213917a975331e439207425fb4351 100644
--- a/tests/test_config_octagon
+++ b/tests/test_config_octagon
@@ -6,7 +6,7 @@ MACRO: EVA_TEST -eva @EVA_CONFIG@ -out -input -deps
 MACRO: RTE_TEST -rte -no-warn-invalid-pointer
 
 # Compare the result with the oracle of the default config.
-FILTER: diff --new-file @PTEST_DIR@/oracle/@PTEST_ORACLE@ -
+FILTER: diff --new-file %{dep:@PTEST_SUITE_DIR@/oracle/@PTEST_ORACLE@} -
 
 PLUGIN: @EVA_PLUGINS@
 OPT: @EVA_TEST@
diff --git a/tests/test_config_symblocs b/tests/test_config_symblocs
index 2352a39dc19574907fd9181d0c181ca94a5a7133..ac0fd259c17046fcb49ee99cb6450d3382f20b3b 100644
--- a/tests/test_config_symblocs
+++ b/tests/test_config_symblocs
@@ -6,7 +6,7 @@ MACRO: EVA_TEST -eva @EVA_CONFIG@ -out -input -deps
 MACRO: RTE_TEST -rte -no-warn-invalid-pointer
 
 # Compare the result with the oracle of the default config.
-FILTER: diff --new-file @PTEST_DIR@/oracle/@PTEST_ORACLE@ -
+FILTER: diff --new-file %{dep:@PTEST_SUITE_DIR@/oracle/@PTEST_ORACLE@} -
 
 PLUGIN: @EVA_PLUGINS@
 OPT: @EVA_TEST@