diff --git a/.Makefile.lint b/.Makefile.lint
index 80fb691a8370490eea2a7db9b60c1fae64ab498a..5d2bc8a03c8723836cade9e74cb693dda737f6d5 100644
--- a/.Makefile.lint
+++ b/.Makefile.lint
@@ -99,8 +99,6 @@ ML_LINT_KO+=src/kernel_services/plugin_entry_points/emitter.ml
 ML_LINT_KO+=src/kernel_services/plugin_entry_points/emitter.mli
 ML_LINT_KO+=src/kernel_services/plugin_entry_points/journal.ml
 ML_LINT_KO+=src/kernel_services/plugin_entry_points/journal.mli
-ML_LINT_KO+=src/kernel_services/plugin_entry_points/log.ml
-ML_LINT_KO+=src/kernel_services/plugin_entry_points/log.mli
 ML_LINT_KO+=src/kernel_services/visitors/cabsvisit.ml
 ML_LINT_KO+=src/kernel_services/visitors/cabsvisit.mli
 ML_LINT_KO+=src/kernel_services/visitors/visitor.ml
@@ -344,10 +342,3 @@ ML_LINT_KO+=src/plugins/variadic/standard.ml
 ML_LINT_KO+=src/plugins/variadic/translate.ml
 ML_LINT_KO+=src/plugins/variadic/va_build.ml
 ML_LINT_KO+=src/plugins/variadic/va_types.mli
-ML_LINT_KO+=src/plugins/e-acsl/src/analyses/mmodel_analysis.ml
-ML_LINT_KO+=src/plugins/e-acsl/src/analyses/rte.ml
-ML_LINT_KO+=src/plugins/e-acsl/src/code_generator/at_with_lscope.ml
-ML_LINT_KO+=src/plugins/e-acsl/src/code_generator/at_with_lscope.mli
-ML_LINT_KO+=src/plugins/e-acsl/src/code_generator/temporal.ml
-ML_LINT_KO+=src/plugins/e-acsl/src/code_generator/temporal.mli
-
diff --git a/Changelog b/Changelog
index ca81d8698f74c64ed4d224ea0a0cdaeb0dd06da9..8b87a7002304addb487f327617f6f2b9ca5f82ad 100644
--- a/Changelog
+++ b/Changelog
@@ -17,6 +17,20 @@
 Open Source Release <next-release>
 ##################################
 
+-*  Eva       [2020-09-28] Improved string builtins on wide strings: crash fixed,
+              better performance, misaligned pointers now considered invalid.
+-   Kernel    [2020-09-22] New option -autocomplete p1, ..., pn that list the
+              options of plug-ins p1, ..., pn in a format suitable for
+              autocompletion scripts.
+-   Kernel    [2020-09-21] Option -permissive now allows non-existent option
+              names.
+-   Logic     [2020-09-11] Introduce check-only annotations for
+              requires, ensures, loop invariant and lemmas
+-   Kernel    [2020-09-08] Add option -print-cpp-commands, to print the
+              preprocessing commands used by Frama-C.
+-   Eva       [2020-09-07] Deprecates legacy options aliases -val-* in favor
+              of option names -eva-*.
+-*  Slicing   [2020-09-07] Better handling of invalid command line options.
 -   Eva       [2020-07-27] Improved automatic loop unroll (-eva-auto-loop-unroll
               option) on loops with several exit conditions, conditions using
               equality operators, temporary variables introduced by the Frama-C
@@ -331,7 +345,7 @@ o!  Constant Propagation [2018-09-12] Removing Db API for Constant Propagation
 o!  Kernel    [2018-07-23] Remove completely outdated module Dataflow.
               Deprecated since 3+ years. Use Dataflow2 instead.
 -*  RTE       [2018-07-23] Stop generating spurious \initialized alarms.
-              Fixes #@429  
+              Fixes #@429
 -*  Kernel    [2018-07-06] Respect relative order of labels and ACSL annots.
               Fixes #@524
 o*  Ptests    [2018-07-02] Do not keep oracles for empty stderr. Fixes #@402
@@ -832,7 +846,7 @@ o! Kernel     [2016-06-14] Remove class Filecheck.check from API.
               translated as 'tmp = e;' instead of 'if (e) {}' (which was
               incorrect when e did not have a scalar type)
 -  Eva        [2016-05-27] Improvements to option -val-subdivide-non-linear for
-              high number of subdivisions 
+              high number of subdivisions
 -* Value      [2016-05-23] Option -val-show-initial-state has been removed.
               Instead, -value-msg-key=-initial-state can be used
 -  Value      [2016-05-23] New message key final-states, that can be used
diff --git a/Makefile b/Makefile
index 8e88f816a724d1cfc583ff930cb0a12e99c911da..667ab30c73c8238340b8ea1a9f50aa488b0b3e3e 100644
--- a/Makefile
+++ b/Makefile
@@ -168,7 +168,7 @@ force-reconfigure:
 ##############################################################################
 .PHONY: tests
 
-TESTS=rte slicing scope value
+TESTS=rte slicing scope value syntax
 tests:
 	dune exec -- ptests
 	dune build $(addprefix @tests/,$(addsuffix /ptests,$(TESTS)))
diff --git a/bin/frama-c-script b/bin/frama-c-script
index 0683f0371d7a4b63a0caddd0335db2f9d71349c9..0b1035fe64775973a4df9c614c36fc8c93408d83 100755
--- a/bin/frama-c-script
+++ b/bin/frama-c-script
@@ -208,38 +208,6 @@ configure_for_frama_c() {
     CPP="gcc -E -nostdinc -fno-builtin -I${FRAMAC_SHARE}/libc -D__FC_MACHDEP_${MACHDEP}" ./configure "$@"
 }
 
-normalize_jcdb() {
-    path=""
-    if [ "$#" -eq 0 ]; then
-        path="./compile_commands.json"
-    else
-        path="$1"
-    fi
-    if [ ! -e "$path" ]; then
-        echo "error: cannot find file: $path";
-        exit 1
-    fi
-    sed "s|$PWD/||g" "$path" > "${path}.tmp"
-    cmp -s "$path" "${path}.tmp"
-    if [ $? -eq 0 ]; then
-        echo "No changes to be applied to $path"
-        rm "${path}.tmp"
-    else
-        echo "Differences to be applied to $path:"
-        diff -u0 "$path" "${path}.tmp"
-        read -p "Normalize $path? [y/N] " yn
-        case $yn in
-            [Yy])
-                mv "${path}.tmp" "$path"
-                echo "Normalization applied to $path"
-            ;;
-            *)
-                echo "Exiting without overwriting."
-                exit 0;;
-        esac
-    fi
-}
-
 case "$command" in
     "help" | "-help" | "--help" | "-h")
         usage 0;
@@ -279,7 +247,7 @@ case "$command" in
         ;;
     "normalize-jcdb")
         shift;
-        normalize_jcdb "$@";
+        ${FRAMAC_SHARE}/analysis-scripts/normalize_jcdb.py "$@";
         ;;
     *)
         echo "error: unrecognized command: $command";
diff --git a/configure.in b/configure.in
index 3918eb98726aa4f41acbf014376f0340fb090659..b718c1ff64c132b142bd5d0b3856a7e5e8a175ef 100644
--- a/configure.in
+++ b/configure.in
@@ -255,6 +255,31 @@ dnl   AC_MSG_RESULT(Landmarks profiling disabled);
 dnl   HAS_LANDMARKS="no"
 dnl fi
 
+# Python 3 (for analysis-scripts)
+########
+
+AC_MSG_CHECKING(for python3)
+
+PYTHON3_VERSION=$(python3 --version 2>/dev/null || echo "")
+if test -z "$PYTHON3_VERSION" ; then
+  AC_MSG_RESULT(not found. Some non-regression tests will be disabled.)
+  HAS_PYTHON36="no"
+else
+  AC_MSG_RESULT(found)
+  AC_MSG_CHECKING(for python3 >= 3.6)
+  PYTHON3_VERSION=$(echo "$PYTHON3_VERSION" | cut -d' ' -f2-)
+  case $PYTHON3_VERSION in
+  2.*|3.[[0-5]].*)
+     AC_MSG_RESULT(found $PYTHON3_VERSION (too old); some non-regression tests will be disabled)
+     HAS_PYTHON36="no"
+     ;;
+   *)
+     AC_MSG_RESULT(ok)
+     HAS_PYTHON36="yes"
+     ;;
+  esac
+fi
+
 ############
 # Platform #
 ############
@@ -514,6 +539,7 @@ AC_SUBST(DEVELOPMENT)
 AC_SUBST(HAS_APRON)
 AC_SUBST(HAS_MPFR)
 AC_SUBST(HAS_LANDMARKS)
+AC_SUBST(HAS_PYTHON36)
 AC_SUBST(LABLGTK_VERSION)
 AC_SUBST(OCAMLBEST)
 AC_SUBST(OCAMLVERSION)
diff --git a/devel_tools/docker/frama-c.20.0/Dockerfile b/devel_tools/docker/frama-c.20.0/Dockerfile
index d73738fb95080d205a3c8a6668c246dbd41ca1a7..2d818583f3db34bbf17cbdbf387b751cedf7f35f 100644
--- a/devel_tools/docker/frama-c.20.0/Dockerfile
+++ b/devel_tools/docker/frama-c.20.0/Dockerfile
@@ -1,7 +1,12 @@
 FROM debian:sid as base
 
-RUN apt update
-RUN apt install opam -y
+# Install non-OCaml dependencies + opam
+RUN apt-get update && apt-get install -y \
+    cvc4 \
+    opam \
+    z3 \
+    && rm -rf /var/lib/apt/lists/*
+
 RUN opam init --disable-sandboxing --compiler=ocaml-base-compiler.4.05.0 -y
 
 # "RUN eval $(opam env)" does not work, so we manually set its variables
@@ -11,11 +16,10 @@ ENV OCAML_TOPLEVEL_PATH "/root/.opam/ocaml-base-compiler.4.05.0/lib/toplevel"
 ENV MANPATH "$MANPATH:/root/.opam/ocaml-base-compiler.4.05.0/man"
 ENV PATH "/root/.opam/ocaml-base-compiler.4.05.0/bin:$PATH"
 
-RUN opam update -y
-RUN opam install depext -y
+RUN opam update -y && opam install depext -y
 
 # Install packages from reference configuration
-RUN opam depext --install -y \
+RUN apt-get update && opam update -y && opam depext --install -y --verbose \
     alt-ergo.2.0.0 \
     apron.20160125 \
     conf-graphviz.0.1 \
@@ -26,7 +30,8 @@ RUN opam depext --install -y \
     why3.1.2.0 \
     yojson.1.7.0 \
     zarith.1.9.1 \
-    --verbose # intentionally left as last line in this RUN command
+    && rm -rf /var/lib/apt/lists/*
+
 RUN why3 config --detect-provers
 
 # with_source: keep Frama-C sources
@@ -47,12 +52,14 @@ RUN cd /root && \
 ARG with_test=no
 
 RUN if [ "${with_test}" != "no" ]; then \
-       opam depext --install -y \
+       apt-get update && \
+       opam update -y && opam depext --install -y \
            conf-python-3.1.0.0 \
            conf-time.1 \
            --verbose \
         && \
-        apt install python -y && \
+        apt-get install python -y && \
+        rm -rf /var/lib/apt/lists/* && \
         cd /root/frama-c-* && \
         make tests; \
     fi
diff --git a/devel_tools/docker/frama-c.21.0/Dockerfile b/devel_tools/docker/frama-c.21.0/Dockerfile
index 3a615a7bf0f9d87ec211b428dd12891c3ea4c57d..131400581b5a4e349737d245f68ef366237fd89e 100644
--- a/devel_tools/docker/frama-c.21.0/Dockerfile
+++ b/devel_tools/docker/frama-c.21.0/Dockerfile
@@ -1,7 +1,12 @@
 FROM debian:sid as base
 
-RUN apt update
-RUN apt install opam -y
+# Install non-OCaml dependencies + opam
+RUN apt-get update && apt-get install -y \
+    cvc4 \
+    opam \
+    z3 \
+    && rm -rf /var/lib/apt/lists/*
+
 RUN opam init --disable-sandboxing --compiler=ocaml-base-compiler.4.07.1 -y
 
 # "RUN eval $(opam env)" does not work, so we manually set its variables
@@ -11,11 +16,10 @@ ENV OCAML_TOPLEVEL_PATH "/root/.opam/ocaml-base-compiler.4.07.1/lib/toplevel"
 ENV MANPATH "$MANPATH:/root/.opam/ocaml-base-compiler.4.07.1/man"
 ENV PATH "/root/.opam/ocaml-base-compiler.4.07.1/bin:$PATH"
 
-RUN opam update -y
-RUN opam install depext -y
+RUN opam update -y && opam install depext -y
 
 # Install packages from reference configuration
-RUN opam depext --install -y \
+RUN apt-get update && opam update -y && opam depext --install -y --verbose \
     alt-ergo.2.0.0 \
     apron.v0.9.12 \
     conf-graphviz.0.1 \
@@ -27,7 +31,8 @@ RUN opam depext --install -y \
     yojson.1.7.0 \
     zarith.1.9.1 \
     zmq.5.1.3 \
-    --verbose # intentionally left as last line in this RUN command
+    && rm -rf /var/lib/apt/lists/*
+
 RUN why3 config --full-config
 
 # with_source: keep Frama-C sources
@@ -48,11 +53,13 @@ RUN cd /root && \
 ARG with_test=no
 
 RUN if [ "${with_test}" != "no" ]; then \
-       opam depext --install -y \
+       apt-get update && \
+       opam update -y && opam depext --install -y \
            conf-python-3.1.0.0 \
            conf-time.1 \
            --verbose \
         && \
+        rm -rf /var/lib/apt/lists/* && \
         cd /root/frama-c-* && \
         make tests; \
     fi
diff --git a/devel_tools/docker/frama-c.21.1/Dockerfile b/devel_tools/docker/frama-c.21.1/Dockerfile
index 8852ac14805bad7b5862b8b1205a5e667ab8ca8c..661e982c76eec496bf58ae484f32f852a7ef4219 100644
--- a/devel_tools/docker/frama-c.21.1/Dockerfile
+++ b/devel_tools/docker/frama-c.21.1/Dockerfile
@@ -1,7 +1,12 @@
 FROM debian:sid as base
 
-RUN apt update
-RUN apt install opam -y
+# Install non-OCaml dependencies + opam
+RUN apt-get update && apt-get install -y \
+    cvc4 \
+    opam \
+    z3 \
+    && rm -rf /var/lib/apt/lists/*
+
 RUN opam init --disable-sandboxing --compiler=ocaml-base-compiler.4.07.1 -y
 
 # "RUN eval $(opam env)" does not work, so we manually set its variables
@@ -11,11 +16,10 @@ ENV OCAML_TOPLEVEL_PATH "/root/.opam/ocaml-base-compiler.4.07.1/lib/toplevel"
 ENV MANPATH "$MANPATH:/root/.opam/ocaml-base-compiler.4.07.1/man"
 ENV PATH "/root/.opam/ocaml-base-compiler.4.07.1/bin:$PATH"
 
-RUN opam update -y
-RUN opam install depext -y
+RUN opam update -y && opam install depext -y
 
 # Install packages from reference configuration
-RUN opam depext --install -y \
+RUN apt-get update && opam update -y && opam depext --install -y --verbose \
     alt-ergo.2.0.0 \
     apron.v0.9.12 \
     conf-graphviz.0.1 \
@@ -27,7 +31,8 @@ RUN opam depext --install -y \
     yojson.1.7.0 \
     zarith.1.9.1 \
     zmq.5.1.3 \
-    --verbose # intentionally left as last line in this RUN command
+    && rm -rf /var/lib/apt/lists/*
+
 RUN why3 config --full-config
 
 # with_source: keep Frama-C sources
@@ -48,11 +53,13 @@ RUN cd /root && \
 ARG with_test=no
 
 RUN if [ "${with_test}" != "no" ]; then \
-       opam depext --install -y \
+       apt-get update && \
+       opam update -y && opam depext --install -y \
            conf-python-3.1.0.0 \
            conf-time.1 \
            --verbose \
         && \
+        rm -rf /var/lib/apt/lists/* && \
         cd /root/frama-c-* && \
         make tests; \
     fi
diff --git a/devel_tools/docker/frama-c.custom/.gitignore b/devel_tools/docker/frama-c.custom/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..028757c13527bdb23c649f219e11e1a4db317087
--- /dev/null
+++ b/devel_tools/docker/frama-c.custom/.gitignore
@@ -0,0 +1,2 @@
+# ignore an eventual frama-c subfolder in this directory
+frama-c
diff --git a/devel_tools/docker/frama-c.custom/Dockerfile b/devel_tools/docker/frama-c.custom/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..c742082bbd45bb69371125d868de56357da68e84
--- /dev/null
+++ b/devel_tools/docker/frama-c.custom/Dockerfile
@@ -0,0 +1,65 @@
+FROM debian:sid as base
+
+# Install non-OCaml dependencies + opam
+RUN apt-get update && apt-get install -y \
+    cvc4 \
+    opam \
+    z3 \
+    && rm -rf /var/lib/apt/lists/*
+
+RUN opam init --disable-sandboxing --compiler=ocaml-base-compiler.4.08.1 -y
+
+# "RUN eval $(opam env)" does not work, so we manually set its variables
+ENV OPAM_SWITCH_PREFIX "/root/.opam/ocaml-base-compiler.4.08.1"
+ENV CAML_LD_LIBRARY_PATH "/root/.opam/ocaml-base-compiler.4.08.1/lib/stublibs:/root/.opam/ocaml-base-compiler.4.08.1/lib/ocaml/stublibs:/root/.opam/ocaml-base-compiler.4.08.1/lib/ocaml"
+ENV OCAML_TOPLEVEL_PATH "/root/.opam/ocaml-base-compiler.4.08.1/lib/toplevel"
+ENV MANPATH "$MANPATH:/root/.opam/ocaml-base-compiler.4.08.1/man"
+ENV PATH "/root/.opam/ocaml-base-compiler.4.08.1/bin:$PATH"
+
+RUN opam update -y && opam install depext -y
+
+# Install packages from reference configuration
+RUN apt-get update && opam update -y && opam depext --install -y --verbose \
+    alt-ergo.2.0.0 \
+    apron.v0.9.12 \
+    conf-graphviz.0.1 \
+    mlgmpidl.1.2.12 \
+    ocamlfind.1.8.1 \
+    ocamlgraph.1.8.8 \
+    ppx_deriving_yojson.3.5.2 \
+    why3.1.3.1 \
+    yojson.1.7.0 \
+    zarith.1.9.1 \
+    zmq.5.1.3 \
+    && rm -rf /var/lib/apt/lists/*
+
+RUN why3 config --full-config
+
+# with_source: keep Frama-C sources
+ARG with_source=no
+
+# copies a cloned, non-public Frama-C
+COPY frama-c /root/frama-c
+
+RUN cd /root && \
+    (cd frama-c && \
+        autoconf && ./configure --disable-gui && \
+        make -j && \
+        make install \
+    ) && \
+    ([ "${with_source}" != "no" ] || rm -rf frama-c)
+
+# with_test: run Frama-C tests; requires "with_source=yes"
+ARG with_test=no
+
+RUN if [ "${with_test}" != "no" ]; then \
+       apt-get update && \
+       opam update -y && opam depext --install -y \
+           conf-python-3.1.0.0 \
+           conf-time.1 \
+           --verbose \
+        && \
+        rm -rf /var/lib/apt/lists/* && \
+        cd /root/frama-c && \
+        make tests; \
+    fi
diff --git a/devel_tools/docker/frama-c.custom/README.md b/devel_tools/docker/frama-c.custom/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..6ce5f94c37e0974215e3678c0512874626431df6
--- /dev/null
+++ b/devel_tools/docker/frama-c.custom/README.md
@@ -0,0 +1,46 @@
+Building a Frama-C Docker image with a custom git clone
+=========================================================================
+
+In order to build a Frama-C Docker image with custom plug-ins, or using
+a custom git repository, do the following:
+
+1. Locally clone Frama-C into the `frama-c` directory, e.g. via
+
+        git clone git@frama-c.com:frama-c/frama-c.git
+
+   If needed, modify the clone to add other plug-ins and/or files inside
+   `frama-c`.
+
+2. If needed, add Debian and opam prerequisites to the appropriate lines in the
+   Dockerfile (after `apt update` and before removing the `apt` cache).
+   If you need to change the opam version, also edit the `ENV` lines.
+
+3. For a "minimal" image (with installed Frama-C, but no source code), run:
+
+        docker build . -t fc-custom # or another tag if you prefer
+
+    For an image with the Frama-C source code (in `/root/frama-c`), run:
+
+        docker build . -t fc-custom-with-source --build-arg=with_source=yes
+
+    For an image with source code + tests (e.g. which runs `make tests`), run:
+
+        docker build . -t fc-custom-with-test --build-arg=with_source=yes --build-arg=with_test=yes
+
+4. In all cases, after building the image, run it with:
+
+        docker run -it fc-custom # or another tag
+
+Frama-C will be installed and its sources will be in `/root/frama-c`.
+
+### Notes
+
+1. If you keep the sources, remember that the Docker image may contain
+   non-public code.
+
+2. Using different tags for the `*-with-source` and `*-with-test` images may
+   allow layer reuse by Docker.
+
+3. If you need files outside `/root/frama-c`, add them to the directory
+   containing this README and add a `COPY` instruction to the `Dockerfile`,
+   e.g. `COPY dir /root/dir`.
diff --git a/devel_tools/docker/frama-c.dev/Dockerfile b/devel_tools/docker/frama-c.dev/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..a1a8c63ae8bd91f412e6e4231415b4f75781ed2e
--- /dev/null
+++ b/devel_tools/docker/frama-c.dev/Dockerfile
@@ -0,0 +1,63 @@
+FROM debian:sid as base
+
+# Install non-OCaml dependencies + opam
+RUN apt-get update && apt-get install -y \
+    cvc4 \
+    opam \
+    z3 \
+    && rm -rf /var/lib/apt/lists/*
+
+RUN opam init --disable-sandboxing --compiler=ocaml-base-compiler.4.08.1 -y
+
+# "RUN eval $(opam env)" does not work, so we manually set its variables
+ENV OPAM_SWITCH_PREFIX "/root/.opam/ocaml-base-compiler.4.08.1"
+ENV CAML_LD_LIBRARY_PATH "/root/.opam/ocaml-base-compiler.4.08.1/lib/stublibs:/root/.opam/ocaml-base-compiler.4.08.1/lib/ocaml/stublibs:/root/.opam/ocaml-base-compiler.4.08.1/lib/ocaml"
+ENV OCAML_TOPLEVEL_PATH "/root/.opam/ocaml-base-compiler.4.08.1/lib/toplevel"
+ENV MANPATH "$MANPATH:/root/.opam/ocaml-base-compiler.4.08.1/man"
+ENV PATH "/root/.opam/ocaml-base-compiler.4.08.1/bin:$PATH"
+
+RUN opam update -y && opam install depext -y
+
+# Install packages from reference configuration
+RUN apt-get update && opam update -y && opam depext --install -y --verbose \
+    alt-ergo.2.0.0 \
+    apron.v0.9.12 \
+    conf-graphviz.0.1 \
+    mlgmpidl.1.2.12 \
+    ocamlfind.1.8.1 \
+    ocamlgraph.1.8.8 \
+    ppx_deriving_yojson.3.5.2 \
+    why3.1.3.1 \
+    yojson.1.7.0 \
+    zarith.1.9.1 \
+    zmq.5.1.3 \
+    && rm -rf /var/lib/apt/lists/*
+
+RUN why3 config --full-config
+
+# with_source: keep Frama-C sources
+ARG with_source=no
+
+RUN cd /root && \
+    git clone https://git.frama-c.com/pub/frama-c.git && \
+    (cd frama-c && \
+        autoconf && ./configure --disable-gui && \
+        make -j && \
+        make install \
+    ) && \
+    [ "${with_source}" != "no" ] || rm -rf frama-c
+
+# with_test: run Frama-C tests; requires "with_source=yes"
+ARG with_test=no
+
+RUN if [ "${with_test}" != "no" ]; then \
+       apt-get update && \
+       opam update -y && opam depext --install -y \
+           conf-python-3.1.0.0 \
+           conf-time.1 \
+           --verbose \
+        && \
+        rm -rf /var/lib/apt/lists/* && \
+        cd /root/frama-c && \
+        make tests; \
+    fi
diff --git a/doc/userman/user-analysis-scripts.tex b/doc/userman/user-analysis-scripts.tex
index 901130870c3b664df60a2d85b7b089d4078f9d38..2f17e71e214d6280bd58470e878618d7db6c4d89 100644
--- a/doc/userman/user-analysis-scripts.tex
+++ b/doc/userman/user-analysis-scripts.tex
@@ -64,11 +64,12 @@ The intended usage is as follows:
   the analysis, with the list of source files and required parameters
   (architecture, preprocessing flags, main function);
 \item The user edits and runs the generated Makefile, adjusting the
-  analysis as needed and re-running \texttt{make}.
+  analysis as needed and re-running \texttt{fcmake}\footnote{\texttt{fcmake}
+  is described in Section~\ref{sec:using-generated-makefile}.}.
 \end{enumerate}
 
 Ideally, after modifying the source code or re-parametrizing the analysis,
-re-running \texttt{make} should be enough to obtain a new result.
+re-running \texttt{fcmake} should be enough to obtain a new result.
 
 Section~\ref{sec:using-generated-makefile} details usage of the Makefile
 and presents an illustrative diagram.
@@ -81,9 +82,9 @@ Makefile from a template. The user must fill in the following information,
 required for running an \Value analysis:
 
 \begin{description}
-\item[machdep]: architectural information about system where the code will run:
-  integer type sizes, compiler, OS, etc. See section~\ref{sec:normalize} for
-  more details.
+\item[machdep]: architectural information about the system where the code will
+  run: integer type sizes, compiler, OS, etc.
+  See section~\ref{sec:normalize} for more details.
 \item[preprocessing flags]: options given to the C preprocessor, mainly
   macros (\texttt{-D}) and include directories (\texttt{-I}).
 \item[list of sources]: the actual list of source files that make a logical
@@ -151,10 +152,16 @@ They allow the production of a JSON Compilation Database
 in section~\ref{sec:preprocessing}). This leads to a different workflow:
 
 \begin{enumerate}
-\item Run CMake with the flag \texttt{-DCMAKE\_EXPORT\_COMPILE\_COMMANDS=1},
-  or install Build EAR (\url{https://github.com/rizsotto/Bear}) and run
-  \texttt{bear make <targets>} instead of \texttt{make <targets>}. This will
-  create a \texttt{compile\_commands.json} file.
+\item For CMake:
+  \begin{itemize}
+  \item Run \texttt{cmake -DCMAKE\_EXPORT\_COMPILE\_COMMANDS=1 <targets>}.
+  \end{itemize}
+  For Makefile:
+  \begin{itemize}
+  \item Install Build EAR (\url{https://github.com/rizsotto/Bear});
+  \item Run \texttt{bear~make~<targets>} (instead of \texttt{make <targets>}).
+  \end{itemize}
+  In both cases, you will obtain a \texttt{compile\_commands.json} file.
 \item Run \texttt{frama-c-script list-files}. A list of the compiled files,
   along with files defining a \texttt{main} function, will be presented.
 \item Run \texttt{frama-c-script make-template} to create a template for
@@ -168,12 +175,64 @@ however, the compilation database may include extraneous sources
 (e.g. when compiling the same source for different binary targets or test
 cases). Manual intervention may be necessary.
 
-\section{Using the generated Makefile}
+\section{Using the generated Makefile, via \texttt{fcmake}}
 \label{sec:using-generated-makefile}
 
 The generated Makefile can be used to run one or several analyses.
-The diagram in Fig.~\ref{fig:analysis-scripts} summarizes its usage.
-Makefile targets and outputs are detailed in this section.
+Its basic usage involving the \texttt{fcmake} alias (equivalent to
+\texttt{make -C .frama-c}) is the following:
+
+\begin{itemize}
+\item \texttt{fcmake <target>.parse}: parse the sources
+\item \texttt{fcmake <target>.eva}: run Eva
+\item \texttt{fcmake <target>.eva.gui}: open the results in the GUI
+\end{itemize}
+
+This section details how to produce the Makefile, how to define the
+\texttt{fcmake} alias, and lists other useful targets and settings.
+
+\subsection*{Storing Frama-C files and results in \texttt{.frama-c}}
+
+By default, the generated \texttt{GNUmakefile} is created in the (hidden)
+directory \texttt{.frama-c}, which should contain all files specific to Frama-C.
+This arrangement provides several benefits:
+
+\begin{itemize}
+\item Frama-C-related files do not pollute the original code; everything
+  is stored in a separate directory, easily identifiable by its name;
+\item Existing makefiles are not overridden by Frama-C's;
+\item Having a standardized structure helps with CI integration.
+\end{itemize}
+
+However, special attention is needed due to a few consequences of this
+structure:
+
+\begin{itemize}
+\item The \texttt{make} process will be run from a subdirectory of the
+  current one; therefore, source and include paths must be either absolute
+  or prefixed with \texttt{..};
+\item In some cases, it may be necessary to add flags such as \texttt{-I ..},
+  so that the preprocessor will find the required files.
+\end{itemize}
+
+\subsection*{Defining and using \texttt{fcmake}}
+
+We recommend defining the following {\em alias} in your shell:
+
+\begin{verbatim}
+alias fcmake='make -C .frama-c'
+\end{verbatim}
+
+Running \texttt{fcmake} will have the same effect as running \texttt{make}
+inside the \texttt{.frama-c} directory.
+
+The commands in this section assume usage of the \texttt{fcmake} alias
+defined above.
+
+\subsection*{Frama-C makefile targets and variables}
+
+The diagram in Fig.~\ref{fig:analysis-scripts} summarizes the usage of
+the generated Makefile. Its targets and outputs are detailed in this section.
 
 \begin{figure}[htbp]
   \begin{center}
@@ -193,8 +252,14 @@ That is, the target name (chosen by the user), suffixed with \texttt{.parse},
 is defined as depending on each of its source files. Changes to any of these
 sources will trigger a recomputation of the AST.
 
-{\em Note:} the target name itself {\em cannot} contain slashes or dots.
+Note that, since the generated makefile is inside \texttt{.frama-c}, relative
+paths to source files will always begin with \texttt{../}, except for
+sources located within \texttt{.frama-c}, e.g. \texttt{fc\_stubs.c}.
+
+\begin{important}
+Target names can contain hyphens and underscores, but neither slashes nor dots.
 See also the {\em Technical Notes} section about some current limitations.
+\end{important}
 
 Then, for each \texttt{.parse} target, a corresponding \texttt{.eva} target
 needs to be added to the \texttt{TARGETS} variable in the Makefile.
@@ -234,6 +299,12 @@ t2.parse: FCFLAGS += -main test2
 t2.parse: CPPFLAGS += -DTEST2
 \end{lstlisting}
 
+\begin{important}
+\texttt{-I} flags referencing relative paths must take into account the
+fact that \FramaC will be run from the \texttt{.frama-c} directory, and
+therefore must include an initial ``\texttt{../}''.
+\end{important}
+
 \subsection{Predefined targets}
 
 The predefined targets below are the {\em raison d'être} of the generated
@@ -253,9 +324,6 @@ quick iterations during parametrization of the analysis.
   and runs the \Value plug-in, with the options given in \texttt{EVAFLAGS}.
   If the analysis succeeds, produces a directory \texttt{<target>.eva} with the
   analysis results and a saved session file.
-  Also creates a timestamped version of \texttt{<target>.eva}, to enable
-  future comparisons between different parametrizations. The non-timestamped
-  version corresponds to the latest (successful) analysis.
   If the analysis fails, tries to save a partial result in
   \texttt{<target>.eva.error} (when possible).
 \item[<target>.eva.gui]: loads the result of the corresponding
@@ -266,6 +334,47 @@ quick iterations during parametrization of the analysis.
   \texttt{.eva} targets.
 \end{description}
 
+\subsection{Adding new analyses and stages}
+
+Besides the predefined \Value-oriented steps, you can easily add other stages
+and analyses, which may or may not depend on \Value.
+
+For instance, to add a SARIF report using the \tool{Markdown Report} plug-in,
+you can simply add, before the template epilogue, the following lines, where
+\texttt{target} is the name of your target:
+
+\begin{makefilecode}
+target.sarif: target.parse
+	$(FRAMAC) -load $^/framac.sav -mdr-gen sarif -mdr-out $@
+\end{makefilecode}
+
+This rule will create a file \texttt{target.sarif} inside the \texttt{.frama-c}
+directory. The rule will depend on the parsing of \texttt{target.parse} and
+use the saved session at \texttt{target.parse/framac.sav}.
+
+If you want the report to run after the analysis with \Value, instead, simply
+replace \texttt{.parse} with \texttt{.eva}.
+
+Then, running \texttt{fcmake target.sarif} will create or update the report,
+recomputing dependencies when needed.
+
+Adding a new stage, with a saved session that can be reused later for other
+stages and analyses, requires just a few more lines, as in the following
+example:
+
+\begin{makefilecode}
+target.wp: target.parse
+	mkdir -p $@
+	$(FRAMAC) -load $^/framac.sav -wp -save $@/framac.sav
+\end{makefilecode}
+
+In the example above, we define a new stage, \texttt{target.wp}, which depends
+on the parsing stage, runs the \tool{WP} plug-in, and saves the result in a
+session file. This session file can then be loaded by another stage,
+or in the GUI. For instance, the \texttt{.gui} predefined target works out of
+the box in this case: running \texttt{fcmake target.wp.gui} will load the saved
+session in the Frama-C GUI.
+
 \section{Script Descriptions}
 \label{sec:script-descriptions}
 
@@ -274,17 +383,17 @@ Run \texttt{frama-c-script help} for more details and optional arguments.
 
 \begin{description}
 \item[make-template]: creates the initial Makefile, based on a template.
-  This command creates a file named \texttt{GNUmakefile} with some hardcoded
-  sections, some filled in interactively by the user, and comments indicating
-  which parts may need change. Once created, it enables the general workflow
-  mentioned earlier.
+  This command creates a file named \texttt{.frama-c/GNUmakefile} with some
+  hardcoded sections, some sections filled in interactively by the user,
+  and comments indicating which parts may need change.
+  Once created, it enables the general workflow mentioned earlier.
 \item[make-wrapper <target> <args>]: calls \texttt{make <target> <args>} with
   a special wrapper: when running \Value, upon encountering one of a few known
   error messages, suggests some actions on how to proceed.
   For instance, if a missing function definition is encountered when analyzing
   the code with \Value, the wrapper will look for its definition and, if found,
   suggest that its source code be added to the analysis. This script is meant
-  to be used with the {\em one at a time} workflow describe in
+  to be used with the {\em one at a time} workflow described in
   section~\ref{alternative-workflows}.
 \item[find-fun <fun>]: looks for possible declarations and definitions
   of function \texttt{<fun>}. Uses a heuristic that does not depend on \FramaC
@@ -298,11 +407,11 @@ Other commands, only useful in a few cases, are described below.
 \item[configure <machdep>]: runs a \texttt{configure}
   script (based on Autoconf) with some settings to emulate a more portable
   system, removing optional code features that could prevent \FramaC from
-  parsing the sources. Currently still depends partially on the host system,
+  parsing the sources. Currently, it still depends partially on the host system,
   so many features are not disabled.
 \item[make-path] (for \FramaC developers): to be used when Frama-C is not
-  installed in the PATH; adds a \texttt{frama-c-path.mk} file that is used
-  by the Makefile generated by \texttt{make-template}.
+  installed in the PATH; adds a \texttt{path.mk} file that is used
+  by the Makefile generated via \texttt{make-template}.
 \item[flamegraph]: opens a {\em flamegraph}\footnote{%
   See \url{https://github.com/brendangregg/FlameGraph} for details about
   flamegraphs.} to visualize which functions take most of the time
@@ -349,7 +458,7 @@ The {\em open-source-case-studies} Git repository (OSCS for short),
 available at \url{https://git.frama-c.com/pub/open-source-case-studies},
 contains several open-source C code bases parametrized with the help of
 analysis scripts. Each case study has its own directory, with a
-\texttt{GNUmakefile} defining one or more analysis targets.
+\texttt{.frama-c/GNUmakefile} defining one or more analysis targets.
 
 Due to the variety of test cases, OSCS provide practical usage
 examples of the \texttt{GNUmakefile} described in this chapter.
@@ -366,16 +475,9 @@ understand some unintuitive behaviors.
 
 \paragraph{\em Changes to header files do not trigger a new parsing/analysis.}
 Currently, changes to included files (e.g. headers) are {\em not}
-tracked by the generated Makefile and may require running \texttt{make}
+tracked by the generated Makefile and may require running \texttt{fcmake}
 with \texttt{-B} (to force recomputation of dependencies), or running
-\texttt{make clean} before re-running \texttt{make}.
-
-\paragraph{\em Why is the generated Makefile called \texttt{GNUmakefile}?}
-GNU Make, by default, searches for a file named \texttt{GNUmakefile} before
-searching for a \texttt{Makefile}. Thus, running \texttt{make} without
-arguments results in running the Makefile generated by \texttt{make-template}.
-You can rename it to \texttt{framac.mk} or something else, and then run it
-via \texttt{make -f framac.mk <targets>}.
+\texttt{fcmake clean} before re-running \texttt{fcmake}.
 
 \paragraph{\em Most scripts are heuristics-based and offer no
   correctness/completeness guarantees.} In order to handle files {\em before}
diff --git a/doc/userman/user-changes.tex b/doc/userman/user-changes.tex
index a688b58cb2e19ef05641b190138dbc5aea7024ff..625dcc2db4a5fcfaa313c0d255f070bfd3b320b5 100644
--- a/doc/userman/user-changes.tex
+++ b/doc/userman/user-changes.tex
@@ -5,6 +5,16 @@ release. First we list changes of the last release.
 
 \section*{\nextframacversion}
 
+\begin{itemize}
+\item \textbf{Getting Started:} added option
+  \texttt{-autocomplete}.
+\item \textbf{Getting Started:} updated installation instructions.
+\item \textbf{Preparing the Sources:} added option
+  \texttt{-print-cpp-commands}.
+\item \textbf{Reports:} add section about SARIF output
+  (via \textsf{Markdown Report}).
+\end{itemize}
+
 \section*{21.0 (Scandium)}
 
 \begin{itemize}
diff --git a/doc/userman/user-report.tex b/doc/userman/user-report.tex
index 79f1b91be3eda2f29617b92dab883e24eee62d44..10effa4444db6d37d5e5e03b8720b6b696cc98a3 100644
--- a/doc/userman/user-report.tex
+++ b/doc/userman/user-report.tex
@@ -19,6 +19,13 @@ It provides the following features, which we detail in turn:
 \item Make Frama-C exit with a non-null status code on some classified warning or error.
 \end{itemize}
 
+\FramaC has recently earned the ability to output data in the SARIF%
+\footnote{Static Analysis Results Interchange Format,
+\url{https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=sarif}} format.
+This is performed by the \textsf{Markdown Report} plug-in, described in
+section~\ref{sarif}.
+
+
 %% --------------------------------------------------------------------------
 %% ---  Textual Report
 %% --------------------------------------------------------------------------
@@ -245,3 +252,38 @@ each one following the format given in Figure~\ref{report-classified-event}.
   warnings (default is: \verb+'REVIEW'+)
 \end{description}
 
+\section{SARIF Output via the Markdown Report Plug-in}\label{sarif}
+
+SARIF is a JSON-based standard output format for static analysis results.
+It is currently supported by \FramaC in its version 2.1.0.
+Some IDEs, such as Visual Code, contain plug-ins which allow importing SARIF
+reports. A few Microsoft tools and libraries related to SARIF are available
+at \url{https://sarifweb.azurewebsites.net/}. Microsoft also publishes
+command-line tools for SARIF, made available via NPM packages and .Net Core
+applications.
+
+\subsection{Prerequisites}
+
+SARIF output is produced by the \textsf{Markdown Report} (MdR) plug-in.
+The plug-in is distributed with \FramaC, but it depends on optional
+features, namely the \texttt{opam} package \texttt{ppx\_deriving\_yojson},
+so it may not be available in every \FramaC installation.
+
+When installing \FramaC via opam, include the optional dependency
+\texttt{ppx\_deriving\_yojson} to ensure MdR will be available.
+Note that MdR has other features and output formats, which are not described
+here.
+
+\subsection{Generating a SARIF Report}
+
+To enable generation of a SARIF report, use option \texttt{-mdr-gen sarif}.
+It will produce a JSON file (by default, \texttt{report.sarif}) with an entry
+for each ACSL property.
+
+You can change the output file name with option \texttt{-mdr-out <f>}.
+
+Note that there are no filtering options in the SARIF output; it is up to the
+tools importing the file to decide which information to sort, filter, and
+display.
+
+For more details about \textsf{Markdown Report}, use option \texttt{-mdr-help.}
diff --git a/doc/userman/user-sources.tex b/doc/userman/user-sources.tex
index 030d362f6f863016ab4cc3de58ce887afb9b8f61..0bb8b4360ed20e101419d6464d87e3603f151742 100644
--- a/doc/userman/user-sources.tex
+++ b/doc/userman/user-sources.tex
@@ -29,34 +29,38 @@ in the figure. Note that some plug-ins, such as \textsf{Variadic}
 (described in chapter~\ref{user-variadic}), perform further AST
 transformations before most analyses are run.
 
-\section{Pre-processing the Source Files}\label{sec:preprocessing}
+\section{Preprocessing the Source Files}\label{sec:preprocessing}
 
 The list of files to analyze must be provided on the command line, or
 chosen interactively in the GUI. Files with the suffix
-{\tt .i} are assumed to be already pre-processed \C files. \FramaC
-pre-processes the other files with the following command.
+{\tt .i} are assumed to be already preprocessed \C files. \FramaC
+preprocesses {\tt .c} and {\tt .h} files with the following basic command:
 \begin{shell}
 \$ gcc -C -E -I .
 \end{shell}
+Plus some architecture-dependent flags. The {\em exact} preprocessing command
+line can be obtained via options \texttt{-kernel-msg-key pp} and
+\optiondef{-}{print-cpp-commands} (the latter exits \FramaC after printing).
 
 Option \optiondef{-}{cpp-extra-args} can be used to add arguments to the
-default pre-processing command, typically via the inclusion of defines
+default preprocessing command, typically via the inclusion of defines
 (\texttt{-D} switches) and header directories (\texttt{-I} switches), as in
 \texttt{-cpp-extra-args="-DDEBUG -DARCH=ia32 -I./headers"}.
 You can also add arguments on a per-file basis, using option
 \optiondef{-}{cpp-extra-args-per-file}.
 
-If you need to, you can also {\em replace} the pre-processing command
+If you need to, you can also {\em replace} the preprocessing command
 entirely with option \optiondef{-}{cpp-command}. Placeholders (see below)
 can be used for advanced commands.
-If no placeholders are used, the pre-processor is invoked in the
+If no placeholders are used, the preprocessor is invoked in the
 following way.
 \begin{commands}
-\texttt{<cmd> <args> -o <output file> <input file>}
+\texttt{<cmd> <args> <input file> -o <output file>}
 \end{commands}
 
-In this command, \texttt{<output file>} is chosen by \FramaC while
-\texttt{<input file>} is one of the filenames provided by the user.
+In this command, \texttt{<output file>} is a temporary filename chosen by
+\FramaC while \texttt{<input file>} is one of the filenames provided by the
+user.
 
 For commands which do not follow this pattern, it is also possible to use
 the following placeholders:
@@ -103,29 +107,29 @@ are ignored. Also note that the use of the database simply adds flags
 be specified by the user.
 
 In all of the above cases,
-\acsl annotations are pre-processed by default (option \optiondef{-}{pp-annot}
-is set by default). Unless a custom pre-processor is specified
+\acsl annotations are preprocessed by default (option \optiondef{-}{pp-annot}
+is set by default). Unless a custom preprocessor is specified
 (via \optionuse{-}{cpp-frama-c-compliant}), \FramaC considers that \gcc is
-installed and uses it as pre-processor.
-If you do \emph{not} want annotations to be pre-processed, you need to pass
+installed and uses it as preprocessor.
+If you do \emph{not} want annotations to be preprocessed, you need to pass
 option \texttt{-no-pp-annot} to \FramaC. Note that some headers in the
 standard C library provided with \FramaC (described below) use such annotations,
 therefore it might be necessary to disable inclusion of such headers.
 
-Also note that ACSL annotations are pre-processed separately from the C
+Also note that ACSL annotations are preprocessed separately from the C
 code in a second pass, and that arguments given as \texttt{-cpp-extra-args} are
-\emph{not} given to the second pass of pre-processing. Instead,
+\emph{not} given to the second pass of preprocessing. Instead,
 \texttt{-pp-annot} relies on the ability of \gcc to output all
 macro definitions (including those given with \texttt{-D}) in the
-pre-processed file. In particular, \texttt{-cpp-extra-args} must be
+preprocessed file. In particular, \texttt{-cpp-extra-args} must be
 used if you are including header files who behave differently
 depending on the number of times they are included.
 
 In addition, files having the suffix \texttt{.ci} will be considered as needing
 preprocessing for ACSL annotations only. Those files may contain
-\texttt{\#define} directives and annotations are pre-processed as explained in
+\texttt{\#define} directives and annotations are preprocessed as explained in
 the previous paragraph. This allows to have macros in ACSL annotations while
-using a non-GNU-like pre-processor.
+using a non-GNU-like preprocessor.
 
 \begin{important}
   An experimental, incomplete, C standard library is bundled with \FramaC and installed
@@ -143,7 +147,7 @@ using a non-GNU-like pre-processor.
 
 \section{Merging the Source Code files}
 
-After pre-processing, \FramaC parses, type-checks and links the source
+After preprocessing, \FramaC parses, type-checks and links the source
 code.  It also performs these operations for the \acsl annotations
 optionally present in the program. Together, these steps form the
 \emph{merging} phase of the creation of an analysis project.
@@ -347,7 +351,7 @@ supported are typedefs redefinition.
 a certain number of C macros. They are summarized below.
 
 \begin{description}
-\item \textttdef{\_\_FRAMAC\_\_}: defined to 1 during pre-processing by \FramaC,
+\item \textttdef{\_\_FRAMAC\_\_}: defined to 1 during preprocessing by \FramaC,
 as if the user had added \texttt{-D\_\_FRAMAC\_\_} to the command line. Useful
 for conditional compilation and detection of an execution by \FramaC.
 
@@ -465,7 +469,7 @@ preparation itself succeeds, by running \FramaC without any option.
 \$ frama-c <input files>
 \end{shell}
 
-If you need to use other options for pre-processing or normalizing the source
+If you need to use other options for preprocessing or normalizing the source
 code, you can use the option \optiondef{-}{typecheck} for
 the same purpose. For instance:
 \begin{shell}
diff --git a/doc/userman/user-start.tex b/doc/userman/user-start.tex
index 099980681bbc7495273ca9b0a0e83435773c346d..dc592cf246d3acbba28e883b9328683379db7c27 100644
--- a/doc/userman/user-start.tex
+++ b/doc/userman/user-start.tex
@@ -6,9 +6,8 @@ This chapter describes \emph{how} to install \FramaC and
 
 \section{Installation}\label{sec:install}\index{Installation}
 
-The \FramaC platform is distributed as source code. Binaries
-are also available for popular architectures. All distributions
-include the \FramaC kernel and a base set of open-source plug-ins.
+The \FramaC platform is distributed as source code, including the \FramaC kernel
+and a base set of open-source plug-ins.
 
 The recommended way to install \FramaC is by using the
 \opam\index{opam}\footnote{\url{http://opam.ocaml.org}} package manager to
@@ -22,46 +21,38 @@ there is a delay between each new \FramaC release and the availability of a
 binary package for the considered platform.
 
 Finally, \FramaC can be compiled and installed from the source distribution,
-as long as its dependencies have already been installed.
+as long as its dependencies have already been installed. The exact set of
+dependencies varies from release to release. They are listed as constraints
+in the \texttt{opam/opam} file of the source distribution.
+
+A {\em reference configuration}, guaranteed to be a working set of dependencies
+for \FramaC kernel and the open-source plug-ins included in the source
+distribution, is available in the \texttt{reference-configuration.md} file of
+the source distribution.
+
+For more installation instructions, consider reading the \texttt{INSTALL.md}
+file of the source distribution. The main components necessary for compiling
+and running \FramaC are described below.
 
-The dependencies of the \FramaC kernel are as follows. Each plug-in may
-define its own set of additional dependencies.
-Instructions for installing \FramaC from source
-may be found in the file \texttt{INSTALL.md} of the source distribution.
 \begin{description}
 \item[A \C pre-processor]\index{C pre-processor} is required for \emph{using}
-  \FramaC on \C files. By default, \FramaC tries to use \texttt{gcc -C -E -I.}
-  as pre-processing command, but this command can be customized (see
-  Section~\ref{sec:preprocessing}). If you do not have any \C pre-processor,
+  \FramaC on \C files. If you do not have any \C pre-processor,
   you can only run \FramaC on already pre-processed \texttt{.i} files.
-\item[A \C compiler]\index{C compiler} is required to compile the \FramaC kernel.
-\item[A \tool{Unix}-like compilation environment] is mandatory and shall
-  have at least the tool \texttt{GNU
-    make}\footnote{\url{http://www.gnu.org/software/make}} version 3.81 or
-  higher, as well as various POSIX commands, libraries and header files.
+\item[A \C compiler]\index{C compiler} is required to compile the \FramaC
+  kernel.
+\item[A \tool{Unix}-like compilation environment] with at least the tool
+  \texttt{GNU make}\footnote{\url{http://www.gnu.org/software/make}},
+  as well as various POSIX commands, libraries and header files, is necessary
+  for compiling \FramaC and its plug-ins.
 \item[The \caml compiler]\index{OCaml compiler}\footnote{\url{http://ocaml.org}}
-  is required both for compiling \FramaC from source \emph{and} for compiling additional
-  plug-ins. Version greater or equal than 4.05.0 of the compiler must be used.
-
-%  Support for some plug-ins in native compilation mode (see
-%  Section~\ref{sec:modes})\index{Native-compiled} requires the so-called
-%  \emph{native dynamic linking} feature of \caml.
-\item[\tool{Gtk}-related
-  packages:]\codeidx{GTK+}\codeidx{Lablgtk}\codeidx{GtkSourceView} \tool{\sc
-  gtk+}\footnote{\url{http://www.gtk.org}} version 2.4 or higher,
-  \tool{GtkSourceView}\footnote{\url{http://projects.gnome.org/gtksourceview}}
-  version 2.x, \tool{GnomeCanvas}\footnote{\url{http://library.gnome.org/devel/libgnomecanvas}} version 2.x as well as
-  \tool{LablGtk}\footnote{\url{http://lablgtk.forge.ocamlcore.org}}
-  version 2.18.2 or higher are required for building the Graphical User Interface
-  (GUI) of \FramaC.
-\item[\tool{OcamlGraph} package:]\codeidx{OcamlGraph} \FramaC needs the
-  \tool{OcamlGraph}\footnote{\url{http://ocamlgraph.lri.fr}} package, version
-  $1.8.8$.
-\item[\tool{Zarith} package:]\codeidx{Zarith} \FramaC requires the
-  \tool{Zarith}\footnote{\url{http://forge.ocamlcore.org/projects/zarith}}
-  package, used for large integer computations.
+  is required both for compiling \FramaC from source \emph{and} for compiling
+  additional plug-ins. Compatible OCaml versions are listed as constraints in
+  the \texttt{opam/opam} file.
 \end{description}
 
+Other components, such as OcamlGraph, Zarith, Gtk-related packages for the GUI,
+etc., are listed in the \texttt{INSTALL.md} and \texttt{opam/opam} files.
+
 \section{One Framework, Several Executables}\label{sec:modes}
 
 \FramaC installs some executables\footnote{On Windows OS, the
@@ -266,13 +257,18 @@ content of the file to \texttt{\~{}/.bash\_completion}
 \item You can \texttt{source} the file, e.g. from your \texttt{.bashrc} with
 the following command:
 \begin{verbatim}
-source $(frama-c -print-share-path)/.autocomplete_frama-c || true
+source $(frama-c-config -share)/autocomplete_frama-c || true
 \end{verbatim}
 \end{itemize}
 
 There is also an autocompletion script for zsh, \texttt{\_frama-c}, also
 in the shared resources directory. Look inside for installation instructions.
 
+The kernel option \optiondef{-}{autocomplete} provides a text output listing
+all \FramaC options, so that autocompletion scripts may use it to provide
+completion. The \FramaC team welcomes improved and additional autocompletion
+scripts.
+
 \subsection{Splitting a \FramaC Execution into Several Steps}\label{sec:then}
 
 By default, \FramaC parses its command line in an \emph{unspecified} order and
diff --git a/headers/header_spec.txt b/headers/header_spec.txt
index a201e0f32e7a5d6c5491bb2f1e97396c84fe0add..4b3ef56f0a6cffb0436ecc0ac3f95556798d6d98 100644
--- a/headers/header_spec.txt
+++ b/headers/header_spec.txt
@@ -127,6 +127,7 @@ share/analysis-scripts/git_utils.py: .ignore
 share/analysis-scripts/list_files.py: .ignore
 share/analysis-scripts/make_template.py: .ignore
 share/analysis-scripts/make_wrapper.py: .ignore
+share/analysis-scripts/normalize_jcdb.py: .ignore
 share/analysis-scripts/parse-coverage.sh: .ignore
 share/analysis-scripts/prologue.mk: CEA_LGPL
 share/analysis-scripts/README.md: .ignore
@@ -1369,8 +1370,6 @@ src/plugins/value/utils/library_functions.mli: CEA_LGPL_OR_PROPRIETARY
 src/plugins/value/utils/mark_noresults.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/value/utils/eva_annotations.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/value/utils/eva_annotations.mli: CEA_LGPL_OR_PROPRIETARY
-src/plugins/value/utils/state_import.ml: CEA_LGPL_OR_PROPRIETARY
-src/plugins/value/utils/state_import.mli: CEA_LGPL_OR_PROPRIETARY
 src/plugins/value/utils/structure.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/value/utils/structure.mli: CEA_LGPL_OR_PROPRIETARY
 src/plugins/value/utils/unit_tests.ml: CEA_LGPL_OR_PROPRIETARY
diff --git a/man/frama-c.1 b/man/frama-c.1
index 66cfcd0fea3cb54912b7077fc834d76899be92e8..92ee3debed2a8a3d2436bfb37cebe1338704a786 100644
--- a/man/frama-c.1
+++ b/man/frama-c.1
@@ -25,45 +25,45 @@
 .\" using pandoc 2.0 or newer. To modify this file, edit the Markdown file
 .\" and run `make man/frama-c.1`.
 
-.TH FRAMA-C 1 2020-04-02
+.TH FRAMA-C 1 2020-09-21
 .SH NAME
 .PP
-frama\-c[.byte] \- a static analyzer for C programs
+frama-c[.byte] - a static analyzer for C programs
 .PP
-frama\-c\-gui[.byte] \- the graphical interface of frama\-c
+frama-c-gui[.byte] - the graphical interface of frama-c
 .SH SYNOPSIS
 .PP
-\f[B]frama\-c\f[] [ \f[I]options\f[] ] \f[I]files\f[]
+\f[B]frama-c\f[R] [ \f[I]options\f[R] ] \f[I]files\f[R]
 .SH DESCRIPTION
 .PP
-\f[B]frama\-c\f[] is a suite of tools dedicated to the analysis of
+\f[B]frama-c\f[R] is a suite of tools dedicated to the analysis of
 source code written in C.
 It gathers several analysis techniques in a single collaborative
 framework.
 This framework can be extended by additional plugins placed in the
-\f[B]$FRAMAC_PLUGIN\f[] directory.
+\f[B]$FRAMAC_PLUGIN\f[R] directory.
 The command
 .RS
 .PP
-frama\-c \-\-plugins
+frama-c --plugins
 .RE
 .PP
 will provide the full list of the plugins that are currently installed.
 .PP
-\f[B]frama\-c\-gui\f[] is the graphical user interface of
-\f[B]frama\-c\f[].
-It features the same options as the command\-line version.
+\f[B]frama-c-gui\f[R] is the graphical user interface of
+\f[B]frama-c\f[R].
+It features the same options as the command-line version.
 .PP
-\f[B]frama\-c.byte\f[] and \f[B]frama\-c\-gui.byte\f[] are the OCaml
-bytecode versions of the command\-line and graphical user interface
+\f[B]frama-c.byte\f[R] and \f[B]frama-c-gui.byte\f[R] are the OCaml
+bytecode versions of the command-line and graphical user interface
 respectively.
 .PP
-By default, Frama\-C recognizes \f[I].c\f[] files as C files needing
-pre\-processing and \f[I].i\f[] files as C files having been already
-pre\-processed.
+By default, Frama-C recognizes \f[I].c\f[R] files as C files needing
+pre-processing and \f[I].i\f[R] files as C files having been already
+pre-processed.
 Some plugins may extend the list of recognized files.
-Pre\-processing can be customized through the \f[B]\-cpp\-command\f[]
-and \f[B]\-cpp\-extra\-args\f[] options.
+Pre-processing can be customized through the \f[B]-cpp-command\f[R] and
+\f[B]-cpp-extra-args\f[R] options.
 .SH OPTIONS
 .SS Syntax
 .PP
@@ -71,738 +71,557 @@ Options taking an additional parameter can also be written under the
 form
 .RS
 .PP
-\-\f[I]option\f[]=\f[I]param\f[]
+-\f[I]option\f[R]=\f[I]param\f[R]
 .RE
 .PP
-This form is mandatory when \f[I]param\f[] starts with a dash (`\-').
+This form is mandatory when \f[I]param\f[R] starts with a dash (`-').
 .PP
 Most options that take no parameter have a corresponding
 .RS
 .PP
-\-no\-\f[I]option\f[]
+-no-\f[I]option\f[R]
 .RE
 .PP
 option which has the opposite effect.
 .SS Help options
 .TP
-.B \-help
+.B -help
 gives a short usage notice.
-.RS
-.RE
 .TP
-.B \-kernel\-help
-prints the list of options recognized by Frama\-C's kernel
-.RS
-.RE
+.B -kernel-help
+prints the list of options recognized by Frama-C\[cq]s kernel
 .TP
-.B \-explain
+.B -explain
 prints a help message for each other option given on the command line
-.RS
-.RE
 .TP
-.B \-verbose \f[I]n\f[]
+.B -verbose \f[I]n\f[R]
 sets verbosity level.
 Defaults to 1.
 Setting it to 0 will output less progress messages.
-This level can also be set on a per\-\f[I]plugin\f[] basis, with option
-\-\f[I]plugin\f[]\-\f[B]verbose\f[] \f[I]n\f[].
+This level can also be set on a per-\f[I]plugin\f[R] basis, with option
+-\f[I]plugin\f[R]-\f[B]verbose\f[R] \f[I]n\f[R].
 Verbosity level of the kernel can be controlled with option
-\f[B]\-kernel\-verbose\f[] \f[I]n\f[].
-.RS
-.RE
+\f[B]-kernel-verbose\f[R] \f[I]n\f[R].
 .TP
-.B \-debug \f[I]n\f[]
+.B -debug \f[I]n\f[R]
 sets debugging level.
 Defaults to 0, meaning no debugging messages.
-This option has the same per\-plugin (and kernel) specializations as
-\f[B]\-verbose\f[].
-.RS
-.RE
+This option has the same per-plugin (and kernel) specializations as
+\f[B]-verbose\f[R].
 .TP
-.B \-quiet
+.B -quiet
 sets verbosity and debugging level to 0.
-.RS
-.RE
-.SS Options controlling Frama\-C's kernel
+.SS Options controlling Frama-C\[cq]s kernel
 .TP
-.B \-absolute\-valid\-range \f[I]min\-max\f[]
-considers that all numerical addresses in the range \f[I]min\-max\f[]
+.B -absolute-valid-range \f[I]min-max\f[R]
+considers that all numerical addresses in the range \f[I]min-max\f[R]
 are valid.
 Bounds are parsed as OCaml integer constants.
 By default, all numerical addresses are considered invalid.
-.RS
-.RE
 .TP
-.B \-add\-path \f[I]p1[,p2[\&...,pn]]\f[]
-adds directories \f[I]p1\f[] through \f[I]pn\f[] to the list of
+.B -add-path \f[I]p1[,p2[\&...,pn]]\f[R]
+adds directories \f[I]p1\f[R] through \f[I]pn\f[R] to the list of
 directories in which plugins are searched.
-.RS
-.RE
 .TP
-.B [\-no]\-aggressive\-merging
+.B [-no]-aggressive-merging
 merges function definitions modulo renaming.
 Defaults to no.
-.RS
-.RE
 .TP
-.B [\-no]\-allow\-duplication
+.B [-no]-allow-duplication
 allows duplication of small blocks during normalization of tests and
 loops.
 Otherwise, normalization uses labels and gotos.
-Bigger blocks and blocks with non\-trivial control flow are never
+Bigger blocks and blocks with non-trivial control flow are never
 duplicated.
 Defaults to yes.
-.RS
-.RE
 .TP
-.B [\-no]\-annot
+.B [-no]-annot
 reads ACSL annotations.
 This is the default.
-Annotations are pre\-processed by default.
-Use \-no\-pp\-annot if you don't want to expand macros in annotations.
-.RS
-.RE
+Annotations are pre-processed by default.
+Use -no-pp-annot if you don\[cq]t want to expand macros in annotations.
+.TP
+.B -autocomplete \f[I]p1,\&...,pn\f[R]
+lists the options of plugins \f[I]p1,\&...,pn\f[R] in a format suitable
+for autocompletion scripts.
 .TP
-.B \-big\-ints\-hex \f[I]max\f[]
-integers larger than \f[I]max\f[] are displayed in hexadecimal (by
+.B -big-ints-hex \f[I]max\f[R]
+integers larger than \f[I]max\f[R] are displayed in hexadecimal (by
 default, all integers are displayed in decimal).
-.RS
-.RE
 .TP
-.B \-check
+.B -check
 performs integrity checks on the internal AST (for developers only).
-.RS
-.RE
 .TP
-.B [\-no]\-asm\-contracts
-generates contracts for assembly code written according to gcc's
+.B [-no]-asm-contracts
+generates contracts for assembly code written according to gcc\[cq]s
 extended syntax.
 Defaults to yes.
-.RS
-.RE
 .TP
-.B [\-no]\-asm\-contracts\-auto\-validate
+.B [-no]-asm-contracts-auto-validate
 automatically marks contracts generated from asm as valid.
 Defaults to no.
-.RS
-.RE
 .TP
-.B \-c11
+.B -c11
 enables (partial) C11 compatibility, e.g.\ typedef redefinitions.
 Defaults to no.
-.RS
-.RE
 .TP
-.B [\-no]\-collapse\-call\-cast
+.B [-no]-collapse-call-cast
 allows implicit cast between the value returned by a function and the
 lvalue it is assigned to.
 Otherwise, a temporary variable is used and the cast is made explicit.
 Defaults to yes.
-.RS
-.RE
 .TP
-.B [\-no]\-constfold
+.B [-no]-constfold
 folds all syntactically constant expressions in the code before
 analyses.
 Defaults to no.
-.RS
-.RE
 .TP
-.B \-const\-readonly
+.B -const-readonly
 variables with const qualifier must be actually constant.
 Defaults to yes.
-The opposite option is \f[B]\-unsafe\-writable\f[].
-.RS
-.RE
+The opposite option is \f[B]-unsafe-writable\f[R].
 .TP
-.B [\-no]\-continue\-annot\-error
-when analyzing an annotation, the default behavior (the \f[B]\-no\f[]
+.B [-no]-continue-annot-error
+when analyzing an annotation, the default behavior (the \f[B]-no\f[R]
 version of this option) when a typechecking error occurs is to reject
 the source file as is the case for typechecking errors within the C
 code.
 With this option on, the typechecker will only output a warning and
-discard the annotation but type‐checking will continue (errors in C code
-are still fatal, though).
+discard the annotation but type\[hy]checking will continue (errors in C
+code are still fatal, though).
 .PD 0
 .P
 .PD
-\f[B]Deprecated\f[]: use \f[B]\-kernel\-warn\-key annot\-error\f[]
+\f[B]Deprecated\f[R]: use \f[B]-kernel-warn-key annot-error\f[R]
 instead.
-.RS
-.RE
 .TP
-.B \-cpp\-command \f[I]cmd\f[]
-uses \f[I]cmd\f[] as the command to pre\-process C files.
-Defaults to the \f[B]CPP\f[] environment variable or to
-.RS
-.RE
+.B -cpp-command \f[I]cmd\f[R]
+uses \f[I]cmd\f[R] as the command to pre-process C files.
+Defaults to the \f[B]CPP\f[R] environment variable or to
 .RS
 .PP
-gcc \-C \-E \-I.
+gcc -C -E -I.
 .RE
 .PP
 if it is not set.
 If unset, the command is built as follows:
 .RS
 .PP
-CPP \-o
+CPP -o
 .RE
 .PP
-\f[I]%1\f[] and \f[I]%2\f[] can be used into the \f[B]CPP\f[] string to
-mark the position of \f[I]\f[] and \f[I]\f[] respectively.
+\f[I]%1\f[R] and \f[I]%2\f[R] can be used into the \f[B]CPP\f[R] string
+to mark the position of \f[I]\f[R] and \f[I]\f[R] respectively.
 Note that this option is often better replaced by
-\f[B]\-cpp\-extra\-args\f[].
+\f[B]-cpp-extra-args\f[R].
 .TP
-.B \-cpp\-extra\-args \f[I]args\f[]
-gives additional arguments to the pre\-processor.
-Pre\-processing annotations is done in two separate pre\-processing
+.B -cpp-extra-args \f[I]args\f[R]
+gives additional arguments to the pre-processor.
+Pre-processing annotations is done in two separate pre-processing
 stages.
 The first one is a normal pass on the C code which retains macro
 definitions.
 These are then used in the second pass during which annotations are
-pre\-processed.
-\f[I]args\f[] are used only for the first pass, so that arguments that
+pre-processed.
+\f[I]args\f[R] are used only for the first pass, so that arguments that
 should not be used twice (such as additional include directives or macro
-definitions) must thus go there instead of \f[B]\-cpp\-command\f[].
-.RS
-.RE
+definitions) must thus go there instead of \f[B]-cpp-command\f[R].
 .TP
-.B \-cpp\-extra\-args\-per\-file \f[I]file1:args1,\&...,filen:argsn\f[]
-like \f[B]\-cpp\-extra\-args\f[], but the arguments only apply to the
+.B -cpp-extra-args-per-file \f[I]file1:args1,\&...,filen:argsn\f[R]
+like \f[B]-cpp-extra-args\f[R], but the arguments only apply to the
 specified files.
-.RS
-.RE
 .TP
-.B [\-no]\-cpp\-frama\-c\-compliant
-indicates that the chosen preprocessor complies to some Frama\-C
+.B [-no]-cpp-frama-c-compliant
+indicates that the chosen preprocessor complies to some Frama-C
 requirements, such as accepting the same set of options as GNU cpp, and
-accepting architecture\-specific options such as \-m32/\-m64.
+accepting architecture-specific options such as -m32/-m64.
 Default values depend on the installed preprocessor at configure time.
-See also \f[B]\-pp\-annot\f[].
-.RS
-.RE
+See also \f[B]-pp-annot\f[R].
 .TP
-.B [\-no]\-autoload\-plugins
+.B [-no]-autoload-plugins
 when on, load all the dynamic plugins found in the search path (see
-\f[B]\-print\-plugin\-path\f[] for more information on the default
-search path).
-Otherwise, only plugins requested by \f[B]\-load\-module\f[] will be
+\f[B]-print-plugin-path\f[R] for more information on the default search
+path).
+Otherwise, only plugins requested by \f[B]-load-module\f[R] will be
 loaded.
 Defaults to on.
-.RS
-.RE
 .TP
-.B \-enums \f[I]repr\f[]
+.B -enums \f[I]repr\f[R]
 choose the way the representation of enumerated types is determined.
-\f[B]frama\-c \-enums help\f[] gives the list of available options.
-Default is \f[B]gcc\-enums\f[].
-.RS
-.RE
+\f[B]frama-c -enums help\f[R] gives the list of available options.
+Default is \f[B]gcc-enums\f[R].
 .TP
-.B \-float\-digits \f[I]n\f[]
-when outputting floating\-point numbers, display \f[I]n\f[] digits.
+.B -float-digits \f[I]n\f[R]
+when outputting floating-point numbers, display \f[I]n\f[R] digits.
 Defaults to 12.
-.RS
-.RE
 .TP
-.B \-float\-flush\-to\-zero
+.B -float-flush-to-zero
 floating point operations flush to zero.
-.RS
-.RE
 .TP
-.B \-float\-hex
+.B -float-hex
 display floats as hexadecimal.
-.RS
-.RE
 .TP
-.B \-float\-normal
+.B -float-normal
 display floats with the standard OCaml routine.
-.RS
-.RE
 .TP
-.B \-float\-relative
-display float intervals as [ \f[I]lower_bound\f[]++\f[I]width\f[] ].
-.RS
-.RE
+.B -float-relative
+display float intervals as [ \f[I]lower_bound\f[R]++\f[I]width\f[R] ].
 .TP
-.B [\-no]\-frama\-c\-stdlib
-adds \f[B]\-I$FRAMAC_SHARE/libc\f[] to the options given to the cpp
+.B [-no]-frama-c-stdlib
+adds \f[B]-I$FRAMAC_SHARE/libc\f[R] to the options given to the cpp
 command.
-If \f[B]\-cpp\-frama\-c\-compliant\f[] is not false, also adds
-\f[B]\-nostdinc\f[] to prevent an inconsistent mix of system and
-Frama\-C header files.
+If \f[B]-cpp-frama-c-compliant\f[R] is not false, also adds
+\f[B]-nostdinc\f[R] to prevent an inconsistent mix of system and Frama-C
+header files.
 Defaults to yes.
-.RS
-.RE
 .TP
-.B \-implicit\-function\-declaration \f[I]action\f[]
+.B -implicit-function-declaration \f[I]action\f[R]
 warns or aborts when a function is called before it has been declared.
-\f[I]action\f[] can be one of \f[B]ignore\f[], \f[B]warn\f[], or
-\f[B]error\f[].
-Defaults to \f[B]warn\f[].
+\f[I]action\f[R] can be one of \f[B]ignore\f[R], \f[B]warn\f[R], or
+\f[B]error\f[R].
+Defaults to \f[B]warn\f[R].
 .PD 0
 .P
 .PD
-\f[B]Deprecated\f[]: use \f[B]\-kernel\-warn\-key
-typing:implicit\-function\-declaration\f[] instead.
-.RS
-.RE
+\f[B]Deprecated\f[R]: use \f[B]-kernel-warn-key
+typing:implicit-function-declaration\f[R] instead.
 .TP
-.B \-initialized\-padding\-locals
+.B -initialized-padding-locals
 implicit initialization of locals sets padding bits to 0.
 If false, padding bits are left uninitialized.
 Defaults to yes.
-.RS
-.RE
 .TP
-.B \-inline\-calls \f[I]f1,\&...,fn\f[]
-syntactically inlines calls to functions \f[I]f1,\&...,fn\f[].
-Use \f[B]\@inline\f[] to select all functions with attribute
-\f[I]inline\f[].
+.B -inline-calls \f[I]f1,\&...,fn\f[R]
+syntactically inlines calls to functions \f[I]f1,\&...,fn\f[R].
+Use \f[B]\[at]inline\f[R] to select all functions with attribute
+\f[I]inline\f[R].
 Recursive functions are inlined only at the first level.
 Calls via function pointers are not inlined.
-.RS
-.RE
 .TP
-.B \-journal\-disable
+.B -journal-disable
 do not output a journal of the current session.
-See \f[B]\-journal\-enable\f[].
-.RS
-.RE
+See \f[B]-journal-enable\f[R].
 .TP
-.B \-journal\-enable
+.B -journal-enable
 on by default, dumps a journal of all the actions performed during the
-current Frama\-C session in the form of an OCaml script that can be
-replayed with \f[B]\-load\-script\f[].
-The name of the script can be set with the \f[B]\-journal\-name\f[]
+current Frama-C session in the form of an OCaml script that can be
+replayed with \f[B]-load-script\f[R].
+The name of the script can be set with the \f[B]-journal-name\f[R]
 option.
-.RS
-.RE
 .TP
-.B \-journal\-name \f[I]name\f[]
-sets the name of the journal file (without the \f[I].ml\f[] extension).
-Defaults to \f[B]frama_c_journal\f[].
-.RS
-.RE
+.B -journal-name \f[I]name\f[R]
+sets the name of the journal file (without the \f[I].ml\f[R] extension).
+Defaults to \f[B]frama_c_journal\f[R].
 .TP
-.B \-json\-compilation\-database \f[I]path\f[]
-use \f[I]path\f[] as a JSON compilation database (see
+.B -json-compilation-database \f[I]path\f[R]
+use \f[I]path\f[R] as a JSON compilation database (see
 <https://clang.llvm.org/docs/JSONCompilationDatabase.html> for more
-information): each file preprocessed by Frama\-C will include
-corresponding \f[B]\-I\f[] and \f[B]\-D\f[] flags according to the
-specifications in \f[I]path\f[].
-If \f[I]path\f[] is a directory, use
-\f[B]<path>/compile_commands.json\f[].
+information): each file preprocessed by Frama-C will include
+corresponding \f[B]-I\f[R] and \f[B]-D\f[R] flags according to the
+specifications in \f[I]path\f[R].
+If \f[I]path\f[R] is a directory, use
+\f[B]<path>/compile_commands.json\f[R].
 Disabled by default.
-.RS
-.RE
 .TP
-.B [\-no]\-keep\-comments
-tries to preserve comments when pretty\-printing the source code.
+.B [-no]-keep-comments
+tries to preserve comments when pretty-printing the source code.
 Defaults to no.
-.RS
-.RE
 .TP
-.B [\-no]\-keep\-switch
-when \f[B]\-simplify\-cfg\f[] is set, keeps switch statements.
+.B [-no]-keep-switch
+when \f[B]-simplify-cfg\f[R] is set, keeps switch statements.
 Defaults to no.
-.RS
-.RE
 .TP
-.B \-keep\-unused\-specified\-functions
-see \f[B]\-remove\-unused\-specified\-functions\f[].
-.RS
-.RE
+.B -keep-unused-specified-functions
+see \f[B]-remove-unused-specified-functions\f[R].
 .TP
-.B \-keep\-unused\-types
-see \f[B]\-remove\-unused\-types\f[].
-.RS
-.RE
+.B -keep-unused-types
+see \f[B]-remove-unused-types\f[R].
 .TP
-.B \-kernel\-log \f[I]kind:file\f[]
-copies log messages from the Frama\-C's kernel to file.
-\f[I]kind\f[] specifies which kinds of messages to be copied (e.g.
-\f[B]w\f[] for warnings, \f[B]e\f[] for errors, etc.).
-See \f[B]\-kernel\-help\f[] for more details.
-Can also be set on a per\-plugin basis, with option
-\-\f[I]<plugin>\f[]\-\f[B]log\f[].
-.RS
-.RE
+.B -kernel-log \f[I]kind:file\f[R]
+copies log messages from the Frama-C\[cq]s kernel to file.
+\f[I]kind\f[R] specifies which kinds of messages to be copied
+(e.g.\ \f[B]w\f[R] for warnings, \f[B]e\f[R] for errors, etc.).
+See \f[B]-kernel-help\f[R] for more details.
+Can also be set on a per-plugin basis, with option
+-\f[I]<plugin>\f[R]-\f[B]log\f[R].
 .TP
-.B \-kernel\-msg\-key \f[I]k1,\&...,kn\f[]
+.B -kernel-msg-key \f[I]k1,\&...,kn\f[R]
 controls the emission of messages based on categories.
-Use \f[B]\-kernel\-msg\-key help\f[] to get a list of available
-categories, and \f[B]\-kernel\-msg\-key=\[lq]*\[rq]\f[] to control all
+Use \f[B]-kernel-msg-key help\f[R] to get a list of available
+categories, and \f[B]-kernel-msg-key=\[lq]*\[rq]\f[R] to control all
 categories.
-To disable a category, add a \f[B]\-\f[] before its name; to enable a
-category, simply add its name, with an optional \f[B]+\f[] before it.
-For instance, \f[B]\-kernel\-msg\-key=\-k1,k2\f[] will disable messages
-from category \f[B]k1\f[] and enable those from category \f[B]k2\f[].
-Can also be set on a per\-plugin basis, with option
-\-\f[I]<plugin>\f[]\-\f[B]msg\-key\f[].
+To disable a category, add a \f[B]-\f[R] before its name; to enable a
+category, simply add its name, with an optional \f[B]+\f[R] before it.
+For instance, \f[B]-kernel-msg-key=-k1,k2\f[R] will disable messages
+from category \f[B]k1\f[R] and enable those from category \f[B]k2\f[R].
+Can also be set on a per-plugin basis, with option
+-\f[I]<plugin>\f[R]-\f[B]msg-key\f[R].
 Note that each plugin has its own set of categories.
-.RS
-.RE
 .TP
-.B \-kernel\-warn\-key \f[I]k1=a1,\&...,kn=an\f[]
+.B -kernel-warn-key \f[I]k1=a1,\&...,kn=an\f[R]
 controls the emission of warnings based on categories: for each warning
-category \f[I]k\f[], associate action \f[I]a\f[].
-Use \f[B]\-kernel\-warn\-key help\f[] to get a list of available warning
+category \f[I]k\f[R], associate action \f[I]a\f[R].
+Use \f[B]-kernel-warn-key help\f[R] to get a list of available warning
 categories and their currently associated actions.
-The following actions can be set per category: \f[B]active\f[] (warn),
-\f[B]feedback\f[], \f[B]error\f[], \f[B]abort\f[], \f[B]once\f[],
-\f[B]feedback\-once\f[], \f[B]err\-once\f[].
-Omitting the action is equivalent to setting it to \f[B]active\f[].
-Warning categories can also be set on a per\-plugin basis, with option
-\-\f[I]<plugin>\f[]\f[B]\-warn\-key\f[].
-.RS
-.RE
-.TP
-.B [\-no]\-lib\-entry
+The following actions can be set per category: \f[B]active\f[R] (warn),
+\f[B]feedback\f[R], \f[B]error\f[R], \f[B]abort\f[R], \f[B]once\f[R],
+\f[B]feedback-once\f[R], \f[B]err-once\f[R].
+Omitting the action is equivalent to setting it to \f[B]active\f[R].
+Warning categories can also be set on a per-plugin basis, with option
+-\f[I]<plugin>\f[R]\f[B]-warn-key\f[R].
+.TP
+.B [-no]-lib-entry
 indicates that the entry point is called during program execution.
 This implies in particular that global variables cannot be assumed to
 have their initial values.
-The default is \f[B]\-no\-lib\-entry\f[]: the entry point is also the
+The default is \f[B]-no-lib-entry\f[R]: the entry point is also the
 starting point of the program and globals have their initial value.
-.RS
-.RE
 .TP
-.B \-load \f[I]file\f[]
-loads the (previously saved) state contained in \f[I]file\f[].
-.RS
-.RE
+.B -load \f[I]file\f[R]
+loads the (previously saved) state contained in \f[I]file\f[R].
 .TP
-.B \-load\-module \f[I]SPEC\f[]
-dynamically load OCaml plug\-ins, modules and scripts.
-Each \f[I]SPEC\f[] can be an OCaml source or object file, with or
+.B -load-module \f[I]SPEC\f[R]
+dynamically load OCaml plug-ins, modules and scripts.
+Each \f[I]SPEC\f[R] can be an OCaml source or object file, with or
 without extension, or a Findlib package.
 Loading order is preserved and additional dependencies can be listed in
-*\f[B].depend\f[] files.
-.RS
-.RE
+*\f[B].depend\f[R] files.
 .TP
-.B \-load\-script \f[I]SPEC\f[]
-alias for option \f[B]\-load\-module\f[].
-.RS
-.RE
+.B -load-script \f[I]SPEC\f[R]
+alias for option \f[B]-load-module\f[R].
 .TP
-.B \-machdep \f[I]machine\f[]
-uses \f[I]machine\f[] as the current machine\-dependent configuration
+.B -machdep \f[I]machine\f[R]
+uses \f[I]machine\f[R] as the current machine-dependent configuration
 (size of the various integer types, endiandness, \&...).
 The list of currently supported machines is available through option
-\f[I]\-machdep help\f[].
-Default is \f[B]x86_32\f[].
-.RS
-.RE
+\f[I]-machdep help\f[R].
+Default is \f[B]x86_32\f[R].
 .TP
-.B \-main \f[I]f\f[]
-sets \f[I]f\f[] as the entry point of the analysis.
-Defaults to \f[B]main\f[].
+.B -main \f[I]f\f[R]
+sets \f[I]f\f[R] as the entry point of the analysis.
+Defaults to \f[B]main\f[R].
 By default, it is considered as the starting point of the program under
 analysis.
-Use \f[B]\-lib\-entry\f[] if \f[I]f\f[] is supposed to be called in the
+Use \f[B]-lib-entry\f[R] if \f[I]f\f[R] is supposed to be called in the
 middle of an execution.
-.RS
-.RE
 .TP
-.B \-obfuscate
+.B -obfuscate
 prints an obfuscated version of the code (where original identifiers are
 replaced by meaningless ones) and exits.
 The correspondence table between original and new symbols is kept at the
 beginning of the result.
-.RS
-.RE
 .TP
-.B \-ocode \f[I]file\f[]
-redirects pretty\-printed code to \f[I]file\f[] instead of standard
+.B -ocode \f[I]file\f[R]
+redirects pretty-printed code to \f[I]file\f[R] instead of standard
 output.
-.RS
-.RE
 .TP
-.B [\-no]\-orig\-name
+.B [-no]-orig-name
 During the normalization phase, some variables may get renamed when
-different variables with the same name can co\-exist (e.g.\ a global
+different variables with the same name can co-exist (e.g.\ a global
 variable and a formal parameter).
 When this option is on, a message is printed each time this occurs.
 Defaults to no.
-.RS
-.RE
 .TP
-.B [\-no]\-pp\-annot
-pre\-processes annotations.
+.B [-no]-pp-annot
+pre-processes annotations.
 This is currently only possible when using gcc (or GNU cpp)
-pre\-processor.
-The default is to pre\-process annotations when the default
-pre\-processor is identified as GNU or GNU\-like.
-See also \f[B]\-cpp\-frama\-c\-compliant\f[].
-.RS
-.RE
+pre-processor.
+The default is to pre-process annotations when the default pre-processor
+is identified as GNU or GNU-like.
+See also \f[B]-cpp-frama-c-compliant\f[R].
 .TP
-.B [\-no]\-print
-pretty\-prints the source code as normalized by CIL.
+.B [-no]-print
+pretty-prints the source code as normalized by CIL.
 Defaults to no.
-.RS
-.RE
 .TP
-.B [\-no]\-print\-libc
-expands \f[B]#include\f[] directives in the pretty\-printed CIL code for
-files in the Frama\-C standard library.
+.B -print-cpp-commands
+outputs the preprocessing commands for all input files.
+.TP
+.B [-no]-print-libc
+expands \f[B]#include\f[R] directives in the pretty-printed CIL code for
+files in the Frama-C standard library.
 Defaults to no.
-.RS
-.RE
 .TP
-.B \-print\-libpath
-outputs the directory where the Frama\-C kernel library is installed.
-.RS
-.RE
+.B -print-libpath
+outputs the directory where the Frama-C kernel library is installed.
 .TP
-.B \-print\-path
-alias of \f[B]\-print\-share\-path\f[].
-.RS
-.RE
+.B -print-path
+alias of \f[B]-print-share-path\f[R].
 .TP
-.B \-print\-plugin\-path
-outputs the directory where Frama\-C searches its plugins (can be
-overridden by the \f[B]FRAMAC_PLUGIN\f[] variable and the
-\f[B]\-add\-path\f[] option).
-.RS
-.RE
+.B -print-plugin-path
+outputs the directory where Frama-C searches its plugins (can be
+overridden by the \f[B]FRAMAC_PLUGIN\f[R] variable and the
+\f[B]-add-path\f[R] option).
 .TP
-.B \-print\-share\-path
-outputs the directory where Frama\-C stores its data (can be overridden
-by the \f[B]FRAMAC_SHARE\f[] variable).
-.RS
-.RE
+.B -print-share-path
+outputs the directory where Frama-C stores its data (can be overridden
+by the \f[B]FRAMAC_SHARE\f[R] variable).
 .TP
-.B [\-no]\-remove\-exn
+.B [-no]-remove-exn
 transforms throw and try/catch statements into normal C functions.
 Defaults to no, unless the input source language has an exception
 mechanism.
-.RS
-.RE
 .TP
-.B \-remove\-inlined \f[I]f1,\&...,fn\f[]
-removes inlined functions \f[I]f1,\&...,fn\f[] from the AST, which must
-have been given to \f[B]\-inline\-calls\f[].
+.B -remove-inlined \f[I]f1,\&...,fn\f[R]
+removes inlined functions \f[I]f1,\&...,fn\f[R] from the AST, which must
+have been given to \f[B]-inline-calls\f[R].
 Note: this option does not check if the given functions were fully
 inlined.
-.RS
-.RE
 .TP
-.B \-remove\-projects \f[I]p1,\&...,pn\f[]
-removes the given projects \f[I]p1,\&...,pn\f[].
-\f[B]\@all_but_current\f[] removes all projects but the current one.
-.RS
-.RE
+.B -remove-projects \f[I]p1,\&...,pn\f[R]
+removes the given projects \f[I]p1,\&...,pn\f[R].
+\f[B]\[at]all_but_current\f[R] removes all projects but the current one.
 .TP
-.B \-remove\-unused\-specified\-functions
+.B -remove-unused-specified-functions
 keeps function prototypes that have an ACSL specification but are not
 used in the code.
 This is the default.
-Functions having the attribute \f[B]FRAMAC_BUILTIN\f[] are always kept.
-.RS
-.RE
+Functions having the attribute \f[B]FRAMAC_BUILTIN\f[R] are always kept.
 .TP
-.B \-remove\-unused\-types
+.B -remove-unused-types
 remove types and struct/union/enum declarations that are not referenced
 anywhere else in the code.
 This is the default.
-Use \f[B]\-keep\-unused\-types\f[] to keep these definitions.
-.RS
-.RE
+Use \f[B]-keep-unused-types\f[R] to keep these definitions.
 .TP
-.B \-safe\-arrays
+.B -safe-arrays
 for multidimensional arrays or arrays that are fields inside structs,
 assumes that all accesses must be in bound (set by default).
-The opposite option is \f[B]\-unsafe\-arrays\f[].
-.RS
-.RE
+The opposite option is \f[B]-unsafe-arrays\f[R].
 .TP
-.B \-save \f[I]file\f[]
-saves Frama\-C's state into \f[I]file\f[] after analyses have taken
+.B -save \f[I]file\f[R]
+saves Frama-C\[cq]s state into \f[I]file\f[R] after analyses have taken
 place.
-.RS
-.RE
 .TP
-.B \-session \f[I]s\f[]
-sets \f[I]s\f[] as the directory in which session files are searched.
-.RS
-.RE
+.B -session \f[I]s\f[R]
+sets \f[I]s\f[R] as the directory in which session files are searched.
 .TP
-.B [\-no]\-set\-project\-as\-default
+.B [-no]-set-project-as-default
 the current project becomes the default one (and so future
-\f[B]\-then\f[] sequences are applied on it).
+\f[B]-then\f[R] sequences are applied on it).
 Defaults to no.
-.RS
-.RE
 .TP
-.B [\-no]\-simplify\-cfg
-removes \f[B]break\f[], \f[B]continue\f[] and \f[B]switch\f[] statements
-before analyses.
+.B [-no]-simplify-cfg
+removes \f[B]break\f[R], \f[B]continue\f[R] and \f[B]switch\f[R]
+statements before analyses.
 Defaults to no.
-.RS
-.RE
 .TP
-.B [\-no]\-simplify\-trivial\-loops
-simplifies trivial loops such as \f[B]do \&... while (0)\f[] loops.
+.B [-no]-simplify-trivial-loops
+simplifies trivial loops such as \f[B]do \&... while (0)\f[R] loops.
 Defaults to yes.
-.RS
-.RE
 .TP
-.B \-then
-allows one to compose analyses: a first run of Frama\-C will occur with
-the options before \f[B]\-then\f[] and a second run will be done with
-the options after \f[B]\-then\f[] on the current project from the first
+.B -then
+allows one to compose analyses: a first run of Frama-C will occur with
+the options before \f[B]-then\f[R] and a second run will be done with
+the options after \f[B]-then\f[R] on the current project from the first
 run.
-.RS
-.RE
 .TP
-.B \-then\-last
-like \f[B]\-then\f[], but the second group of actions is executed on the
+.B -then-last
+like \f[B]-then\f[R], but the second group of actions is executed on the
 last project created by a program transformer.
-.RS
-.RE
 .TP
-.B \-then\-on \f[I]prj\f[]
-similar to \f[B]\-then\f[] except that the second run is performed in
-project \f[I]prj\f[].
-If no such project exists, Frama\-C exits with an error.
-.RS
-.RE
+.B -then-on \f[I]prj\f[R]
+similar to \f[B]-then\f[R] except that the second run is performed in
+project \f[I]prj\f[R].
+If no such project exists, Frama-C exits with an error.
 .TP
-.B \-then\-replace
-like \f[B]\-then\-last\f[], but also removes the previous current
+.B -then-replace
+like \f[B]-then-last\f[R], but also removes the previous current
 project.
-.RS
-.RE
 .TP
-.B \-time \f[I]file\f[]
-appends user time and date in the given file when Frama\-C exits.
-.RS
-.RE
+.B -time \f[I]file\f[R]
+appends user time and date in the given file when Frama-C exits.
 .TP
-.B \-typecheck
+.B -typecheck
 forces typechecking of the source files.
 This option is only relevant if no further analysis is requested (as
 typechecking will implicitly occur before the analysis is launched).
-.RS
-.RE
 .TP
-.B \-ulevel \f[I]n\f[]
-syntactically unroll loops \f[I]n\f[] times before the analysis.
+.B -ulevel \f[I]n\f[R]
+syntactically unroll loops \f[I]n\f[R] times before the analysis.
 This can be quite costly and some plugins (e.g.\ Eva) provide more
 efficient ways to perform the same thing.
 See their respective manuals for more information.
-This can also be activated on a per\-loop basis via the \f[B]loop pragma
-unroll \f[] directive.
-A negative value for \f[I]n\f[] will inhibit such pragmas.
-.RS
-.RE
+This can also be activated on a per-loop basis via the \f[B]loop pragma
+unroll \f[R] directive.
+A negative value for \f[I]n\f[R] will inhibit such pragmas.
 .TP
-.B [\-no]\-ulevel\-force
-ignores \f[B]UNROLL\f[] loop pragmas disabling unrolling.
-.RS
-.RE
+.B [-no]-ulevel-force
+ignores \f[B]UNROLL\f[R] loop pragmas disabling unrolling.
 .PP
-[\-no]\-unicode outputs ACSL formulas with UTF\-8 characters.
+[-no]-unicode outputs ACSL formulas with UTF-8 characters.
 This is the default.
-When given the \f[B]\-no\-unicode\f[] option, Frama\-C will use the
-ASCII version instead.
+When given the \f[B]-no-unicode\f[R] option, Frama-C will use the ASCII
+version instead.
 See the ACSL manual for the correspondence.
 .TP
-.B \-unsafe\-arrays
-see \f[B]\-safe\-arrays\f[].
-.RS
-.RE
+.B -unsafe-arrays
+see \f[B]-safe-arrays\f[R].
 .TP
-.B [\-no]\-unspecified\-access
+.B [-no]-unspecified-access
 checks that read/write accesses occurring in an unspecified order
-(according to the C standard's notion of sequence points) are performed
-on separate locations.
-With \f[B]\-no\-unspecified\-access\f[], assumes that it is always the
+(according to the C standard\[cq]s notion of sequence points) are
+performed on separate locations.
+With \f[B]-no-unspecified-access\f[R], assumes that it is always the
 case (this is the default).
-.RS
-.RE
 .TP
-.B \-version
-outputs the version string of Frama\-C.
-.RS
-.RE
+.B -version
+outputs the version string of Frama-C.
 .TP
-.B \-warn\-decimal\-float \f[I]freq\f[]
-warns when a floating\-point constant cannot be exactly represented
+.B -warn-decimal-float \f[I]freq\f[R]
+warns when a floating-point constant cannot be exactly represented
 (e.g.\ 0.1).
-\f[I]freq\f[] can be one of \f[B]none\f[], \f[B]once\f[], or
-\f[B]all\f[].
+\f[I]freq\f[R] can be one of \f[B]none\f[R], \f[B]once\f[R], or
+\f[B]all\f[R].
 .PD 0
 .P
 .PD
-\f[B]Deprecated\f[]: use \f[B]\-kernel\-warn\-key
-parser:decimal\-float=once\f[] (and variants) instead.
-.RS
-.RE
+\f[B]Deprecated\f[R]: use \f[B]-kernel-warn-key
+parser:decimal-float=once\f[R] (and variants) instead.
 .TP
-.B [\-no]\-warn\-invalid\-pointer
+.B [-no]-warn-invalid-pointer
 generate alarms for invalid pointer arithmetic.
 Defaults to no.
-.RS
-.RE
 .TP
-.B [\-no]\-warn\-left\-shift\-negative
+.B [-no]-warn-left-shift-negative
 generate alarms for signed left shifts on negative values.
 Defaults to yes.
-.RS
-.RE
 .TP
-.B [\-no]\-warn\-right\-shift\-negative
+.B [-no]-warn-right-shift-negative
 generate alarms for signed right shifts on negative values.
 Defaults to no.
-.RS
-.RE
 .TP
-.B [\-no]\-warn\-pointer\-downcast
+.B [-no]-warn-pointer-downcast
 generates alarms when the downcast of a pointer may exceed the
 destination range.
 Defaults to yes.
-.RS
-.RE
 .TP
-.B [\-no]\-warn\-signed\-downcast
+.B [-no]-warn-signed-downcast
 generates alarms when signed downcasts may exceed the destination range.
 Defaults to no.
-.RS
-.RE
 .TP
-.B [\-no]\-warn\-signed\-overflow
+.B [-no]-warn-signed-overflow
 generates alarms for signed operations that overflow.
 Defaults to yes.
-.RS
-.RE
 .TP
-.B [\-no]\-warn\-unsigned\-downcast
+.B [-no]-warn-unsigned-downcast
 generates alarms when unsigned downcasts may exceed the destination
 range.
 Defaults to no.
-.RS
-.RE
 .TP
-.B [\-no]\-warn\-unsigned\-overflow
+.B [-no]-warn-unsigned-overflow
 generates alarms for unsigned operations that overflow.
 Defaults to no.
-.RS
-.RE
 .TP
-.B [\-no]\-warn\-invalid\-bool
+.B [-no]-warn-invalid-bool
 generates alarms for reads of trap representations of _Bool lvalues.
 Defaults to yes.
-.RS
-.RE
-.SS Plugin\-specific options
+.SS Plugin-specific options
 .PP
 For each plugin, the command
 .RS
 .PP
-frama\-c \-plugin\-help
+frama-c -plugin-help
 .RE
 .PP
 will give the list of options that are specific to the plugin.
@@ -810,64 +629,45 @@ will give the list of options that are specific to the plugin.
 .TP
 .B 0
 Successful execution
-.RS
-.RE
 .TP
 .B 1
 Invalid user input
-.RS
-.RE
 .TP
 .B 2
 User interruption (kill or equivalent)
-.RS
-.RE
 .TP
 .B 3
 Unimplemented feature
-.RS
-.RE
 .TP
 .B 4 5 6
 Internal error
-.RS
-.RE
 .TP
 .B 125
 Unknown error
-.RS
-.RE
 .PP
 Exit statuses greater than 2 can be considered as a bug (or a feature
-request for the case of exit status 3) and may be reported on Frama\-C's
-BTS (see below).
+request for the case of exit status 3) and may be reported on
+Frama-C\[cq]s BTS (see below).
 .SH ENVIRONMENT VARIABLES
 .PP
-It is possible to control the places where Frama\-C looks for its files
+It is possible to control the places where Frama-C looks for its files
 through the following variables.
 .TP
 .B FRAMAC_LIB
-The directory where kernel's compiled interfaces are installed.
-.RS
-.RE
+The directory where kernel\[cq]s compiled interfaces are installed.
 .TP
 .B FRAMAC_PLUGIN
-The directory where Frama\-C can find standard plugins.
-If you wish to have plugins in several places, use \f[B]\-add\-path\f[]
+The directory where Frama-C can find standard plugins.
+If you wish to have plugins in several places, use \f[B]-add-path\f[R]
 instead.
-.RS
-.RE
 .TP
 .B FRAMAC_SHARE
-The directory where Frama\-C data (e.g.\ its version of the standard
+The directory where Frama-C data (e.g.\ its version of the standard
 library) is installed.
-.RS
-.RE
 .SH SEE ALSO
 .PP
-Frama\-C user manual:
-http://frama\-c.com/download/frama\-c\-user\-manual.pdf
+Frama-C user manual: http://frama-c.com/download/frama-c-user-manual.pdf
 .PP
-Frama\-C homepage: http://frama\-c.com
+Frama-C homepage: http://frama-c.com
 .PP
-Frama\-C BTS: http://bts.frama\-c.com
+Frama-C BTS: http://bts.frama-c.com
diff --git a/man/frama-c.1.header b/man/frama-c.1.header
index 2bc62cfc5176c9274f4dad74c7c7d4894dd84a7c..8d12fafa546d1e339543e2998e30ae71d8248f46 100644
--- a/man/frama-c.1.header
+++ b/man/frama-c.1.header
@@ -25,4 +25,4 @@
 .\" using pandoc 2.0 or newer. To modify this file, edit the Markdown file
 .\" and run `make man/frama-c.1`.
 
-.TH FRAMA-C 1 2020-05-26
+.TH FRAMA-C 1 2020-09-21
diff --git a/man/frama-c.1.md b/man/frama-c.1.md
index 396cf3138d6b15f78d2354d2b41a5767104c8bc8..30c76c5d3c59430a1b1abd0ea0661a02d708e008 100644
--- a/man/frama-c.1.md
+++ b/man/frama-c.1.md
@@ -97,6 +97,10 @@ with non-trivial control flow are never duplicated. Defaults to yes.
 : reads ACSL annotations. This is the default. Annotations are pre-processed
 by default. Use -no-pp-annot if you don't want to expand macros in annotations.
 
+-autocomplete *p1,...,pn*
+: lists the options of plugins *p1,...,pn* in a format suitable for
+autocompletion scripts.
+
 -big-ints-hex *max*
 : integers larger than *max* are displayed in hexadecimal
 (by default, all integers are displayed in decimal).
@@ -333,6 +337,9 @@ See also **-cpp-frama-c-compliant**.
 [-no]-print
 : pretty-prints the source code as normalized by CIL. Defaults to no.
 
+-print-cpp-commands
+: outputs the preprocessing commands for all input files.
+
 [-no]-print-libc
 : expands **#include** directives in the pretty-printed CIL code for files in
 the Frama-C standard library. Defaults to no.
diff --git a/nix/default.nix b/nix/default.nix
index 56f33e2a54f5a5005ba64f6c99790cce8d3cba02..c836d55ef87418ca9285d13792867b0181d1d49d 100644
--- a/nix/default.nix
+++ b/nix/default.nix
@@ -238,8 +238,8 @@ rec {
            chmod -R u+w -- "$sourceRoot/src/plugins/counter-examples"
            cp -r --preserve=mode "$genassigns_src" "$sourceRoot/src/plugins/genassigns"
            chmod -R u+w -- "$sourceRoot/src/plugins/genassigns"
-           cp -r --preserve=mode "$frama_clang_src" "$sourceRoot/src/plugins/frama-clang"
-           chmod -R u+w -- "$sourceRoot/src/plugins/frama-clang"
+           # cp -r --preserve=mode "$frama_clang_src" "$sourceRoot/src/plugins/frama-clang"
+           # chmod -R u+w -- "$sourceRoot/src/plugins/frama-clang"
            cp -r --preserve=mode "$pathcrawler_src" "$sourceRoot/src/plugins/pathcrawler"
            chmod -R u+w -- "$sourceRoot/src/plugins/pathcrawler"
            cp -r --preserve=mode "$mthread_src" "$sourceRoot/src/plugins/mthread"
diff --git a/nix/frama-ci.nix b/nix/frama-ci.nix
index ce0e87a5dff5d1d6eb098b7e2461311249bdaf3d..7939e05dd1161d65a13c6d4093cfff78d3f3fe81 100644
--- a/nix/frama-ci.nix
+++ b/nix/frama-ci.nix
@@ -5,7 +5,7 @@ let
     src = builtins.fetchGit {
             "url" = "https://bobot:${password}@git.frama-c.com/frama-c/Frama-CI.git";
             "name" = "Frama-CI";
-            "rev" = "36e99854d59cda2c97d0b52f1f098f6beb3baf04";
+            "rev" = "3e8a67b19d5923c651509070eec5db646b80ec32";
             "ref" = "master";
     };
  in
diff --git a/ptests/ptests.ml b/ptests/ptests.ml
index 9b953021d999526089a0765ef77b089f4241450c..4f92ad35a84c54f079fb6420b7bdf3e4677fa4dc 100644
--- a/ptests/ptests.ml
+++ b/ptests/ptests.ml
@@ -72,6 +72,19 @@ let str_string_match regex s n =
   let res = Str.string_match regex s n in
   Mutex.unlock str_mutex; res
 
+(* If regex1 matches inside s, adds suffix to the first occurrence of regex2.
+   If matched, returns (replaced string, true), otherwise returns (s, false).
+*)
+let str_string_match_and_replace regex1 regex2 ~suffix s =
+  Mutex.lock str_mutex;
+  let replaced_str, matched =
+    if Str.string_match regex1 s 0 then
+      Str.replace_first regex2 ("\\1" ^ suffix) s, true
+    else s, false
+  in
+  Mutex.unlock str_mutex;
+  (replaced_str, matched)
+
 let str_split regex s =
   Mutex.lock str_mutex;
   let res = Str.split regex s in
@@ -962,42 +975,48 @@ let get_macros cmd =
   in
   Macros.add_list macros cmd.macros
 
+let contains_frama_c_binary_name =
+  Str.regexp "[^( ]*\\(toplevel\\|viewer\\|frama-c-gui\\|frama-c[^-]\\).*"
+
+let frama_c_binary_name =
+  Str.regexp "\\([^ ]*\\(toplevel\\|viewer\\|frama-c-gui\\|frama-c\\)\\(\\.opt\\|\\.byte\\|\\.exe\\)?\\)"
+
 let basic_command_string =
-  let contains_toplevel_or_frama_c =
-    Str.regexp "[^( ]*\\(\\(toplevel\\)\\|\\(viewer\\)\\|\\(frama-c\\)\\).*"
-  in
   fun command ->
-    let macros = get_macros command in
-    let logfiles = List.map (Macros.expand macros) command.log_files in
-    command.log_files <- logfiles;
-    let has_ptest_file_t, toplevel =
-      Macros.does_expand macros command.toplevel
-    in
-    let has_ptest_file_o, options = Macros.does_expand macros command.options in
-    let toplevel = if !use_byte then opt_to_byte toplevel else toplevel in
-    let options =
-      if str_string_match contains_toplevel_or_frama_c command.toplevel 0
-      then begin
-        let opt_modules = Macros.expand macros
-            (Macros.get "PTEST_LOAD_MODULES" macros) in
-        let opt_pre = Macros.expand macros !additional_options_pre in
-        let opt_post = Macros.expand macros !additional_options in
-        let opt_plugin = String.concat " " (List.map (Printf.sprintf "-load-plugin %s") command.plugins) in
-        String.concat " " ["-check -no-autoload-plugins";opt_plugin;opt_modules;opt_pre;options;opt_post]
-      end else options
-    in
-    let options = if !use_byte then opt_to_byte_options options else options in
-    let raw_command =
-      if has_ptest_file_t || has_ptest_file_o || command.execnow then
-        toplevel ^ " " ^ options
-      else begin
-        let file = Filename.sanitize @@ get_ptest_file command in
-        toplevel ^ " " ^ file ^ " " ^ options
-      end
-    in
-
-    if command.timeout = "" then raw_command
-    else "ulimit -t " ^ command.timeout ^ " && " ^ raw_command
+  let macros = get_macros command in
+  let logfiles = List.map (Macros.expand macros) command.log_files in
+  command.log_files <- logfiles;
+  let has_ptest_file_t, toplevel =
+    Macros.does_expand macros command.toplevel
+  in
+  let has_ptest_file_o, options = Macros.does_expand macros command.options in
+  let toplevel = if !use_byte then opt_to_byte toplevel else toplevel in
+  let toplevel, contains_frama_c_binary =
+    str_string_match_and_replace contains_frama_c_binary_name
+      frama_c_binary_name ~suffix:" -check" toplevel
+  in
+  let options =
+    if contains_frama_c_binary
+    then begin
+      let opt_modules = Macros.expand macros
+          (Macros.get "PTEST_LOAD_MODULES" macros) in
+      let opt_pre = Macros.expand macros !additional_options_pre in
+      let opt_post = Macros.expand macros !additional_options in
+      let opt_plugin = String.concat " " (List.map (Printf.sprintf "-load-plugin %s") command.plugins) in
+      String.concat " " ["-no-autoload-plugins";opt_plugin;opt_modules;opt_pre;options;opt_post]
+    end else options
+  in
+  let options = if !use_byte then opt_to_byte_options options else options in
+  let raw_command =
+    if has_ptest_file_t || has_ptest_file_o || command.execnow then
+      toplevel ^ " " ^ options
+    else begin
+      let file = Filename.sanitize @@ get_ptest_file command in
+      toplevel ^ " " ^ file ^ " " ^ options
+    end
+  in
+  if command.timeout = "" then raw_command
+  else "ulimit -t " ^ command.timeout ^ " && " ^ raw_command
 
 (* Searches for executable [s] in the directories contained in the PATH
    environment variable. Returns [None] if not found, or
diff --git a/share/Makefile.config.in b/share/Makefile.config.in
index a8668095137a0a7f2c49eb515c620544dbdb64b1..6122bfa3f4c437dd88a727a972b114a9d3d64fbb 100644
--- a/share/Makefile.config.in
+++ b/share/Makefile.config.in
@@ -128,6 +128,9 @@ HAS_MPFR ?=@HAS_MPFR@
 # landmarks
 HAS_LANDMARKS	?=@HAS_LANDMARKS@
 
+# python 3.6
+HAS_PYTHON36 ?=@HAS_PYTHON36@
+
 ##########################
 # Miscellaneous commands #
 ##########################
@@ -157,8 +160,12 @@ HAVE_BUILTIN_VA_LIST ?=@HAVE_BUILTIN_VA_LIST@
 # Non-plugin test directories containing some ML files to compile
 TEST_DIRS_AS_PLUGIN:=\
   dynamic dynamic_plugin journal saveload spec misc syntax cil \
-  pretty_printing builtins libc value fc_script
-TEST_DIRS_AS_PLUGIN+=jcdb
+  pretty_printing builtins libc value
+
+ifeq ($(HAS_PYTHON36),yes)
+TEST_DIRS_AS_PLUGIN+= fc_script jcdb
+endif
+
 PLUGIN_TESTS_LIST+=$(TEST_DIRS_AS_PLUGIN)
 
 ##########################
diff --git a/share/_frama-c b/share/_frama-c
index 7cd8c0d84e737f1ad83f3943136f314621c39c25..7166a0a39da34072c13a76af50a71ed38b4cb48f 100644
--- a/share/_frama-c
+++ b/share/_frama-c
@@ -127,7 +127,7 @@ function _frama_c () {
         local autocomp
         # call frama-c with all the -load-module ; if it fails, test without the load-modules ;
         # if it fails again, abort
-        autocomp=$($the_args -autocomplete 2>/dev/null) || autocomp=$($my_words[1] -autocomplete 2>/dev/null) || unset autocomp
+        autocomp=$($the_args -autocomplete @all 2>/dev/null) || autocomp=$($my_words[1] -autocomplete @all 2>/dev/null) || unset autocomp
         (( $+autocomp )) && autocompletion=($(grep -o "\-[^ ]*" <<< $autocomp | sort))
         (( $#autocompletion )) || _message "$my_words[1] exists, but no option was detected"
         _store_cache frama-c_autocompletion autocompletion
diff --git a/share/analysis-scripts/analysis.mk b/share/analysis-scripts/analysis.mk
index e732240db26edd846b33d9d6d610b25454044b7b..068fe3b20cfa6afee747a2382882ac4b6a0a3a72 100644
--- a/share/analysis-scripts/analysis.mk
+++ b/share/analysis-scripts/analysis.mk
@@ -118,7 +118,7 @@ EVAFLAGS   ?= \
   -eva-print-callstacks -eva-warn-key alarm=inactive \
   -no-deps-print -no-calldeps-print \
   -eva-warn-key garbled-mix \
-  -memexec-all -calldeps -permissive -from-verbose 0 \
+  -calldeps -permissive -from-verbose 0 \
   $(if $(EVABUILTINS), -eva-builtin=$(call fc_list,$(EVABUILTINS)),) \
   $(if $(EVAUSESPECS), -eva-use-spec $(call fc_list,$(EVAUSESPECS)),)
 FCFLAGS    ?=
diff --git a/share/analysis-scripts/list_files.py b/share/analysis-scripts/list_files.py
index e573679929cfb1adedd5859ac42b2007389f835f..6845700360341beaa1b9acba44e293688859f133 100755
--- a/share/analysis-scripts/list_files.py
+++ b/share/analysis-scripts/list_files.py
@@ -31,58 +31,69 @@ import sys
 import os
 import json
 import re
+from pathlib import Path
+
+MIN_PYTHON = (3, 6) # for glob(recursive) and automatic Path conversions
+if sys.version_info < MIN_PYTHON:
+    sys.exit("Python %s.%s or later is required.\n" % MIN_PYTHON)
 
-arg = ""
 if len(sys.argv) < 2:
    # no argument, assume default name
-   arg = "compile_commands.json"
+   arg = Path("compile_commands.json")
 else:
-   arg = sys.argv[1]
+   arg = Path(sys.argv[1])
 
-if not os.path.exists(arg):
+if not arg.exists():
    print(f"error: file '{arg}' not found")
    sys.exit(f"usage: {sys.argv[0]} [compile_commands.json]")
 
 # check if arg has a known extension
-def has_known_c_extension(arg):
-   return arg.endswith(".c") or arg.endswith(".i") or arg.endswith(".h")
+def is_known_c_extension(ext):
+   return ext == ".c" or ext == ".i" or ext == ".h"
 
 pwd = os.getcwd()
+fcmake_pwd = pwd / Path(".frama-c") # pwd as seen by the Frama-C makefile
 json = json.loads(open(arg).read())
-jcdb_dir = os.path.dirname(arg)
+jcdb_dir = arg.parent
 includes = set()
 defines = set()
-files = set()
+files = set() # set of pairs of (file, file_for_fcmake)
 for entry in json:
    arg_includes = [] # before normalization
-   dir = entry["directory"]
-   file = entry["file"]
-   # json compile spec says either command or arguments are mandatory
-   if os.path.isabs(file):
+   if not "file" in entry:
+       # ignore entries without a filename
+       continue
+   file = Path(entry["file"])
+   dir = Path(entry["directory"]) if "directory" in entry else None
+   if file.is_absolute():
       filepath = file
-   elif os.path.isabs(dir):
-      filepath = os.path.join(dir, file)
+   elif dir and dir.is_absolute():
+      filepath = dir / file
+   elif dir:
+      filepath = jcdb_dir / dir / file
    else:
-      filepath = os.path.join(jcdb_dir, dir, file)
-   if not has_known_c_extension(filepath):
+      filepath = jcdb_dir / file
+   if not is_known_c_extension(filepath.suffix):
       print(f"warning: ignoring file of unknown type: {filepath}")
    else:
-      files.add(os.path.relpath(filepath, pwd))
+      files.add((os.path.relpath(filepath, pwd), os.path.relpath(filepath, fcmake_pwd)))
 
-print("SRCS=\\\n" + " \\\n".join(sorted(files)) + " \\")
+files_for_fcmake = map (lambda x:(x[1]), files)
+print("# Paths as seen by a makefile inside subdirectory '.frama-c':")
+print("SRCS=\\\n" + " \\\n".join(sorted(files_for_fcmake)) + " \\")
 print("")
 
 files_defining_main = set()
 re_main = re.compile("(int|void)\s+main\s*\([^)]*\)\s*\{")
-for file in files:
+for (file, file_for_fcmake) in files:
    assert os.path.exists(file), "file does not exist: %s" % file
    with open(file, 'r') as content_file:
       content = content_file.read()
       res = re.search(re_main, content)
       if res is not None:
-         files_defining_main.add(file)
+         files_defining_main.add(file_for_fcmake)
 
 if files_defining_main != []:
    print("")
-   print("# Possible definition of main function in the following file(s):")
+   print("# Possible definition of main function in the following file(s), as seen from '.frama-c':")
    print("\n".join(sorted(files_defining_main)))
diff --git a/share/analysis-scripts/make_template.py b/share/analysis-scripts/make_template.py
index 504043a6ebf62a733e1b9290293b866f0a15463a..6cbab8c30caf80289ff47531e00502af661bbbab 100755
--- a/share/analysis-scripts/make_template.py
+++ b/share/analysis-scripts/make_template.py
@@ -44,13 +44,13 @@ if len(sys.argv) > 2:
     print("       creates a Frama-C makefile in [dir] (default: .frama-c)")
     sys.exit(1)
 
-framac_in_path = True
-framac = shutil.which("frama-c")
-if not framac:
-    framac_in_path = False
-    if os.environ.get("FRAMAC"):
-        framac = os.environ["FRAMAC"]
-    else:
+framac_in_path = False
+if os.environ.get("FRAMAC"):
+    framac = os.environ["FRAMAC"]
+if not framac or not os.path.isfile(framac):
+    framac_in_path = True
+    framac = shutil.which("frama-c")
+    if not framac:
         sys.exit("error: frama-c must be in the PATH, "\
                  "or in environment variable FRAMAC")
 
diff --git a/share/analysis-scripts/normalize_jcdb.py b/share/analysis-scripts/normalize_jcdb.py
new file mode 100755
index 0000000000000000000000000000000000000000..c578730c143eba4b23f5b1c6d7e4575c58ca2965
--- /dev/null
+++ b/share/analysis-scripts/normalize_jcdb.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python3
+#-*- coding: utf-8 -*-
+##########################################################################
+#                                                                        #
+#  This file is part of Frama-C.                                         #
+#                                                                        #
+#  Copyright (C) 2007-2020                                               #
+#    CEA (Commissariat à l'énergie atomique et aux énergies              #
+#         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).            #
+#                                                                        #
+##########################################################################
+
+# This script removes absolute path references in a JSON Compilation Database.
+#
+# See: http://clang.llvm.org/docs/JSONCompilationDatabase.html
+
+import sys
+import os
+import json
+import re
+from pathlib import Path
+
+MIN_PYTHON = (3, 6) # for automatic Path conversions
+if sys.version_info < MIN_PYTHON:
+    sys.exit("Python %s.%s or later is required.\n" % MIN_PYTHON)
+
+if len(sys.argv) < 2:
+   # no argument, assume default name
+   arg = Path("compile_commands.json")
+else:
+   arg = Path(sys.argv[1])
+
+if not arg.exists():
+   print(f"error: file '{arg}' not found")
+   sys.exit(f"usage: {sys.argv[0]} [compile_commands.json]")
+
+jcdb_json = json.loads(open(arg).read())
+jcdb_dir = arg.parent
+out_json = {}
+
+nb_diffs = 0
+for entry in jcdb_json:
+   if "file" in entry and os.path.isabs(entry["file"]):
+      old_entry = entry["file"]
+      entry["file"] = os.path.relpath(entry["file"], jcdb_dir)
+      if old_entry != entry["file"]:
+         nb_diffs += 1
+      else:
+         print(f"warning: absolute path could not be normalized: {entry['file']}")
+   elif "directory" in entry and os.path.isabs(entry["directory"]):
+      old_entry = entry["directory"]
+      entry["directory"] = os.path.relpath(entry["directory"], jcdb_dir)
+      if old_entry != entry["directory"]:
+         nb_diffs += 1
+      else:
+         print(f"warning: absolute path could not be normalized: {entry['directory']}")
+
+if nb_diffs == 0:
+   print(f"No changes to be applied to {arg}")
+else:
+   yn = input(f"{nb_diffs} replacements to be applied. Normalize {arg}? [y/N] ")
+   if yn.lower() == "y":
+      with open(arg, 'w', encoding='utf-8') as outfile:
+         json.dump(jcdb_json, outfile, ensure_ascii=False, indent=4)
+         print(f"Normalization applied to {arg}")
+   else:
+      print("Exiting without overwriting.")
diff --git a/share/autocomplete_frama-c b/share/autocomplete_frama-c
index 423c17506bf553560fc19a589a1132391a277883..af9de4aaf1e6f6a3a036f14781bd810ada14fb23 100644
--- a/share/autocomplete_frama-c
+++ b/share/autocomplete_frama-c
@@ -127,11 +127,11 @@ _frama-c ()
   else
       case "$cur" in
 	  -*-*)
-	      sub_option="$(frama-c -autocomplete | grep -E -o " $cur[^*]+" |sort |uniq)";
+	      sub_option="$(frama-c -autocomplete @all | grep -E -o " $cur[^*]+" |sort |uniq)";
 	      COMPREPLY=( $( compgen -W "${sub_option}"  -- $cur ) );;
 
 	  -*)
-	      basic_options="$(frama-c -autocomplete | grep -E -o " \-[^-]+-?" |sort |uniq)"
+	      basic_options="$(frama-c -autocomplete @all | grep -E -o " \-[^-]+-?" |sort |uniq)"
   	      COMPREPLY=( $( compgen -W  "${basic_options}" -- $cur ) );;
 	  *)
 	      compopt -o default
diff --git a/share/libc/time.h b/share/libc/time.h
index b44aafbe4c1cddc1ab494816d33458e3a9c36f1c..0083859f5e05cee3802b772b3150f0015767f27e 100644
--- a/share/libc/time.h
+++ b/share/libc/time.h
@@ -111,6 +111,14 @@ extern time_t time(time_t *timer);
 char __fc_ctime[26];
 char * const  __fc_p_ctime = __fc_ctime;
 
+/*@
+  requires valid_timeptr: \valid_read(timeptr);
+  requires initialization:init_timeptr: \initialized(timeptr);
+  assigns __fc_ctime[0..25] \from indirect:*timeptr, indirect:__fc_time;
+  assigns \result \from indirect:*timeptr, indirect:__fc_time, __fc_p_ctime;
+  ensures result_points_to_ctime: \result == __fc_p_ctime;
+  ensures result_valid_string: valid_read_string(__fc_p_ctime);
+ */
 extern char *asctime(const struct tm *timeptr);
 
 /*@
diff --git a/src/kernel_internals/parsing/cparser.mly b/src/kernel_internals/parsing/cparser.mly
index a739cc905cee0858db22cd8ad9f2b52a947831d4..05ecc2d4e0835fdd37db0110b7b5cac240296be4 100644
--- a/src/kernel_internals/parsing/cparser.mly
+++ b/src/kernel_internals/parsing/cparser.mly
@@ -109,7 +109,7 @@ let check_funspec_abrupt_clauses fname spec =
 	(function
 	| (Cil_types.Normal | Cil_types.Exits),_ -> ()
 	| (Cil_types.Breaks | Cil_types.Continues | Cil_types.Returns),
-          {Logic_ptree.lexpr_loc = (loc,_)} ->
+          { Logic_ptree.tp_statement = { lexpr_loc = (loc,_)}} ->
           Errorloc.parse_error ~source:loc
             "Specification of function %s can only contain ensures or \
                  exits post-conditions" fname)
diff --git a/src/kernel_internals/parsing/logic_lexer.mll b/src/kernel_internals/parsing/logic_lexer.mll
index ca329de4aef0f70a65206da351f27f04d235e13c..b86e9200489ea822f2dfb2315a2d5134b2bfd3b3 100644
--- a/src/kernel_internals/parsing/logic_lexer.mll
+++ b/src/kernel_internals/parsing/logic_lexer.mll
@@ -297,6 +297,18 @@
 
   let accept_c_comments_into_acsl_spec = ref false
 
+  let hack_merge_tokens current next =
+    match (current,next) with
+    | CHECK, REQUIRES -> true, CHECK_REQUIRES
+    | CHECK, ENSURES -> true, CHECK_ENSURES
+    | CHECK, EXITS -> true, CHECK_EXITS
+    | CHECK, RETURNS -> true, CHECK_RETURNS
+    | CHECK, BREAKS -> true, CHECK_BREAKS
+    | CHECK, CONTINUES -> true, CHECK_CONTINUES
+    | CHECK, LOOP -> true, CHECK_LOOP
+    | CHECK, INVARIANT -> true, CHECK_INVARIANT
+    | CHECK, LEMMA -> true, CHECK_LEMMA
+    | _ -> false, current
 }
 
 let space = [' ' '\t' '\012' '\r' '@' ]
@@ -339,7 +351,15 @@ rule token = parse
       let loc = Lexing.(lexeme_start_p lexbuf, lexeme_end_p lexbuf) in
       let cabsloc = Cil_datatype.Location.of_lexing_loc loc in
       let s = lexeme lexbuf in
-      identifier s cabsloc
+      let curr_tok = identifier s cabsloc in
+      if curr_tok = CHECK then begin
+        let next_tok =
+          token { lexbuf with refill_buff = lexbuf.refill_buff }
+        in
+        let (eat_next, tok) = hack_merge_tokens curr_tok next_tok in
+        if eat_next then ignore (token lexbuf);
+        tok
+      end else curr_tok
     }
 
   | '0'['x''X'] rH+ rIS?    { CONSTANT (IntConstant (lexeme lexbuf)) }
diff --git a/src/kernel_internals/parsing/logic_parser.mly b/src/kernel_internals/parsing/logic_parser.mly
index cc86b0d9c1da06ba1beb012a70be1036e51dfff4..0bff4b69eda3bb3a77ca80cddbc3294ddbc2acfb 100644
--- a/src/kernel_internals/parsing/logic_parser.mly
+++ b/src/kernel_internals/parsing/logic_parser.mly
@@ -225,6 +225,7 @@
   let cv_const = Attr ("const", [])
   let cv_volatile = Attr ("volatile", [])
 
+  let toplevel_pred tp_only_check tp_statement = { tp_only_check; tp_statement }
 %}
 
 /*****************************************************************************/
@@ -250,6 +251,8 @@
 %token DOLLAR QUESTION MINUS PLUS STAR AMP SLASH PERCENT LSQUARE RSQUARE EOF
 %token GLOBAL INVARIANT VARIANT DECREASES FOR LABEL ASSERT CHECK SEMICOLON NULL EMPTY
 %token REQUIRES ENSURES ALLOCATES FREES ASSIGNS LOOP NOTHING SLICE IMPACT PRAGMA FROM
+%token CHECK_REQUIRES CHECK_LOOP CHECK_INVARIANT CHECK_LEMMA
+%token CHECK_ENSURES CHECK_EXITS CHECK_CONTINUES CHECK_BREAKS CHECK_RETURNS
 %token <string> EXT_CODE_ANNOT EXT_GLOBAL EXT_CONTRACT
 %token EXITS BREAKS CONTINUES RETURNS
 %token VOLATILE READS WRITES
@@ -1098,6 +1101,7 @@ contract:
 
 // use that to detect potentially missing ';' at end of clause
 clause_kw:
+| CHECK_REQUIRES { "check requires" }
 | REQUIRES { "requires" }
 | ASSUMES {"assumes"}
 | ASSIGNS { "assigns" }
@@ -1121,8 +1125,10 @@ requires:
 ;
 
 ne_requires:
-| REQUIRES full_lexpr SEMICOLON requires { $2::$4 }
-| REQUIRES full_lexpr clause_kw { missing 2 ";" $3}
+| REQUIRES full_lexpr SEMICOLON requires { toplevel_pred false $2::$4 }
+| CHECK_REQUIRES full_lexpr SEMICOLON requires { toplevel_pred true $2 :: $4 }
+| REQUIRES full_lexpr clause_kw { missing 2 ";" $3 }
+| CHECK_REQUIRES full_lexpr clause_kw { missing 2 ";" $3 }
 ;
 
 terminates:
@@ -1161,7 +1167,10 @@ allocation:
 
 ne_simple_clauses:
 | post_cond_kind full_lexpr SEMICOLON simple_clauses
-    { let allocation,assigns,post_cond,extended = $4 in allocation,assigns,(($1,$2)::post_cond),extended }
+    { let only_check, kind = $1 in
+      let allocation,assigns,post_cond,extended = $4 in
+      allocation,assigns,
+      ((kind,toplevel_pred only_check $2)::post_cond),extended }
 | allocation SEMICOLON simple_clauses
     { let allocation,assigns,post_cond,extended = $3 in
       let a = concat_allocation allocation $1 in
@@ -1180,14 +1189,23 @@ ne_simple_clauses:
 | post_cond_kind full_lexpr clause_kw { missing 2 ";" $3 }
 | allocation clause_kw { missing 1 ";" $2 }
 | ASSIGNS full_assigns clause_kw { missing 2 ";" $3 }
-| EXT_CONTRACT grammar_extension clause_kw { missing 1 ";" $3 }
+| EXT_CONTRACT ne_grammar_extension clause_kw { missing 1 ";" $3 }
 ;
 
-grammar_extension:
-/* Grammar Extensibility for plugins */
+ne_grammar_extension:
 | full_zones { $1 }
 ;
 
+/* possibly empty list of terms, for ACSL extensions registered by plugins. */
+grammar_extension:
+| enter_kw_c_mode extension_content exit_kw_c_mode { $2 }
+;
+
+extension_content:
+| /* epsilon */ { [] }
+| zones { $1 }
+;
+
 post_cond_kind:
 | post_cond { fst $1 }
 ;
@@ -1388,7 +1406,8 @@ loop_allocation:
 ;
 
 loop_invariant:
-| LOOP INVARIANT full_lexpr SEMICOLON { $3 }
+| LOOP INVARIANT full_lexpr SEMICOLON { toplevel_pred false $3 }
+| CHECK_LOOP INVARIANT full_lexpr SEMICOLON { toplevel_pred true $3 }
 ;
 
 loop_variant:
@@ -1439,6 +1458,7 @@ beg_pragma_or_code_annotation:
 | ASSERT {}
 | CHECK {}
 | INVARIANT {}
+| CHECK_INVARIANT {}
 | EXT_CODE_ANNOT {}
 ;
 
@@ -1450,10 +1470,13 @@ pragma_or_code_annotation:
 
 code_annotation:
 | ASSERT full_lexpr SEMICOLON
-      { fun bhvs -> AAssert (bhvs,Assert,$2) }
+  { fun bhvs -> AAssert (bhvs,toplevel_pred false $2) }
 | CHECK full_lexpr SEMICOLON
-      { fun bhvs -> AAssert (bhvs,Check,$2) }
-| INVARIANT full_lexpr SEMICOLON { fun bhvs -> AInvariant (bhvs,false,$2) }
+  { fun bhvs -> AAssert (bhvs,toplevel_pred true $2) }
+| INVARIANT full_lexpr SEMICOLON
+  { fun bhvs -> AInvariant (bhvs,false,toplevel_pred false $2) }
+| CHECK_INVARIANT full_lexpr SEMICOLON
+  { fun bhvs -> AInvariant (bhvs,false,toplevel_pred true $2) }
 | EXT_CODE_ANNOT grammar_extension SEMICOLON
   { fun bhvs ->
     let open Cil_types in
@@ -1601,7 +1624,11 @@ logic_def:
 | LEMMA poly_id COLON full_lexpr SEMICOLON
     { let (id,labels,tvars) = $2 in
       exit_type_variables_scope ();
-      LDlemma (id, false, labels, tvars, $4) }
+      LDlemma (id, false, labels, tvars, toplevel_pred false $4) }
+| CHECK_LEMMA poly_id COLON full_lexpr SEMICOLON
+    { let (id,labels,tvars) = $2 in
+      exit_type_variables_scope ();
+      LDlemma (id, false, labels, tvars, toplevel_pred true $4) }
 | AXIOMATIC any_identifier LBRACE logic_decls RBRACE
     { LDaxiomatic($2,$4) }
 | TYPE poly_id_type_add_typename EQUAL typedef SEMICOLON
@@ -1674,7 +1701,7 @@ logic_decl:
 | AXIOM poly_id COLON full_lexpr SEMICOLON
     { let (id,labels,tvars) = $2 in
       exit_type_variables_scope ();
-      LDlemma (id, true, labels, tvars, $4) }
+      LDlemma (id, true, labels, tvars, toplevel_pred false $4) }
 ;
 
 logic_decl_loc:
@@ -1836,11 +1863,16 @@ acsl_c_keyword:
 ;
 
 post_cond:
-| ENSURES { Normal, "ensures" }
-| EXITS   { Exits, "exits" }
-| BREAKS  { Breaks, "breaks" }
-| CONTINUES { Continues, "continues" }
-| RETURNS { Returns, "returns" }
+| ENSURES { (false,Normal), "ensures" }
+| EXITS   { (false,Exits), "exits" }
+| BREAKS  { (false,Breaks), "breaks" }
+| CONTINUES { (false,Continues), "continues" }
+| RETURNS { (false,Returns), "returns" }
+| CHECK_ENSURES { (true,Normal), "check ensures" }
+| CHECK_EXITS   { (true,Exits), "check exits" }
+| CHECK_BREAKS  { (true,Breaks), "check breaks" }
+| CHECK_CONTINUES { (true,Continues), "check continues" }
+| CHECK_RETURNS { (true,Returns), "check returns" }
 ;
 
 is_acsl_spec:
@@ -1851,6 +1883,7 @@ is_acsl_spec:
 | FREES      { "frees" }
 | BEHAVIOR   { "behavior" }
 | REQUIRES   { "requires" }
+| CHECK_REQUIRES { "check requires" }
 | TERMINATES { "terminates" }
 | COMPLETE   { "complete" }
 | DECREASES  { "decreases" }
diff --git a/src/kernel_internals/runtime/special_hooks.ml b/src/kernel_internals/runtime/special_hooks.ml
index b9eb84ac449d1c06a16c85880a3e3024493f5fb2..0c164a05fcf8e0b06fccdd98b5af39990ccdcf7b 100644
--- a/src/kernel_internals/runtime/special_hooks.ml
+++ b/src/kernel_internals/runtime/special_hooks.ml
@@ -163,6 +163,66 @@ let on_call_to_undeclared_function vi =
 let () =
   Cabs2cil.register_implicit_prototype_hook on_call_to_undeclared_function
 
+let run_list_all_plugin_options () =
+  if not (Kernel.AutocompleteHelp.is_empty ()) then begin
+    let filter = Kernel.AutocompleteHelp.get () in
+    Plugin.iter_on_plugins
+      (fun plugin ->
+         if Datatype.String.Set.mem plugin.p_shortname filter then begin
+           Format.printf "Plugin: %s@." plugin.Plugin.p_name;
+           let plugins_opts = Hashtbl.fold
+               (fun group_name group_options acc ->
+                  (* note: boolean options with negative counterparts
+                     generate 2 strings *)
+                  let strings_of_typed_parameter tp =
+                    let name = tp.Typed_parameter.name in
+                    (* special case due to the "cmdline hack" related to
+                       the "Input C files" option: if it does not start
+                       with '-', ignore it *)
+                    if String.get name 0 <> '-' then []
+                    else
+                      match tp.Typed_parameter.accessor with
+                      | Typed_parameter.Bool (_, opt_neg) ->
+                        begin
+                          match opt_neg with
+                          | None -> [(name, "bool")]
+                          | Some neg -> [(name, "bool"); (neg, "bool")]
+                        end
+                      | Int (_, frange) ->
+                        let (min, max) = frange () in
+                        if min = min_int && max = max_int then [(name, "int")]
+                        else [(name, Format.asprintf "int (%d, %d)" min max)]
+                      | String (_, fvalues) ->
+                        let values = fvalues () in
+                        if values = [] then [(name, "string")]
+                        else
+                          [(name, Format.asprintf "string (%a)"
+                              (Pretty_utils.pp_list ~sep:", "
+                                 Format.pp_print_string) values)]
+                  in
+                  let group_options =
+                    List.flatten
+                      (List.map strings_of_typed_parameter group_options)
+                  in
+                  (group_name, group_options) :: acc
+               ) plugin.Plugin.p_parameters []
+           in
+           let plugin_option_strings =
+             List.fold_left (fun acc (_gn, go) -> acc @ go) [] plugins_opts
+           in
+           let cmp_options (n1, _) (n2, _) = String.compare n1 n2 in
+           let sorted_options =
+             List.sort cmp_options plugin_option_strings
+           in
+           let pp_option fmt (n, a) = Format.fprintf fmt "  %s: %s@." n a in
+           Format.printf "%a" (Pretty_utils.pp_list ~sep:"" pp_option) sorted_options
+         end
+      );
+    raise Cmdline.Exit
+  end
+  else Cmdline.nop
+let () = Cmdline.run_after_exiting_stage run_list_all_plugin_options
+
 (*
 Local Variables:
 compile-command: "make -C ../../.."
diff --git a/src/kernel_internals/typing/cabs2cil.ml b/src/kernel_internals/typing/cabs2cil.ml
index d797b501c14997fe7e4e37b9ec7721a4be551aa3..01a5dcd2ee2cbb5e836c267859bb714e075d7043 100644
--- a/src/kernel_internals/typing/cabs2cil.ml
+++ b/src/kernel_internals/typing/cabs2cil.ml
@@ -288,7 +288,9 @@ let pop_stdheader () =
   | s::l ->
     Kernel.debug ~dkey:Kernel.dkey_typing_pragma "Popping %s %s" fc_stdlib s;
     current_stdheader := l
-  | [] -> Kernel.warning "#pragma %s pop does not match a push" fc_stdlib
+  | [] ->
+    Kernel.warning ~current:true
+      "#pragma %s pop does not match a push" fc_stdlib
 
 let push_stdheader s =
   Kernel.debug ~dkey:Kernel.dkey_typing_pragma "Pushing %s %s@." fc_stdlib s;
@@ -1057,7 +1059,7 @@ let newAlphaName
     with
     | Not_found -> () (* no clash of identifiers *)
     | Failure _ ->
-      Kernel.fatal
+      Kernel.fatal ~current:true
         "finding a fresh identifier in local scope with empty scopes stack"
   end;
   stripKind kind newname, oldloc
@@ -4242,7 +4244,7 @@ let append_chunk_to_annot ~ghost annot_chunk current_chunk =
       match res with
       | Some s -> annot_chunk @@ ({current_chunk with stmts = [s]}, ghost)
       | None ->
-        Kernel.warning ~wkey:Kernel.wkey_annot_error
+        Kernel.warning ~wkey:Kernel.wkey_annot_error ~current:true
           "Statement contract and ACSL pragmas over a local definition \
            are not implemented. Ignoring annotation";
         current_chunk
@@ -4345,7 +4347,7 @@ let fixFormalsType formals =
           try
             ChangeTo (Hashtbl.find table v.vname)
           with Not_found ->
-            Kernel.fatal "Formal %a not tied to a varinfo"
+            Kernel.fatal ~current:true "Formal %a not tied to a varinfo"
               Cil_printer.pp_varinfo v;
         end else SkipChildren
     end
@@ -4683,7 +4685,8 @@ let rec doSpecList ghost (suggestedAnonName: string)
             else if fitsInInt ILongLong i then ILongLong
             else IULongLong
           | "int" -> IInt
-          | s -> Kernel.fatal "Unknown enums representations '%s'" s
+          | s ->
+            Kernel.fatal ~current:true "Unknown enums representations '%s'" s
         end
       in
       (* as each name,value pair is determined, this is called *)
@@ -4753,7 +4756,7 @@ let rec doSpecList ghost (suggestedAnonName: string)
             else if unsigned then IUInt else IInt
           | "int" -> IInt
           | "gcc-short-enums" -> real_kind
-          | s -> Kernel.fatal "Unknown enum representation '%s'" s
+          | s -> Kernel.fatal ~current:true "Unknown enum representation '%s'" s
         in
         enum.ekind <- ekind;
       end;
@@ -5472,7 +5475,7 @@ and makeCompType ghost (isstruct: bool)
           if Cil_datatype.Compinfo.equal comp comp' then begin
             (* abort and not error, as this circularity could lead
                to infinite recursion... *)
-            Kernel.abort
+            Kernel.abort ~current:true
               "type %s %s is circular"
               (if comp.cstruct then "struct" else "union")
               comp.cname;
@@ -5740,7 +5743,7 @@ and doExp local_env
              of the same name, but in that case, it is not possible to
              take the address of the function (or do anything else than
              calling the function, which is matched later on). *)
-          Kernel.warning ~wkey:Kernel.wkey_cert_msc_38
+          Kernel.warning ~wkey:Kernel.wkey_cert_msc_38 ~current:true
             "%s is a standard macro. Its definition cannot be suppressed, \
              see CERT C coding rules MSC38-C" n
         end;
@@ -5995,7 +5998,8 @@ and doExp local_env
       let res =
         if Cil.isCompleteType typ then new_exp ~loc (SizeOf typ)
         else begin
-          Kernel.error ~once:true ~current:true "sizeof on incomplete type";
+          Kernel.error ~once:true ~current:true
+            "sizeof on incomplete type '%a'" Cil_printer.pp_typ typ;
           new_exp ~loc (Const (CStr ("booo sizeof(incomplete)")))
         end
       in
@@ -6441,7 +6445,7 @@ and doExp local_env
       let action local_env asconst e _what =
         match e.expr_node with
         | A.COMMA _ | A.QUESTION _ | A.PAREN _ ->
-          Kernel.fatal "normalization of lval in compound assignment failed"
+          Kernel.fatal ~current:true "normalization of lval in compound assignment failed"
         | A.VARIABLE _ | A.UNARY (A.MEMOF, _) | (* Regular lvalues *)
           A.INDEX _ | A.MEMBEROF _ | A.MEMBEROFPTR _ |
           A.CAST _ (* GCC extension *) -> begin
@@ -8485,7 +8489,7 @@ and createGlobal ghost logic_spec ((t,s,b,attr_list) : (typ * storage * bool * A
   Kernel.debug ~dkey:Kernel.dkey_typing_global "createGlobal: %s" n;
   (* If the global is a Frama-C builtin, set the generated flag *)
   if is_stdlib_macro n && get_current_stdheader () = "" then begin
-    Kernel.warning ~wkey:Kernel.wkey_cert_msc_38
+    Kernel.warning ~wkey:Kernel.wkey_cert_msc_38 ~current:true
       "Attempt to declare %s as external identifier outside of the stdlib. \
        It is supposed to be a macro name and cannot be declared. See CERT C \
        coding rule MSC38-C" n
@@ -8563,7 +8567,7 @@ and createGlobal ghost logic_spec ((t,s,b,attr_list) : (typ * storage * bool * A
           List.iter2
             (fun x y ->
                if x != y then
-                 Kernel.fatal
+                 Kernel.fatal ~current:true
                    "Function %s: formals are not shared between AST and \
                     FormalDecls table" vi.vname)
             l1 l2;
@@ -8889,9 +8893,14 @@ and createLocal ghost ((_, sto, _, _) as specs)
                 Logic_const.prel ~loc:castloc (Rle, talloca_size, max_bound)
               in
               let alloca_bounds = Logic_const.pand ~loc:castloc (pos_size, max_size) in
-              let alloca_bounds = { alloca_bounds with pred_name = ["alloca_bounds"] } in
+              let alloca_bounds =
+                { alloca_bounds with pred_name = ["alloca_bounds"] }
+              in
+              let alloca_bounds =
+                Logic_const.toplevel_predicate alloca_bounds
+              in
               let annot =
-                Logic_const.new_code_annotation (AAssert ([], Assert, alloca_bounds))
+                Logic_const.new_code_annotation (AAssert ([], alloca_bounds))
               in
               (mkStmtOneInstr ~ghost ~valid_sid
                  (Code_annot (annot, castloc)),
@@ -9413,9 +9422,10 @@ and doDecl local_env (isglobal: bool) : A.definition -> chunk = function
              [\assert \false]*)
           let pfalse = Logic_const.unamed ~loc Pfalse in
           let pfalse = { pfalse with pred_name = ["missing_return"] } in
+          let pfalse = Logic_const.toplevel_predicate pfalse in
           let assert_false () =
             let annot =
-              Logic_const.new_code_annotation (AAssert ([], Assert, pfalse))
+              Logic_const.new_code_annotation (AAssert ([], pfalse))
             in
             Cil.mkStmt ~ghost ~valid_sid (Instr(Code_annot(annot,loc)))
           in
diff --git a/src/kernel_internals/typing/cfg.ml b/src/kernel_internals/typing/cfg.ml
index 1ffc5c6b32b0e4bfa3fff39766b17671e172ba3d..3438e59ff51819ce28c437e4f00287ca463da39e 100644
--- a/src/kernel_internals/typing/cfg.ml
+++ b/src/kernel_internals/typing/cfg.ml
@@ -360,7 +360,8 @@ let xform_switch_block ?(keepSwitch=false) b =
   let () = Stack.push (Stack.create()) continues_stack in
   let assert_of_clause f ca =
     match ca.annot_content with
-    | AAssert _ | AInvariant _ | AVariant _ | AAssigns _ | AAllocation _ | APragma _ | AExtended _ -> Logic_const.ptrue
+    | AAssert _ | AInvariant _ | AVariant _
+    | AAssigns _ | AAllocation _ | APragma _ | AExtended _ -> Logic_const.ptrue
     | AStmtSpec (_bhv,s) ->
       let open Logic_const in
       List.fold_left
@@ -371,8 +372,8 @@ let xform_switch_block ?(keepSwitch=false) b =
                 (pands
                    (List.map
                       (fun p ->
-                         pold ~loc:p.ip_content.pred_loc
-                           (Logic_const.pred_of_id_pred p))
+                         let p = Logic_const.pred_of_id_pred p in
+                         pold ~loc:p.pred_loc p)
                       bhv.b_assumes),
                  pands
                    (List.fold_left
@@ -478,8 +479,9 @@ let xform_switch_block ?(keepSwitch=false) b =
              xform_switch_stmt
                rest break_dest cont_dest label_index 0
            | p ->
+             let p = Logic_const.toplevel_predicate p in
              let a =
-               Logic_const.new_code_annotation (AAssert ([], Assert, p))
+               Logic_const.new_code_annotation (AAssert ([], p))
              in
              let assertion = mkStmt (Instr(Code_annot(a,l))) in
              popn popstack;
@@ -501,9 +503,8 @@ let xform_switch_block ?(keepSwitch=false) b =
              xform_switch_stmt
                rest break_dest cont_dest label_index 0
            | p ->
-             let a =
-               Logic_const.new_code_annotation (AAssert ([], Assert, p))
-             in
+             let p = Logic_const.toplevel_predicate p in
+             let a = Logic_const.new_code_annotation (AAssert ([], p)) in
              let assertion = mkStmt (Instr(Code_annot(a,l))) in
              popn popstack;
              assertion :: s ::
diff --git a/src/kernel_internals/typing/oneret.ml b/src/kernel_internals/typing/oneret.ml
index f41401c9a7e8d91360f8f91a7498ff38f48feee4..164f5b48e7887784a264e4c55beaaaa74421f352 100644
--- a/src/kernel_internals/typing/oneret.ml
+++ b/src/kernel_internals/typing/oneret.ml
@@ -235,8 +235,8 @@ let oneret ?(callback: callback option) (f: fundec) : unit =
                   (pands
                      (List.map
                         (fun p ->
-                           pold ~loc:p.ip_content.pred_loc
-                             (Logic_const.pred_of_id_pred p))
+                           let p = Logic_const.pred_of_id_pred p in
+                           pold ~loc:p.pred_loc p)
                         bhv.b_assumes),
                    pands
                      (List.fold_left
@@ -381,7 +381,8 @@ let oneret ?(callback: callback option) (f: fundec) : unit =
           match !returns_assert with
           | { pred_content = Ptrue } -> [s; sg]
           | p ->
-            let a = Logic_const.new_code_annotation (AAssert ([],Assert,p)) in
+            let p = Logic_const.toplevel_predicate p in
+            let a = Logic_const.new_code_annotation (AAssert ([],p)) in
             let sta = mkStmt (Instr (Code_annot (a,loc))) in
             if callback<>None then
               ( let gclause = sta , a in
diff --git a/src/kernel_internals/typing/unroll_loops.ml b/src/kernel_internals/typing/unroll_loops.ml
index fc2af50b9c1c20573594c2f62d30c6b4575d36e6..e73b70a19d740f53d7b2e2c390297b7473f4d1fd 100644
--- a/src/kernel_internals/typing/unroll_loops.ml
+++ b/src/kernel_internals/typing/unroll_loops.ml
@@ -684,7 +684,7 @@ class do_it global_find_init ((force:bool),(times:int)) = object(self)
         | Some emitter ->
           let annot =
             Logic_const.new_code_annotation
-              (AInvariant ([],true,Logic_const.pfalse))
+              (AInvariant ([],true,Logic_const.(toplevel_predicate pfalse)))
           in
           Annotations.add_code_annot
 	    emitter ~kf:(Extlib.the self#current_kf) sloop annot;
diff --git a/src/kernel_services/abstract_interp/int_set.ml b/src/kernel_services/abstract_interp/int_set.ml
index 41de93a6ba8128241681d3355269f07652180c93..a337b628b848bdcb910ad4827411b6d5290ce3a3 100644
--- a/src/kernel_services/abstract_interp/int_set.ml
+++ b/src/kernel_services/abstract_interp/int_set.ml
@@ -318,7 +318,7 @@ let apply_bin_1_strict_decr f x (s : Integer.t array) =
   in
   c 0
 
-let apply2_n f (s1 : Integer.t array) (s2 : Integer.t array) =
+let apply2 f (s1 : Integer.t array) (s2 : Integer.t array) =
   let ps = ref empty_ps in
   let l1 = Array.length s1 in
   let l2 = Array.length s2 in
@@ -588,7 +588,7 @@ let add_singleton = apply_bin_1_strict_incr Int.add
 let add s1 s2 =
   match s1, s2 with
   | [| x |], s | s, [| x |] -> `Set (apply_bin_1_strict_incr Int.add x s)
-  | _, _ -> apply2_n Int.add s1 s2
+  | _, _ -> apply2 Int.add s1 s2
 
 let add_under s1 s2 =
   match s1, s2 with
@@ -619,7 +619,7 @@ let scale f s =
 let mul s1 s2 =
   match s1, s2 with
   | s, [| x |] | [| x |], s -> `Set (scale x s)
-  | _, _ -> apply2_n Int.mul s1 s2
+  | _, _ -> apply2 Int.mul s1 s2
 
 let scale_div ~pos f s =
   assert (not (Int.is_zero f));
diff --git a/src/kernel_services/abstract_interp/int_set.mli b/src/kernel_services/abstract_interp/int_set.mli
index 6b81748ffc17c85e24ec1350c4f765a0af7f1989..a55b2e745b59a1db88dda4958a02c6d84d6d5b1a 100644
--- a/src/kernel_services/abstract_interp/int_set.mli
+++ b/src/kernel_services/abstract_interp/int_set.mli
@@ -97,6 +97,9 @@ type set_or_top =
 
 type set_or_top_or_bottom = [ `Bottom | set_or_top ]
 
+(** [apply2 f s1 s2] applies [f i1 i2] for all integers i1 in s1 and i2 in s2. *)
+val apply2: (Integer.t -> Integer.t -> Integer.t) -> t -> t -> set_or_top
+
 (** {2 Lattice structure.} *)
 
 val is_included: t -> t -> bool
diff --git a/src/kernel_services/abstract_interp/int_val.ml b/src/kernel_services/abstract_interp/int_val.ml
index a98c8c40fee00a07cde4017134532cf00c085725..df1e9925d9db5c0e2f8cb9ea0486a9cc8bf71af4 100644
--- a/src/kernel_services/abstract_interp/int_val.ml
+++ b/src/kernel_services/abstract_interp/int_val.ml
@@ -660,6 +660,8 @@ end
 
 module type BitOperator =
 sig
+  (* Concrete version of the bitwise operator *)
+  val concrete_bitwise : Int.t -> Int.t -> Int.t
   (* Printable version of the operator *)
   val representation : string
   (* forward is given here as the lifted function of some bit operator op
@@ -682,6 +684,8 @@ end
 
 module And : BitOperator =
 struct
+  let concrete_bitwise = Int.logand
+
   let representation = "&"
 
   let forward v1 v2 =
@@ -701,6 +705,8 @@ end
 
 module Or : BitOperator =
 struct
+  let concrete_bitwise = Int.logor
+
   let representation = "|"
 
   let forward v1 v2 =
@@ -720,6 +726,8 @@ end
 
 module Xor : BitOperator =
 struct
+  let concrete_bitwise = Int.logxor
+
   let representation = "^"
 
   let forward v1 v2 =
@@ -893,7 +901,15 @@ struct
       acc := List.fold_left (set_bit (Bit i)) [] !acc;
       if List.length !acc > small_cardinal () then raise Do_not_fit_small_sets
     done;
-    let list = List.map (fun (r, _, _) -> r) !acc in
+    (* Keep only values that can actually be obtained *)
+    let is_admissible (r, v1, v2) =
+      match v1, v2 with
+      | Set s1, Set s2 ->
+        let op = Op.concrete_bitwise in
+        Int_set.(exists (fun i1 -> exists (fun i2 -> op i1 i2 = r) s2) s1)
+      | _, _ -> true
+    in
+    let list = Extlib.filter_map is_admissible (fun (r, _, _) -> r) !acc in
     Set (Int_set.inject_list list)
 
   (* If lower is true (resp. false), compute the lower (resp. upper) bound of
@@ -936,18 +952,22 @@ struct
     bound
 
   let bitwise_forward (v1 : t) (v2 : t) : t =
-    let r, modu = compute_modulo v1 v2 in
-    match result_size v1 v2 with
-    | None ->
-      (* We could do better here, as one of the bound may be finite. However,
-         this case should occur rarely or not at all. *)
-      inject_interval None None r modu
-    | Some size ->
-      try compute_small_set ~size v1 v2 r modu
-      with Do_not_fit_small_sets ->
-        let min = compute_bound ~size v1 v2 true
-        and max = compute_bound ~size v1 v2 false in
-        inject_interval (Some min) (Some max) r modu
+    match v1, v2 with
+    | Set s1, Set s2 ->
+      inject_set_or_top (Int_set.apply2 Op.concrete_bitwise s1 s2)
+    | _, _ ->
+      let r, modu = compute_modulo v1 v2 in
+      match result_size v1 v2 with
+      | None ->
+        (* We could do better here, as one of the bound may be finite. However,
+           this case should occur rarely or not at all. *)
+        inject_interval None None r modu
+      | Some size ->
+        try compute_small_set ~size v1 v2 r modu
+        with Do_not_fit_small_sets ->
+          let min = compute_bound ~size v1 v2 true
+          and max = compute_bound ~size v1 v2 false in
+          inject_interval (Some min) (Some max) r modu
 end
 
 let bitwise_or = let module M = BitwiseOperator (Or) in M.bitwise_forward
diff --git a/src/kernel_services/analysis/exn_flow.ml b/src/kernel_services/analysis/exn_flow.ml
index f31a727c80275794f9265fc86312e1fd673e7dbf..e6badcad629642c2838b939b21aab3b326d45b45 100644
--- a/src/kernel_services/analysis/exn_flow.ml
+++ b/src/kernel_services/analysis/exn_flow.ml
@@ -660,7 +660,7 @@ class erase_exn =
          we haven't seen an uncaught exception anyway. *)
       | Exits | Breaks | Continues -> orig
       | Returns | Normal ->
-        let loc = pred.ip_content.pred_loc in
+        let loc = (Logic_const.pred_of_id_pred pred).pred_loc in
         let p = self#pred_uncaught_flag loc false in
         let pred' = Logic_const.pred_of_id_pred pred in
         (kind,
diff --git a/src/kernel_services/analysis/interpreted_automata.ml b/src/kernel_services/analysis/interpreted_automata.ml
index ae1d5a4f3cff63f0f6562dde13fa0a9eec6c3b25..32a98309ead70a015f9269dbe4c382f2abc97e72 100644
--- a/src/kernel_services/analysis/interpreted_automata.ml
+++ b/src/kernel_services/analysis/interpreted_automata.ml
@@ -204,7 +204,7 @@ let variant_predicate stmt v =
   Logic_const.pand ~loc (pred1, pred2)
 
 let supported_annotation annot = match annot.annot_content with
-  | AAssert ([], _, _)
+  | AAssert ([], _)
   | AInvariant ([], _, _)
   | AVariant (_, None) -> true
   | _ -> false (* TODO *)
@@ -214,9 +214,9 @@ let code_annot = Annotations.code_annot ~filter:supported_annotation
 let make_annotation kf stmt annot labels =
   let kind, pred =
     match annot.annot_content with
-    | AAssert ([], Cil_types.Assert, pred) -> Assert, pred
-    | AAssert ([], Cil_types.Check, pred) -> Check, pred
-    | AInvariant ([], _, pred) -> Invariant, pred
+    | AAssert ([], {tp_only_check = false; tp_statement = pred}) -> Assert, pred
+    | AAssert ([], {tp_only_check = true; tp_statement = pred}) -> Check, pred
+    | AInvariant ([], _, pred) -> Invariant, pred.tp_statement
     | AVariant (v, None) -> Assert, variant_predicate stmt v
     | _ -> assert false
   in
@@ -552,7 +552,10 @@ let build_automaton ~annotations kf =
   let bind_labels (v1, edge, v2) =
     match edge.edge_transition with
     | Prop (annot, stmt) ->
-      let l = Cil.extract_labels_from_pred annot.predicate.ip_content in
+      let l =
+        Cil.extract_labels_from_pred
+          (Logic_const.pred_of_id_pred annot.predicate)
+      in
       let bind label map =
         try
           let vertex = match label with
diff --git a/src/kernel_services/analysis/logic_interp.ml b/src/kernel_services/analysis/logic_interp.ml
index ca8044ead8db1d5b6bb9cfb3459f5aca44692aa4..5235e6aec142f3c85c6363fc58002714829453ec 100644
--- a/src/kernel_services/analysis/logic_interp.ml
+++ b/src/kernel_services/analysis/logic_interp.ml
@@ -947,17 +947,17 @@ to function contracts."
         (* to preserve the effect of the statement *)
         pragmas :=
           { !pragmas with stmt = Stmt.Set.add ki !pragmas.stmt}
-      | AAssert (_behav,_,pred) ->
+      | AAssert (_behav,pred) ->
         (* to preserve the interpretation of the assertion *)
-        get_zone_from_pred ki pred;
+        get_zone_from_pred ki pred.tp_statement;
       | AInvariant (_behav,true,pred) -> (* loop invariant *)
         (* WARNING this is obsolete *)
         (* [JS 2010/09/02] TODO: so what is the right way to do? *)
         (* to preserve the interpretation of the loop invariant *)
-        get_zone_from_pred (Extlib.the loop_body_opt) pred;
+        get_zone_from_pred (Extlib.the loop_body_opt) pred.tp_statement;
       | AInvariant (_behav,false,pred) -> (* code invariant *)
         (* to preserve the interpretation of the code invariant *)
-        get_zone_from_pred ki pred;
+        get_zone_from_pred ki pred.tp_statement;
       | AVariant (term,_) ->
         (* to preserve the interpretation of the variant *)
         get_zone_from_term (Extlib.the loop_body_opt) term;
diff --git a/src/kernel_services/analysis/service_graph.ml b/src/kernel_services/analysis/service_graph.ml
index e145f6ea292097b53a688a59cd3c70956319a31b..40be8864a666e7e57a55f5629b00436af25efd98 100644
--- a/src/kernel_services/analysis/service_graph.ml
+++ b/src/kernel_services/analysis/service_graph.ml
@@ -125,10 +125,12 @@ struct
   let edge_invariant src dst = function
     | Inter_functions ->
       if not (Vertex.equal src.root dst.root || dst.is_root) then
-	Kernel.failure
+        Kernel.failure
           "Correctness bug when computing services.\n\
-PLEASE REPORT AS MAJOR BUG on http://bts.frama-c.com with the following info.\n\
-Src:%s in %s (is_root:%b) Dst:%s in %s (is_root:%b)"
+           PLEASE REPORT AS MAJOR BUG on \
+           https://git.frama-c.com/pub/frama-c/issues \
+           with the following info.\n\
+           Src:%s in %s (is_root:%b) Dst:%s in %s (is_root:%b)"
           (G.V.name src.node)
           (G.V.name src.root.node)
           src.is_root
@@ -137,10 +139,12 @@ Src:%s in %s (is_root:%b) Dst:%s in %s (is_root:%b)"
           dst.is_root
     | Inter_services | Both ->
       if not (src.is_root && dst.is_root) then
-	Kernel.failure
+        Kernel.failure
           "Correctness bug when computing services.\n\
-PLEASE REPORT AS MAJOR BUG on http://bts.frama-c.com with the following info.\n\
-Src root:%s in %s (is_root:%b) Dst:%s in %s (is_root:%b) [2d case]"
+           PLEASE REPORT AS MAJOR BUG on \
+           https://git.frama-c.com/pub/frama-c/issues \
+           with the following info.\n\
+           Src root:%s in %s (is_root:%b) Dst:%s in %s (is_root:%b) [2d case]"
           (G.V.name src.node)
           (G.V.name src.root.node)
           src.is_root
diff --git a/src/kernel_services/ast_data/alarms.ml b/src/kernel_services/ast_data/alarms.ml
index 5635f1b14691576d2a1c76134895676b7c3dc6c3..0785ae1209cce4dd3abdff0d0c71b3f6185c396f 100644
--- a/src/kernel_services/ast_data/alarms.ml
+++ b/src/kernel_services/ast_data/alarms.ml
@@ -705,7 +705,8 @@ let to_annot_aux kinstr ?(loc=Kinstr.loc kinstr) alarm =
   (*  Kernel.debug "registering alarm %a" D.pretty alarm;*)
   let add alarm =
     let pred = create_predicate ~loc alarm in
-    Logic_const.new_code_annotation (AAssert([], Assert, pred))
+    let pred = Logic_const.toplevel_predicate pred in
+    Logic_const.new_code_annotation (AAssert([], pred))
   in
   try
     let by_emitter = State.find kinstr in
diff --git a/src/kernel_services/ast_data/annotations.ml b/src/kernel_services/ast_data/annotations.ml
index 01dde03fd642e3351dd11f0ddb2a4888dde30020..67a7a15ad9aae7985ba9a3998bff363a34ee4562 100644
--- a/src/kernel_services/ast_data/annotations.ml
+++ b/src/kernel_services/ast_data/annotations.ml
@@ -739,13 +739,16 @@ let extend_name e pred =
   if Emitter.equal e Emitter.end_user || Emitter.equal e Emitter.kernel
   then pred
   else
-    let names = pred.pred_name in
+    let names = pred.tp_statement.pred_name in
     let s = Emitter.get_name e in
     if (List.mem s names) ||
        let acsl_identifier_regexp =
          Str.regexp "^\\([\\][_a-zA-Z]\\|[_a-zA-Z]\\)[0-9_a-zA-Z]*$"
        in not (Str.string_match acsl_identifier_regexp s 0)
-    then pred else { pred with pred_name = s :: names }
+    then pred
+    else
+      { pred with
+        tp_statement = { pred.tp_statement with pred_name = s :: names }}
 
 (** {3 Adding subparts of a function contract} *)
 
@@ -1147,8 +1150,8 @@ let add_code_annot ?(keep_empty=true) emitter ?kf stmt ca =
       Code_annots.add stmt tbl
   in
   match ca.annot_content with
-  | AAssert(l, kind, p) ->
-    let a = { ca with annot_content=AAssert(l,kind,extend_name emitter p) } in
+  | AAssert(l, p) ->
+    let a = { ca with annot_content=AAssert(l,extend_name emitter p) } in
     fill_tables a (Property.ip_of_code_annot kf stmt a)
   | AInvariant(l, b, p) ->
     let a={ca with annot_content=AInvariant(l,b,extend_name emitter p)} in
@@ -1283,11 +1286,13 @@ let add_code_annot ?(keep_empty=true) emitter ?kf stmt ca =
     fill_tables ca (Property.ip_of_code_annot kf stmt ca)
 
 let add_assert e ?kf stmt a =
-  let a = Logic_const.new_code_annotation (AAssert ([],Assert,a)) in
+  let a = Logic_const.toplevel_predicate ~only_check:false a in
+  let a = Logic_const.new_code_annotation (AAssert ([],a)) in
   add_code_annot e ?kf stmt a
 
 let add_check e ?kf stmt a =
-  let a = Logic_const.new_code_annotation (AAssert ([],Check,a)) in
+  let a = Logic_const.toplevel_predicate ~only_check:true a in
+  let a = Logic_const.new_code_annotation (AAssert ([],a)) in
   add_code_annot e ?kf stmt a
 
 (** {3 Adding globals} *)
diff --git a/src/kernel_services/ast_data/cil_types.ml b/src/kernel_services/ast_data/cil_types.ml
index 386affd6ea5a7f05d26205a6500e33fda3bfe00d..48697d89dc5e74e9dd3ad936c88e7d7fec533d60 100644
--- a/src/kernel_services/ast_data/cil_types.ml
+++ b/src/kernel_services/ast_data/cil_types.ml
@@ -1590,7 +1590,17 @@ and predicate_node =
     create fresh predicates *)
 and identified_predicate = {
   ip_id: int; (** identifier *)
-  ip_content: predicate; (** the predicate itself*)
+  ip_content: toplevel_predicate; (** the predicate itself*)
+}
+
+(** main statement of an annotation. *)
+and toplevel_predicate = {
+  tp_only_check: bool;
+  (** whether the annotation is only used to check that [ip_content] holds, but
+      stays invisible for other verification tasks (see description of ACSL's
+      check keyword).
+  *)
+  tp_statement: predicate;
 }
 
 (** predicates with a location and an optional list of names *)
@@ -1745,17 +1755,11 @@ and pragma =
   | Slice_pragma of slice_pragma
   | Impact_pragma of impact_pragma
 
-(** Kind of an assertion:
-    - an assert is both evaluated and used as hypothesis afterwards;
-    - a check is only evaluated, but is not used as an hypothesis: it does not
-      affect the analyses. *)
-and assertion_kind = Assert | Check
-
 (** all annotations that can be found in the code.
     This type shares the name of its constructors with
     {!Logic_ptree.code_annot}. *)
 and code_annotation_node =
-  | AAssert of string list * assertion_kind * predicate
+  | AAssert of string list * toplevel_predicate
   (** assertion to be checked. The list of strings is the list of
       behaviors to which this assertion applies. *)
 
@@ -1763,7 +1767,7 @@ and code_annotation_node =
   (** statement contract
       (potentially restricted to some enclosing behaviors). *)
 
-  | AInvariant of string list * bool * predicate
+  | AInvariant of string list * bool * toplevel_predicate
   (** loop/code invariant. The list of strings is the list of behaviors to which
       this invariant applies.  The boolean flag is true for normal loop
       invariants and false for invariant-as-assertions. *)
@@ -1814,7 +1818,7 @@ and global_annotation =
   | Dtype of logic_type_info * location (** declaration of a logic type. *)
   | Dlemma of
       string * bool * logic_label list * string list *
-      predicate * attributes * location
+      toplevel_predicate * attributes * location
   (** definition of a lemma. The boolean flag is [true] if the property should
       be taken as an axiom and [false] if it must be proved.  *)
   | Dinvariant of logic_info * location
diff --git a/src/kernel_services/ast_data/property.ml b/src/kernel_services/ast_data/property.ml
index 7edb1e01b553e34a9c6e32619d61abfcd8ea779d..76dbce8cdaf50f200c46911f10bbcd187f9c26f9 100644
--- a/src/kernel_services/ast_data/property.ml
+++ b/src/kernel_services/ast_data/property.ml
@@ -76,7 +76,7 @@ type identified_complete = {
   ic_kf : kernel_function;
   ic_kinstr : kinstr;
   ic_active : Datatype.String.Set.t;
-  ic_bhvs : string list
+  ic_bhvs : Datatype.String.Set.t
 }
 
 type identified_disjoint = identified_complete
@@ -126,7 +126,7 @@ and identified_lemma = {
   il_name : string;
   il_labels : logic_label list;
   il_args : string list;
-  il_pred : predicate;
+  il_pred : toplevel_predicate;
   il_loc : location
 }
 
@@ -272,7 +272,7 @@ let get_kf = function
   | IPTypeInvariant _ | IPGlobalInvariant _ -> None
 
 let rec get_names = function
-  | IPPredicate ip -> ip.ip_pred.ip_content.pred_name
+  | IPPredicate ip -> (Logic_const.pred_of_id_pred ip.ip_pred).pred_name
   | IPExtended { ie_ext = {ext_name = name} }
   | IPAxiom { il_name = name }
   | IPAxiomatic { iax_name = name }
@@ -285,8 +285,8 @@ let rec get_names = function
   | IPCodeAnnot annot ->
     begin
       match annot.ica_ca.annot_content with
-      | AAssert (_, _, pred)
-      | AInvariant (_, _, pred) -> pred.pred_name
+      | AAssert (_, pred)
+      | AInvariant (_, _, pred) -> pred.tp_statement.pred_name
       | _ -> []
     end
   | IPComplete _ | IPDisjoint _ | IPAllocation _
@@ -302,7 +302,7 @@ let loc_of_loc_o = function
   | OLGlob loc -> loc
 
 let rec location = function
-  | IPPredicate {ip_pred} -> ip_pred.ip_content.pred_loc
+  | IPPredicate {ip_pred} -> (Logic_const.pred_of_id_pred ip_pred).pred_loc
   | IPBehavior {ib_kf=kf; ib_kinstr=ki}
   | IPComplete {ic_kf=kf; ic_kinstr=ki}
   | IPDisjoint {ic_kf=kf; ic_kinstr=ki}
@@ -418,8 +418,13 @@ include Datatype.Make_with_collections
 
       type t = identified_property
       let name = "Property.t"
-      let reprs = [IPAxiom {il_name="";il_labels=[];il_args=[];
-                            il_pred=Logic_const.ptrue;il_loc=Location.unknown}]
+      let reprs = [
+        IPAxiom {
+          il_name="";il_labels=[];il_args=[];
+          il_pred=Logic_const.(toplevel_predicate ptrue);
+          il_loc=Location.unknown
+        }]
+
       let mem_project = Datatype.never_any_project
 
       let pp_active fmt active =
@@ -456,14 +461,16 @@ include Datatype.Make_with_collections
         | IPCodeAnnot {ica_ca} -> Cil_printer.pp_code_annotation fmt ica_ca
         | IPComplete {ic_active; ic_bhvs} ->
           Format.fprintf fmt "complete@ %a"
-            (Pretty_utils.pp_list ~sep:","
-               (fun fmt s ->  Format.fprintf fmt "@ %s" s))
+            (Pretty_utils.pp_iter ~sep:","
+               Datatype.String.Set.iter
+               (fun fmt s -> Format.fprintf fmt "@ %s" s))
             ic_bhvs;
           pp_active fmt ic_active
         | IPDisjoint {ic_active; ic_bhvs} ->
           Format.fprintf fmt "disjoint@ %a"
-            (Pretty_utils.pp_list ~sep:","
-               (fun fmt s ->  Format.fprintf fmt "@ %s" s))
+            (Pretty_utils.pp_iter ~sep:","
+               Datatype.String.Set.iter
+               (fun fmt s -> Format.fprintf fmt "@ %s" s))
             ic_bhvs;
           pp_active fmt ic_active
         | IPAllocation {ial_allocs=(f,a)} ->
@@ -506,11 +513,11 @@ include Datatype.Make_with_collections
           (* complete list is more likely to discriminate than active list. *)
           Hashtbl.hash
             (6, Kf.hash f, Kinstr.hash ki,
-             (y:string list), (x:Datatype.String.Set.t))
+             Datatype.String.Set.hash y, Datatype.String.Set.hash x)
         | IPDisjoint {ic_kf=f; ic_kinstr=ki; ic_bhvs=y; ic_active=x} ->
           Hashtbl.hash
             (7, Kf.hash f, Kinstr.hash ki,
-             (y: string list), (x:Datatype.String.Set.t))
+             Datatype.String.Set.hash y, Datatype.String.Set.hash x)
         | IPAssigns {ias_kf=f; ias_kinstr=ki; ias_bhv=b} ->
           Hashtbl.hash (8, Kf.hash f, Kinstr.hash ki, hash_bhv_loop b)
         | IPFrom {if_kf=kf; if_kinstr=ki; if_bhv=b; if_from=(t, _)} ->
@@ -567,7 +574,7 @@ include Datatype.Make_with_collections
           IPComplete {ic_kf=f2;ic_kinstr=ki2;ic_active=a2;ic_bhvs=x2}
         | IPDisjoint {ic_kf=f1;ic_kinstr=ki1;ic_active=a1;ic_bhvs=x1},
           IPDisjoint {ic_kf=f2;ic_kinstr=ki2;ic_active=a2;ic_bhvs=x2} ->
-          Kf.equal f1 f2 && Kinstr.equal ki1 ki2 && a1 = a2 && x1 = x2
+          Kf.equal f1 f2 && Kinstr.equal ki1 ki2 && a1 = a2 && Datatype.String.Set.equal x1 x2
         | IPAllocation {ial_kf=f1;ial_kinstr=ki1;ial_bhv=b1},
           IPAllocation {ial_kf=f2;ial_kinstr=ki2;ial_bhv=b2}
         | IPAssigns {ias_kf=f1;ias_kinstr=ki1;ias_bhv=b1},
@@ -636,7 +643,7 @@ include Datatype.Make_with_collections
           if n = 0 then
             let n = Kinstr.compare ki1 ki2 in
             if n = 0 then
-              let n = Extlib.compare_basic x1 x2 in
+              let n = Datatype.String.Set.compare x1 x2 in
               if n = 0 then
                 Datatype.String.Set.compare a1 a2
               else n
@@ -709,9 +716,10 @@ include Datatype.Make_with_collections
     end)
 
 let rec short_pretty fmt p = match p with
-  | IPPredicate {ip_pred={ip_content={pred_name=name::_}}} ->
-    Format.pp_print_string fmt name
-  | IPPredicate _ -> pretty fmt p
+  | IPPredicate {ip_pred} ->
+    (match (Logic_const.pred_of_id_pred ip_pred).pred_name with
+     | name :: _ -> Format.pp_print_string fmt name
+     | [] -> pretty fmt p)
   | IPExtended {ie_ext={ext_name}} -> Format.pp_print_string fmt ext_name
   | IPAxiom {il_name=n} | IPLemma {il_name=n}
   | IPTypeInvariant {iti_name=n} | IPGlobalInvariant {igi_name=n}
@@ -725,9 +733,11 @@ let rec short_pretty fmt p = match p with
   | IPDisjoint {ic_kf} ->
     Format.fprintf fmt "disjoint clause in function %a"
       Kernel_function.pretty ic_kf
-  | IPCodeAnnot {ica_ca={annot_content=AAssert (_, _, {pred_name=name::_})}}
-  | IPCodeAnnot {ica_ca={annot_content=AInvariant (_, _, {pred_name=name::_})}} ->
-    Format.pp_print_string fmt name
+  | IPCodeAnnot {ica_ca={annot_content=AAssert (_, {tp_statement})}}
+  | IPCodeAnnot {ica_ca={annot_content=AInvariant (_, _, {tp_statement})}} ->
+    (match tp_statement.pred_name with
+     | name :: _ -> Format.pp_print_string fmt name
+     | [] -> pretty fmt p)
   | IPCodeAnnot _ -> pretty fmt p
   | IPAllocation {ial_kf} ->
     Format.fprintf fmt "allocates/frees clause in function %a"
@@ -816,13 +826,13 @@ let rec pretty_debug fmt = function
       Cil_types_debug.pp_kernel_function ic_kf
       Cil_types_debug.pp_kinstr ic_kinstr
       Datatype.String.Set.pretty ic_active
-      (Cil_types_debug.pp_list Cil_types_debug.pp_string) ic_bhvs
+      Datatype.String.Set.pretty ic_bhvs
   | IPDisjoint {ic_kf; ic_kinstr; ic_active; ic_bhvs} ->
     Format.fprintf fmt "IPDisjoint(%a,%a,%a,%a)"
       Cil_types_debug.pp_kernel_function ic_kf
       Cil_types_debug.pp_kinstr ic_kinstr
       Datatype.String.Set.pretty ic_active
-      (Cil_types_debug.pp_list Cil_types_debug.pp_string) ic_bhvs
+      Datatype.String.Set.pretty ic_bhvs
   | IPDecrease {id_kf; id_kinstr; id_ca; id_variant} ->
     Format.fprintf fmt "IPDecrease(%a,%a,%a,%a)"
       Cil_types_debug.pp_kernel_function id_kf
@@ -834,7 +844,7 @@ let rec pretty_debug fmt = function
       Cil_types_debug.pp_string il_name
       (Cil_types_debug.pp_list Cil_types_debug.pp_logic_label) il_labels
       (Cil_types_debug.pp_list Cil_types_debug.pp_string) il_args
-      Cil_types_debug.pp_predicate il_pred
+      Cil_types_debug.pp_toplevel_predicate il_pred
       Cil_types_debug.pp_location il_loc
   | IPAxiomatic {iax_name; iax_props} ->
     Format.fprintf fmt "IPAxiomatic(%a,%a)"
@@ -845,7 +855,7 @@ let rec pretty_debug fmt = function
       Cil_types_debug.pp_string il_name
       (Cil_types_debug.pp_list Cil_types_debug.pp_logic_label) il_labels
       (Cil_types_debug.pp_list Cil_types_debug.pp_string) il_args
-      Cil_types_debug.pp_predicate il_pred
+      Cil_types_debug.pp_toplevel_predicate il_pred
       Cil_types_debug.pp_location il_loc
   | IPTypeInvariant {iti_name; iti_type; iti_pred; iti_loc} ->
     Format.fprintf fmt "IPTypeInvariant(%a,%a,%a,%a)"
@@ -940,7 +950,8 @@ struct
 
   let pp_code_annot_names fmt ca =
     match ca.annot_content with
-    | AAssert(for_bhv,_,named_pred) | AInvariant(for_bhv,_,named_pred) ->
+    | AAssert(for_bhv,pred) | AInvariant(for_bhv,_,pred) ->
+      let named_pred = pred.tp_statement in
       let pp_for_bhv fmt l =
         match l with
         | [] -> ()
@@ -997,13 +1008,13 @@ struct
     | IPPredicate {ip_kind=pk;ip_kf=kf;ip_kinstr=ki;ip_pred=idp} ->
       Format.asprintf "%s%s%a"
         (kf_prefix kf) (predicate_kind_txt pk ki)
-        pp_names idp.ip_content.pred_name
+        pp_names (Logic_const.pred_of_id_pred idp).pred_name
     | IPExtended {ie_ext={ext_name};ie_loc=le} ->
       Format.asprintf  "%sextended%a" (extended_loc_prefix le) pp_names [ext_name]
     | IPCodeAnnot {ica_kf=kf; ica_ca=ca} ->
       let name = match ca.annot_content with
-        | AAssert (_, Assert, _) -> "assert"
-        | AAssert (_, Check, _) -> "check"
+        | AAssert (_, {tp_only_check = false }) -> "assert"
+        | AAssert (_, {tp_only_check = true }) -> "check"
         | AInvariant (_,true,_) -> "loop_inv"
         | AInvariant _ -> "inv"
         | APragma _ -> "pragma"
@@ -1014,9 +1025,11 @@ struct
         | AExtended(_,_,{ext_name}) -> ext_name
       in Format.asprintf "%s%s%a" (kf_prefix kf) name pp_code_annot_names ca
     | IPComplete {ic_kf=kf; ic_kinstr=ki; ic_active=a; ic_bhvs=lb} ->
+      let lb = Datatype.String.Set.elements lb in
       Format.asprintf  "%s%s%acomplete%a"
         (kf_prefix kf) (ki_prefix ki) active_prefix a pp_names lb
     | IPDisjoint {ic_kf=kf; ic_kinstr=ki; ic_active=a; ic_bhvs=lb} ->
+      let lb = Datatype.String.Set.elements lb in
       Format.asprintf  "%s%s%adisjoint%a"
         (kf_prefix kf) (ki_prefix ki) active_prefix a pp_names lb
     | IPDecrease {id_kf=kf; id_ca=None; id_variant=variant} ->
@@ -1024,10 +1037,10 @@ struct
     | IPDecrease {id_kf=kf; id_variant=variant} ->
       (kf_prefix kf) ^ "loop_term" ^ (variant_suffix variant)
     | IPAxiom {il_name=name; il_pred} ->
-      Format.asprintf "axiom_%s%a" name pp_names il_pred.pred_name
+      Format.asprintf "axiom_%s%a" name pp_names il_pred.tp_statement.pred_name
     | IPAxiomatic {iax_name} -> "axiomatic_" ^ iax_name
     | IPLemma {il_name=name; il_pred} ->
-      Format.asprintf "lemma_%s%a" name pp_names il_pred.pred_name
+      Format.asprintf "lemma_%s%a" name pp_names il_pred.tp_statement.pred_name
     | IPTypeInvariant {iti_name; iti_pred} ->
       Format.asprintf "type_invariant_%s%a"
         iti_name pp_names iti_pred.pred_name
@@ -1127,7 +1140,7 @@ struct
     | K kf -> Sanitizer.add_string buffer (Kernel_function.get_name kf)
     | A msg -> Sanitizer.add_string buffer msg
     | S stmt -> Sanitizer.add_string buffer (Printf.sprintf "s%d" stmt.sid)
-    | I { ip_content = { pred_name = a } }
+    | I { ip_content = { tp_statement = { pred_name = a } } }
     | P { pred_name = a } | T { term_name = a } -> Sanitizer.add_list buffer a
 
   let rec add_parts buffer = function
@@ -1146,17 +1159,35 @@ struct
     | IPPredicate {ip_kind=PKAssumes bhv; ip_kf=kf; ip_pred=ip} ->
       [ K kf ; B bhv ; A "assumes" ; I ip ]
     | IPPredicate {ip_kind=PKRequires bhv; ip_kf=kf; ip_pred=ip} ->
-      [ K kf ; B bhv ; A "requires" ; I ip ]
+      let a =
+        if ip.ip_content.tp_only_check then "check_requires" else "requires"
+      in
+      [ K kf ; B bhv ; A a ; I ip ]
     | IPPredicate {ip_kind=PKEnsures (bhv, Normal); ip_kf=kf; ip_pred=ip} ->
-      [ K kf ; B bhv ; A "ensures" ; I ip ]
+      let a =
+        if ip.ip_content.tp_only_check then "check_ensures" else "ensures"
+      in
+      [ K kf ; B bhv ; A a ; I ip ]
     | IPPredicate {ip_kind=PKEnsures (bhv, Exits); ip_kf=kf; ip_pred=ip} ->
-      [ K kf ; B bhv ; A "exits" ; I ip ]
+      let a =
+        if ip.ip_content.tp_only_check then "check_exits" else "exits"
+      in
+      [ K kf ; B bhv ; A a ; I ip ]
     | IPPredicate {ip_kind=PKEnsures (bhv, Breaks); ip_kf=kf; ip_pred=ip} ->
-      [ K kf ; B bhv ; A "breaks" ; I ip ]
+      let a =
+        if ip.ip_content.tp_only_check then "check_breaks" else "breaks"
+      in
+      [ K kf ; B bhv ; A a ; I ip ]
     | IPPredicate {ip_kind=PKEnsures (bhv, Continues); ip_kf=kf; ip_pred=ip} ->
-      [ K kf ; B bhv ; A "continues" ; I ip ]
+      let a =
+        if ip.ip_content.tp_only_check then "check_continues" else "continues"
+      in
+      [ K kf ; B bhv ; A a ; I ip ]
     | IPPredicate {ip_kind=PKEnsures (bhv, Returns); ip_kf=kf; ip_pred=ip} ->
-      [ K kf ; B bhv ; A "returns" ; I ip ]
+      let a =
+        if ip.ip_content.tp_only_check then "check_returns" else "returns"
+      in
+      [ K kf ; B bhv ; A a ; I ip ]
     | IPPredicate {ip_kind=PKTerminates; ip_kf=kf; ip_pred=ip} ->
       [ K kf ; A "terminates" ; I ip ]
 
@@ -1187,14 +1218,19 @@ struct
     | IPCodeAnnot {ica_kf=kf; ica_stmt=stmt;
                    ica_ca={annot_content=AExtended (_, _, {ext_name})}} ->
       [ K kf ; A ext_name ; S stmt ]
-    | IPCodeAnnot {ica_kf=kf; ica_ca={annot_content=AAssert (_, Assert,p)}} ->
-      [K kf ; A "assert" ; P p ]
-    | IPCodeAnnot {ica_kf=kf; ica_ca={annot_content=AAssert (_, Check,p)}} ->
-      [K kf ; A "check" ; P p ]
+    | IPCodeAnnot {ica_kf=kf; ica_ca={annot_content=AAssert (_,p)}} ->
+      let a = if p.tp_only_check then "check" else "assert" in
+      [K kf ; A a ; P p.tp_statement ]
     | IPCodeAnnot {ica_kf=kf; ica_ca={annot_content=AInvariant (_, true, p)}} ->
-      [K kf ; A "loop_invariant" ; P p ]
-    | IPCodeAnnot {ica_kf=kf; ica_ca={annot_content=AInvariant (_, false, p)}} ->
-      [K kf ; A "invariant" ; P p ]
+      let a =
+        if p.tp_only_check then "check_loop_invariant" else "loop_invariant"
+      in
+      [K kf ; A a ; P p.tp_statement ]
+    | IPCodeAnnot {ica_kf=kf; ica_ca={annot_content=AInvariant (_,false, p)}} ->
+      let a =
+        if p.tp_only_check then "check_invariant" else "invariant"
+      in
+      [K kf ; A a ; P p.tp_statement ]
     | IPCodeAnnot {ica_kf=kf; ica_ca={annot_content=AVariant (e, _)}} ->
       [K kf ; A "loop_variant" ; T e ]
     | IPCodeAnnot {ica_kf=kf; ica_ca={annot_content=AAssigns _}} ->
@@ -1203,8 +1239,10 @@ struct
       [K kf ; A "loop_allocates" ]
 
     | IPComplete {ic_kf=kf; ic_bhvs=cs} ->
+      let cs = Datatype.String.Set.elements cs in
       (K kf :: A "complete" :: List.map (fun a -> A a) cs)
     | IPDisjoint {ic_kf=kf; ic_bhvs=cs} ->
+      let cs = Datatype.String.Set.elements cs in
       (K kf :: A "disjoint" :: List.map (fun a -> A a) cs)
 
     | IPReachable {ir_kf=None} -> []
@@ -1220,7 +1258,8 @@ struct
     | IPAxiomatic _
     | IPAxiom _ -> []
     | IPLemma {il_name=name; il_pred=p} ->
-      [ A "lemma" ; A name ; P p ]
+      let a = if p.tp_only_check then "check_lemma" else "lemma" in
+      [ A a ; A name ; P p.tp_statement ]
 
     | IPTypeInvariant {iti_name=name}
     | IPGlobalInvariant {igi_name=name} ->
@@ -1416,6 +1455,7 @@ let ip_all_of_behavior kf st ~active b =
   @ List.map (ip_of_extended (e_loc_of_stmt kf st)) b.b_extended
 
 let ip_of_complete ic_kf ic_kinstr ~active ic_bhvs =
+  let ic_bhvs = Datatype.String.Set.of_list ic_bhvs in
   let ic_active = Datatype.String.Set.of_list active in
   IPComplete {ic_kf; ic_kinstr; ic_active; ic_bhvs}
 
@@ -1423,6 +1463,7 @@ let ip_complete_of_spec kf st ~active s =
   List.map (ip_of_complete kf st ~active) s.spec_complete_behaviors
 
 let ip_of_disjoint ic_kf ic_kinstr ~active ic_bhvs =
+  let ic_bhvs = Datatype.String.Set.of_list ic_bhvs in
   let ic_active = Datatype.String.Set.of_list active in
   IPDisjoint {ic_kf; ic_kinstr; ic_active; ic_bhvs}
 
diff --git a/src/kernel_services/ast_data/property.mli b/src/kernel_services/ast_data/property.mli
index 48549e11c1dbb99c1dd2dde43c348a4d2e90e21f..ef1f193333d5fbb227ae616d02873e95aa24a814 100644
--- a/src/kernel_services/ast_data/property.mli
+++ b/src/kernel_services/ast_data/property.mli
@@ -100,7 +100,7 @@ type identified_complete = {
   ic_kf : kernel_function;
   ic_kinstr : kinstr;
   ic_active : Datatype.String.Set.t;
-  ic_bhvs : string list
+  ic_bhvs : Datatype.String.Set.t
 }
 (** Same as for {!identified_behavior}. *)
 
@@ -156,7 +156,7 @@ and identified_lemma = {
   il_name : string;
   il_labels : logic_label list;
   il_args : string list;
-  il_pred : predicate;
+  il_pred : toplevel_predicate;
   il_loc : location
 }
 
diff --git a/src/kernel_services/ast_data/property_status.ml b/src/kernel_services/ast_data/property_status.ml
index ea653a36c45d240f33ab4f23cefd7f791e13e4fb..e70cdf7f9f84b12b778be4a0a1d7bbf12263a12f 100644
--- a/src/kernel_services/ast_data/property_status.ml
+++ b/src/kernel_services/ast_data/property_status.ml
@@ -507,13 +507,12 @@ and unsafe_emit_and_get e ~hyps ~auto ppt ?(distinct=false) s =
          let old_s = Emitter_with_properties.Hashtbl.find by_emitter emitter in
          try
            let first =
-             (if distinct then merge_distinct_emitted
-              else check_strongest_emitted)
-               s
-               old_s
-           in
-           if first then emit s else old_s
-         with Unmergeable -> emit Dont_know
+             if distinct then merge_distinct_emitted s old_s
+             else check_strongest_emitted s old_s
+           in if first then emit s else old_s
+         with
+         | Unmergeable -> emit Dont_know
+         | Inconsistent_emitted_status _ -> emit False_if_reachable
      with Not_found ->
        emit s)
   with Not_found ->
diff --git a/src/kernel_services/ast_data/statuses_by_call.ml b/src/kernel_services/ast_data/statuses_by_call.ml
index 2487ade6c495aebf89aeec1b7caa4891017410ce..f076603133d49546da0a86355c179bba4570f226 100644
--- a/src/kernel_services/ast_data/statuses_by_call.ml
+++ b/src/kernel_services/ast_data/statuses_by_call.ml
@@ -111,23 +111,27 @@ let replacement_visitor ~arguments = object (self)
     | TVar { lv_origin = Some vinfo } when vinfo.vformal ->
       if under_label then raise Non_Transposable;
       begin
-        let new_term = replace_formal_by_concrete vinfo arguments in
-        let add_offset lv = TLval (Logic_const.addTermOffsetLval t_offset lv) in
-        match new_term.term_node with
-        | TLval lv -> Cil.ChangeDoChildrenPost (add_offset lv, fun x -> x)
-        | _ ->
-          if t_offset = TNoOffset
-          then Cil.ChangeTo new_term.term_node
-          else
-            let ltyp = new_term.term_type in
-            let tmp_lvar = Cil.make_temp_logic_var ltyp in
-            let tmp_linfo =
-              { l_var_info = tmp_lvar; l_body = LBterm new_term;
-                l_type = None; l_tparams = []; l_labels = []; l_profile = [];  }
-            in
-            let lval_node = TLval (TVar tmp_lvar, t_offset) in
-            let lval_term = Tlet (tmp_linfo, Logic_const.term lval_node ltyp) in
-            Cil.ChangeDoChildrenPost (lval_term, fun x -> x)
+        let post_replace _ =
+          let new_term = replace_formal_by_concrete vinfo arguments in
+          let add_offset lv =
+            TLval (Logic_const.addTermOffsetLval t_offset lv)
+          in
+          match new_term.term_node with
+          | TLval lv -> add_offset lv
+          | node ->
+            if t_offset = TNoOffset then node
+            else
+              let ltyp = new_term.term_type in
+              let tmp_lvar = Cil.make_temp_logic_var ltyp in
+              let tmp_linfo =
+                { l_var_info = tmp_lvar; l_body = LBterm new_term;
+                  l_type = None; l_tparams = []; l_labels = [];
+                  l_profile = []; }
+              in
+              let lval_node = TLval (TVar tmp_lvar, t_offset) in
+              Tlet (tmp_linfo, Logic_const.term lval_node ltyp)
+        in
+        Cil.DoChildrenPost post_replace
       end
     | _ -> Cil.DoChildren
 
@@ -149,8 +153,7 @@ let replacement_visitor ~arguments = object (self)
     | _ -> Cil.DoChildren
 
   method! vlogic_label = function
-    | BuiltinLabel Pre ->
-      Cil.ChangeDoChildrenPost (Logic_const.here_label, fun x -> x)
+    | BuiltinLabel Pre -> Cil.DoChildrenPost (fun _ -> Logic_const.here_label)
     | _ -> Cil.DoChildren
 end
 
@@ -163,15 +166,16 @@ let rec associate acc ~formals ~concretes =
     let term = Logic_utils.expr_to_term concrete in
     associate ((formal, term) :: acc) ~formals ~concretes
 
-let transpose_pred_at_callsite ~formals ~concretes pred =
-  let pred = Logic_const.pred_of_id_pred pred in
+let transpose_pred_at_callsite ~formals ~concretes id_pred =
+  let pred = Logic_const.pred_of_id_pred id_pred in
   try
     let arguments = associate [] ~formals ~concretes in
     let visitor :> Cil.cilVisitor = replacement_visitor arguments in
     let new_pred = Cil.visitCilPredicateNode visitor pred.pred_content in
     let p_unnamed = Logic_const.unamed ~loc:pred.pred_loc new_pred in
     let p_named = { p_unnamed with pred_name = pred.pred_name } in
-    Some (Logic_const.new_predicate p_named)
+    let only_check = id_pred.ip_content.tp_only_check in
+    Some (Logic_const.new_predicate ~only_check p_named)
   with Non_Transposable -> None
 
 
diff --git a/src/kernel_services/ast_printing/cil_printer.ml b/src/kernel_services/ast_printing/cil_printer.ml
index 4d3312bae1154f6a0a2ba915bb467a9e8db4e179..7a15dce648818142cd98813462572deb20d9728f 100644
--- a/src/kernel_services/ast_printing/cil_printer.ml
+++ b/src/kernel_services/ast_printing/cil_printer.ml
@@ -93,6 +93,7 @@ let () = register_shallow_attribute Cil.frama_c_ghost_else
 let () = register_shallow_attribute Cil.frama_c_ghost_formal
 let () = register_shallow_attribute Cil.frama_c_mutable
 let () = register_shallow_attribute Cil.frama_c_init_obj
+let () = register_shallow_attribute Cil.frama_c_inlined
 
 let keep_attr = function
   | Attr _ as a -> not (List.mem (Cil.attributeName a) !reserved_attributes)
@@ -2834,13 +2835,17 @@ class cil_printer () = object (self)
   method decreases fmt v = self#decrement "decreases" fmt v
   method variant fmt v = self#decrement "loop variant" fmt v
 
+  method private pp_only_check fmt p =
+    if p.tp_only_check then fprintf fmt "%a " self#pp_acsl_keyword "check"
+
   method assumes fmt p =
     fprintf fmt "@[<hov 2>%a@ %a;@]"
       self#pp_acsl_keyword "assumes"
       self#identified_predicate p
 
   method requires fmt p =
-    fprintf fmt "@[<hov 2>%a@ %a;@]"
+    fprintf fmt "@[<hov 2>%a%a@ %a;@]"
+      self#pp_only_check p.ip_content
       self#pp_acsl_keyword "requires"
       self#identified_predicate p
 
@@ -2852,7 +2857,8 @@ class cil_printer () = object (self)
 
   method post_cond fmt (k,p) =
     let kw = get_termination_kind_name k in
-    fprintf fmt "@[<hov 2>%a@ %a;@]"
+    fprintf fmt "@[<hov 2>%a%a@ %a;@]"
+      self#pp_only_check p.ip_content
       self#pp_acsl_keyword kw
       self#identified_predicate p
 
@@ -3059,16 +3065,12 @@ class cil_printer () = object (self)
           (Pretty_utils.pp_list ~sep:",@ " pp_print_string) l
     in
     match ca.annot_content with
-    | AAssert (behav,Assert,p) ->
+    | AAssert (behav,p) ->
+      let kw = if p.tp_only_check then "check" else "assert" in
       fprintf fmt "@[%a%a@ %a;@]"
         pp_for_behavs behav
-        self#pp_acsl_keyword "assert"
-        self#predicate p
-    | AAssert (behav,Check,p) ->
-      fprintf fmt "@[%a%a@ %a;@]"
-        pp_for_behavs behav
-        self#pp_acsl_keyword "check"
-        self#predicate p
+        self#pp_acsl_keyword kw
+        self#predicate p.tp_statement
     | APragma (Slice_pragma sp) ->
       fprintf fmt "@[%a@ %a;@]"
         self#pp_acsl_keyword "slice pragma"
@@ -3094,15 +3096,17 @@ class cil_printer () = object (self)
         pp_for_behavs behav
         (self#allocation ~isloop:true) af
     | AInvariant(behav,true, i) ->
-      fprintf fmt "@[<2>%a%a@ %a;@]"
+      fprintf fmt "@[<2>%a%a%a@ %a;@]"
         pp_for_behavs behav
+        self#pp_only_check i
         self#pp_acsl_keyword "loop invariant"
-        self#predicate i
+        self#predicate i.tp_statement
     | AInvariant(behav,false,i) ->
-      fprintf fmt "@[<2>%a%a@ %a;@]"
+      fprintf fmt "@[<2>%a%a%a@ %a;@]"
         pp_for_behavs behav
+        self#pp_only_check i
         self#pp_acsl_keyword "invariant"
-        self#predicate i
+        self#predicate i.tp_statement
     | AVariant v ->
       self#variant fmt v
     | AExtended (behav, is_loop, e) ->
@@ -3192,7 +3196,8 @@ class cil_printer () = object (self)
     | Dlemma(name, is_axiom, labels, tvars, pred, _attr, _) ->
       (* attributes are meant to be purely internal for now. *)
       let old_lab = current_label in
-      fprintf fmt "@[<hv 2>@[<hov 1>%a %a%a%a:@]@ %t%a;@]@\n"
+      fprintf fmt "@[<hv 2>@[<hov 1>%a%a %a%a%a:@]@ %t%a;@]@\n"
+        self#pp_only_check pred
         self#pp_acsl_keyword (if is_axiom then "axiom" else "lemma")
         self#varname name
         self#labels labels
@@ -3203,7 +3208,7 @@ class cil_printer () = object (self)
            the pretty-printing of labels, and before pretty-printing predicate
         *)
         (fun _ -> (match labels with [l] -> current_label <- l | _ -> ()))
-        self#predicate pred;
+        self#predicate pred.tp_statement;
       current_label <- old_lab
     | Dtype (ti,_) ->
       fprintf fmt "@[<hv 2>@[%a %a%a%a;@]@\n"
diff --git a/src/kernel_services/ast_printing/cil_types_debug.ml b/src/kernel_services/ast_printing/cil_types_debug.ml
index bf24ded49429a4dc0425d3d22e954df4c4835082..9f6037a6b458b499e19b3051d4bdfc883bfb8b8a 100644
--- a/src/kernel_services/ast_printing/cil_types_debug.ml
+++ b/src/kernel_services/ast_printing/cil_types_debug.ml
@@ -881,7 +881,13 @@ and pp_predicate_node fmt = function
 
 and pp_identified_predicate fmt identified_predicate =
   Format.fprintf fmt "{ip_id=%d;ip_content=%a}"
-    identified_predicate.ip_id pp_predicate identified_predicate.ip_content
+    identified_predicate.ip_id
+    pp_toplevel_predicate identified_predicate.ip_content
+
+and pp_toplevel_predicate fmt toplevel_predicate =
+  Format.fprintf fmt "{tp_only_check=%B;tp_statement=%a}"
+    toplevel_predicate.tp_only_check
+    pp_predicate toplevel_predicate.tp_statement
 
 and pp_predicate fmt predicate = Format.fprintf fmt "{%a%apred_content=%a}"
     (pp_if_list_not_empty "pred_name=" ";" (pp_list pp_string)) predicate.pred_name
@@ -960,17 +966,16 @@ and pp_pragma fmt = function
   | Impact_pragma(term) ->
     Format.fprintf fmt "Impact_pragma(%a)" pp_impact_pragma term
 
-and pp_assertion_kind fmt = function
-  | Assert -> Format.pp_print_string fmt "Assert"
-  | Check -> Format.pp_print_string fmt "Check"
-
 and pp_code_annotation_node fmt = function
-  | AAssert(string_list,kind,predicate) ->
-    Format.fprintf fmt "AAssert(%a,%a,%a)"  (pp_list pp_string) string_list pp_assertion_kind kind pp_predicate predicate
+  | AAssert(string_list,p) ->
+    Format.fprintf fmt "AAssert(%a,%a)"
+      (pp_list pp_string) string_list
+      pp_toplevel_predicate p
   | AStmtSpec(string_list,spec) ->
     Format.fprintf fmt "AStmtSpec(%a,%a)"  (pp_list pp_string) string_list  pp_spec spec
-  | AInvariant(string_list,bool,predicate) ->
-    Format.fprintf fmt "AInvariant(%a,%a,%a)"  (pp_list pp_string) string_list  pp_bool bool  pp_predicate predicate
+  | AInvariant(string_list,bool,p) ->
+    Format.fprintf fmt "AInvariant(%a,%a,%a)"
+      (pp_list pp_string) string_list  pp_bool bool  pp_toplevel_predicate p
   | AVariant(term_variant) ->
     Format.fprintf fmt "AVariant(%a)" pp_variant term_variant
   | AAssigns(string_list,assigns) ->
@@ -1010,7 +1015,8 @@ and pp_global_annotation fmt = function
   | Dlemma(string,bool,logic_label_list,string_list,predicate,attributes,location) ->
     Format.fprintf fmt "Dlemma(%a,%a,%a,%a,%a,%a,%a)"  pp_string string  pp_bool bool
       (pp_list pp_logic_label) logic_label_list (pp_list pp_string) string_list
-      pp_predicate predicate  pp_attributes attributes  pp_location location
+      pp_toplevel_predicate predicate
+      pp_attributes attributes  pp_location location
   | Dinvariant(logic_info,location) ->
     Format.fprintf fmt "Dinvariant(%a,%a)"  pp_logic_info logic_info  pp_location location
   | Dtype_annot(logic_info,location) ->
diff --git a/src/kernel_services/ast_printing/cil_types_debug.mli b/src/kernel_services/ast_printing/cil_types_debug.mli
index c9f1318b512cc8430d085f7c53b4fb8392bcb099..b64e8fbfebde6a2bb71a95224180bbcdb9f135ac 100644
--- a/src/kernel_services/ast_printing/cil_types_debug.mli
+++ b/src/kernel_services/ast_printing/cil_types_debug.mli
@@ -135,6 +135,7 @@ val pp_quantifiers : Format.formatter -> Cil_types.quantifiers -> unit
 val pp_relation : Format.formatter -> Cil_types.relation -> unit
 val pp_predicate_node : Format.formatter -> Cil_types.predicate_node -> unit
 val pp_identified_predicate : Format.formatter -> Cil_types.identified_predicate -> unit
+val pp_toplevel_predicate: Format.formatter -> Cil_types.toplevel_predicate -> unit
 val pp_predicate : Cil_types.predicate Pretty_utils.formatter
 val pp_spec : Format.formatter -> Cil_types.spec -> unit
 val pp_acsl_extension : Format.formatter -> Cil_types.acsl_extension -> unit
diff --git a/src/kernel_services/ast_printing/description.ml b/src/kernel_services/ast_printing/description.ml
index 6822800afecaf8e3d5e546787baa5fa0545a42bb..8ccda1048a0f5e2fdada76f9db31d63eee68125a 100644
--- a/src/kernel_services/ast_printing/description.ml
+++ b/src/kernel_services/ast_printing/description.ml
@@ -54,7 +54,7 @@ let pp_labels fmt stmt =
   | ls -> Format.fprintf fmt " '%s'" (String.concat "," ls)
 
 let pp_idpred kloc fmt idpred =
-  let np = idpred.ip_content in
+  let np = Logic_const.pred_of_id_pred idpred in
   if np.pred_name <> []
   then Format.fprintf fmt " '%s'" (String.concat "," np.pred_name)
   else pp_kloc kloc fmt np.pred_loc
@@ -95,12 +95,17 @@ let pp_bhv fmt bhv =
   if not (Cil.is_default_behavior bhv) then
     Format.fprintf fmt " for '%s'" bhv.b_name
 
-let pp_bhvs fmt = function
-  | [] -> ()
-  | b::bs ->
-    Format.fprintf fmt " @[<hov 0>'%s'" b ;
-    List.iter (fun b -> Format.fprintf fmt ",@ '%s'" b) bs ;
-    Format.fprintf fmt "@]"
+let pp_bhvs fmt bhvs =
+  if Datatype.String.Set.is_empty bhvs then
+    ()
+  else
+    Pretty_utils.pp_iter
+      ~pre:" @[<hov 0>"
+      ~suf:"@]"
+      ~sep:",@ "
+      Datatype.String.Set.iter
+      (fun fmt s -> Format.fprintf fmt "'%s'" s)
+      fmt bhvs
 
 let pp_for fmt = function
   | [] -> ()
@@ -110,14 +115,16 @@ let pp_named fmt nx =
   if nx.pred_name <> [] then
     Format.fprintf fmt " '%s'" (String.concat "," nx.pred_name)
 
+let pp_top fmt tp = pp_named fmt tp.tp_statement
+
 let pp_code_annot fmt ca =
   match ca.annot_content with
-  | AAssert(bs,Assert,np) ->
-    Format.fprintf fmt "assertion%a%a" pp_for bs pp_named np
-  | AAssert(bs,Check,np) ->
-    Format.fprintf fmt "check%a%a" pp_for bs pp_named np
-  | AInvariant(bs,_,np) ->
-    Format.fprintf fmt "invariant%a%a" pp_for bs pp_named np
+  | AAssert(bs,tp) when not tp.tp_only_check ->
+    Format.fprintf fmt "assertion%a%a" pp_for bs pp_top tp
+  | AAssert(bs,tp) ->
+    Format.fprintf fmt "check%a%a" pp_for bs pp_top tp
+  | AInvariant(bs,_,tp) ->
+    Format.fprintf fmt "invariant%a%a" pp_for bs pp_top tp
   | AAssigns(bs,_) -> Format.fprintf fmt "assigns%a" pp_for bs
   | AAllocation(bs,_) -> Format.fprintf fmt "allocates_frees%a" pp_for bs
   | APragma _ -> Format.pp_print_string fmt "pragma"
@@ -253,21 +260,22 @@ let rec pp_prop kfopt kiopt kloc fmt = function
       pp_bhvs ic_bhvs
       (pp_opt kiopt (pp_kinstr kloc)) ic_kinstr
       (pp_opt kiopt pp_active) ic_active
-  | IPCodeAnnot {ica_ca={annot_content=AAssert(bs,Assert,np)}} ->
+  | IPCodeAnnot {ica_ca={annot_content=AAssert(bs,tp)}}
+    when not tp.tp_only_check ->
     Format.fprintf fmt "Assertion%a%a%a"
       pp_for bs
-      pp_named np
-      (pp_kloc kloc) np.pred_loc
-  | IPCodeAnnot {ica_ca={annot_content=AAssert(bs,Check,np)}} ->
+      pp_top tp
+      (pp_kloc kloc) tp.tp_statement.pred_loc
+  | IPCodeAnnot {ica_ca={annot_content=AAssert(bs,tp)}} ->
     Format.fprintf fmt "Check%a%a%a"
       pp_for bs
-      pp_named np
-      (pp_kloc kloc) np.pred_loc
-  | IPCodeAnnot {ica_ca={annot_content=AInvariant(bs,_,np)}} ->
+      pp_top tp
+      (pp_kloc kloc) tp.tp_statement.pred_loc
+  | IPCodeAnnot {ica_ca={annot_content=AInvariant(bs,_,tp)}} ->
     Format.fprintf fmt "Invariant%a%a%a"
       pp_for bs
-      pp_named np
-      (pp_kloc kloc) np.pred_loc
+      pp_top tp
+      (pp_kloc kloc) tp.tp_statement.pred_loc
   | IPCodeAnnot {ica_ca={annot_content=AExtended(bs,_,{ext_name})};ica_stmt} ->
     Format.fprintf fmt "%a%a %a"
       pp_capitalize ext_name pp_for bs (pp_stmt kloc) ica_stmt
@@ -360,18 +368,16 @@ let to_string pp elt =
   Buffer.contents b
 
 let code_annot_kind_and_node code_annot = match code_annot.annot_content with
-  | AAssert (_, kind, {pred_content; pred_name}) ->
+  | AAssert (_, {tp_only_check; tp_statement = {pred_content; pred_name}}) ->
     let kind = match Alarms.find code_annot with
       | Some alarm -> Alarms.get_name alarm
       | None ->
-        if List.exists ((=) "missing_return") pred_name
-        then "missing_return"
-        else match kind with
-          | Assert -> "user assertion"
-          | Check -> "user check"
+        if List.exists ((=) "missing_return") pred_name then "missing_return"
+        else if tp_only_check then "user check"
+        else "user assertion"
     in
     Some (kind, to_string Printer.pp_predicate_node pred_content)
-  | AInvariant (_, _, {pred_content}) ->
+  | AInvariant (_, _, {tp_statement = {pred_content}}) ->
     Some ("loop invariant", to_string Printer.pp_predicate_node pred_content)
   | _ -> None
 
@@ -471,12 +477,12 @@ let for_order k = function
   | [] -> [I k]
   | bs -> I (succ k) :: named_order bs
 let annot_order = function
-  | {annot_content=AAssert(bs,Check,np)} ->
-    for_order 0 bs @ named_order np.pred_name
-  | {annot_content=AAssert(bs,Assert,np)} ->
-    for_order 2 bs @ named_order np.pred_name
-  | {annot_content=AInvariant(bs,_,np)} ->
-    for_order 4 bs @ named_order np.pred_name
+  | {annot_content=AAssert(bs,tp)} when tp.tp_only_check ->
+    for_order 0 bs @ named_order tp.tp_statement.pred_name
+  | {annot_content=AAssert(bs,tp)} ->
+    for_order 2 bs @ named_order tp.tp_statement.pred_name
+  | {annot_content=AInvariant(bs,_,tp)} ->
+    for_order 4 bs @ named_order tp.tp_statement.pred_name
   | _ -> [I 6]
 let loop_order = function
   | Id_contract (active,b) -> [B b; A active]
@@ -491,8 +497,10 @@ let rec ip_order = function
   | IPBehavior {ib_kf;ib_kinstr;ib_active;ib_bhv} ->
     [I 6;F ib_kf;K ib_kinstr;B ib_bhv; A ib_active]
   | IPComplete {ic_kf;ic_kinstr;ic_active;ic_bhvs} ->
+    let ic_bhvs = Datatype.String.Set.elements ic_bhvs in
     [I 7;F ic_kf;K ic_kinstr; A ic_active] @ for_order 0 ic_bhvs
   | IPDisjoint {ic_kf;ic_kinstr;ic_active;ic_bhvs} ->
+    let ic_bhvs = Datatype.String.Set.elements ic_bhvs in
     [I 8;F ic_kf;K ic_kinstr; A ic_active] @ for_order 0 ic_bhvs
   | IPPredicate {ip_kind;ip_kf;ip_kinstr} ->
     [I 9;F ip_kf;K ip_kinstr] @ kind_order ip_kind
diff --git a/src/kernel_services/ast_printing/logic_print.ml b/src/kernel_services/ast_printing/logic_print.ml
index fca0da4953174ea419fd0fe96a21a520e7a80f18..1b3c0544fc39e38fce56da4f47fe2a8dae606f60 100644
--- a/src/kernel_services/ast_printing/logic_print.ml
+++ b/src/kernel_services/ast_printing/logic_print.ml
@@ -356,11 +356,12 @@ let rec print_decl fmt d =
       (pp_list ~sep:",@ " print_typed_ident) prms
       (pp_list ~sep:"@\n" print_case) cases
   | LDlemma(name,is_axiom,labels,tvar,body) ->
-    fprintf fmt "@[<2>%a@ %s%a%a:@ %a;@]"
+    fprintf fmt "@[<2>%s%a@ %s%a%a:@ %a;@]"
+      (if body.tp_only_check then "check " else "")
       (pp_cond ~pr_false:"lemma" is_axiom) "axiom" name
       (pp_list ~pre:"{@[" ~sep:",@ " ~suf:"@]}" pp_print_string) labels
       (pp_list ~pre:"<@[" ~sep:",@ " ~suf:"@>}" pp_print_string) tvar
-      print_lexpr body
+      print_lexpr body.tp_statement
   | LDaxiomatic (s,d) ->
     fprintf fmt "@[<2>axiomatic@ %s@ {@\n%a@]@\n}" s
       (pp_list ~sep:"@\n" print_decl) d
@@ -409,14 +410,18 @@ let print_allocation ~isloop fmt fa =
 
 let print_clause name fmt e = fprintf fmt "@\n%s@ %a;" name print_lexpr e
 
+let print_tp_clause name fmt e =
+  let name = if e.tp_only_check then "check " ^ name else name in
+  print_clause name fmt e.tp_statement
+
 let print_post fmt (k,e) =
-  print_clause (Cil_printer.get_termination_kind_name k) fmt e
+  print_tp_clause (Cil_printer.get_termination_kind_name k) fmt e
 
 let print_behavior fmt bhv =
   fprintf fmt "@[<2>behavior@ %s:%a%a%a%a%a@]"
     bhv.b_name
     (pp_list ~pre:"" ~suf:"" (print_clause "assumes")) bhv.b_assumes
-    (pp_list ~pre:"" ~suf:"" (print_clause "requires")) bhv.b_requires
+    (pp_list ~pre:"" ~suf:"" (print_tp_clause "requires")) bhv.b_requires
     (pp_list ~pre:"" ~suf:"" print_post) bhv.b_post_cond
     (print_allocation ~isloop:false) bhv.b_allocation
     print_assigns bhv.b_assigns
@@ -463,10 +468,6 @@ let print_pragma fmt p =
   | Slice_pragma p -> fprintf fmt "slice@ pragma@ %a;" print_slice_pragma p
   | Impact_pragma p -> fprintf fmt "impact@ pragma@ %a;" print_impact_pragma p
 
-let print_assertion_kind fmt = function
-  | Assert -> pp_print_string fmt "assert"
-  | Check -> pp_print_string fmt "check"
-
 let print_extension fmt (name, ext) =
   fprintf fmt "%s %a" name (pp_list ~sep:",@ " print_lexpr) ext
 
@@ -475,16 +476,21 @@ let print_code_annot fmt ca =
     (pp_list ~pre:"for@ " ~sep:",@ " ~suf:":@ " pp_print_string) fmt bhvs
   in
   match ca with
-    AAssert(bhvs,kind,e) ->
-    fprintf fmt "%a%a@ %a;"
-      print_behaviors bhvs print_assertion_kind kind print_lexpr e
+    AAssert(bhvs,e) ->
+    fprintf fmt "%a%s@ %a;"
+      print_behaviors bhvs
+      (if e.tp_only_check then "check" else "assert")
+      print_lexpr e.tp_statement
   | AStmtSpec (bhvs,s) ->
     fprintf fmt "%a%a"
       print_behaviors bhvs
       print_spec s
   | AInvariant (bhvs,loop,e) ->
-    fprintf fmt "%a%ainvariant@ %a;"
-      print_behaviors bhvs (pp_cond loop) "loop@ " print_lexpr e
+    fprintf fmt "%a%a%ainvariant@ %a;"
+      print_behaviors bhvs
+      (pp_cond e.tp_only_check) "check @"
+      (pp_cond loop) "loop@ "
+      print_lexpr e.tp_statement
   | AVariant e -> fprintf fmt "loop@ variant@ %a;" print_variant e
   | AAssigns (bhvs,a) ->
     fprintf fmt "%aloop@ %a" print_behaviors bhvs print_assigns a
diff --git a/src/kernel_services/ast_printing/printer.ml b/src/kernel_services/ast_printing/printer.ml
index 336d08c7b428d42fdadd796b4ff037804b02f3d0..7735444cd57cef665b84d6588e260f1a8f2950bb 100644
--- a/src/kernel_services/ast_printing/printer.ml
+++ b/src/kernel_services/ast_printing/printer.ml
@@ -157,7 +157,12 @@ class printer_with_annot () = object (self)
       let comments = Globals.get_comments_global glob in
       Pretty_utils.pp_list
         ~sep:"@\n" ~suf:"@\n"
-        (fun fmt s -> Format.fprintf fmt "/* %s */" s) fmt comments
+        (fun fmt s ->
+           if String.contains s '\n' || String.contains s '\r' then
+             Format.fprintf fmt "/*%s*/" s
+           else
+             Format.fprintf fmt "//%s" s
+        ) fmt comments
     end;
     (* Out of tree global annotations are pretty printed before the first
        variable declaration of the first function definition. *)
@@ -200,8 +205,12 @@ class printer_with_annot () = object (self)
       let comments = Globals.get_comments_stmt s in
       if comments <> [] then
         Pretty_utils.pp_list ~sep:"@\n" ~suf:"@]@\n"
-          (fun fmt s -> Format.fprintf fmt "@[/* %s */@]" s)
-          fmt comments
+          (fun fmt s ->
+             if String.contains s '\n' || String.contains s '\r' then
+               Format.fprintf fmt "@[/*%s*/@]" s
+             else
+               Format.fprintf fmt "@[//%s@]" s
+          ) fmt comments
     end;
     if verbose || Kernel.is_debug_key_enabled Kernel.dkey_print_sid then
       Format.fprintf fmt "@[/* sid:%d */@]@\n" s.sid ;
@@ -288,6 +297,7 @@ let () = Cil_datatype.Logic_label.pretty_ref := pp_logic_label
 let () = Cil_datatype.Global_annotation.pretty_ref := pp_global_annotation
 let () = Cil_datatype.Global.pretty_ref := pp_global
 let () = Cil_datatype.Predicate.pretty_ref := pp_predicate
+let () = Cil_datatype.Toplevel_predicate.pretty_ref := pp_toplevel_predicate
 let () = Cil_datatype.Identified_predicate.pretty_ref := pp_identified_predicate
 let () = Cil_datatype.Fundec.pretty_ref := pp_fundec
 
diff --git a/src/kernel_services/ast_printing/printer_api.ml b/src/kernel_services/ast_printing/printer_api.ml
index e92c4054bf0d72ffb9096cbedc1679ea8b22c68d..55444e77588a2125f697a28054600bcfb826c2b8 100644
--- a/src/kernel_services/ast_printing/printer_api.ml
+++ b/src/kernel_services/ast_printing/printer_api.ml
@@ -452,6 +452,8 @@ module type S_pp = sig
   (** @since 21.0-Scandium *)
   val pp_predicate_node: Format.formatter -> predicate_node -> unit
   val pp_predicate: Format.formatter -> predicate -> unit
+  val pp_toplevel_predicate: Format.formatter -> toplevel_predicate -> unit
+  (** @since Frama-C+dev *)
   val pp_identified_predicate: Format.formatter -> identified_predicate -> unit
   val pp_code_annotation: Format.formatter -> code_annotation -> unit
   val pp_funspec: Format.formatter -> funspec -> unit
diff --git a/src/kernel_services/ast_printing/printer_builder.ml b/src/kernel_services/ast_printing/printer_builder.ml
index b722dadc3518e1e248f6f496fa3253952c1f5595..a733de957ce3d588aff9f84e93bb978a25ad1f14 100644
--- a/src/kernel_services/ast_printing/printer_builder.ml
+++ b/src/kernel_services/ast_printing/printer_builder.ml
@@ -66,6 +66,8 @@ struct
   let pp_term_offset fmt x = (printer ())#term_offset fmt x
   let pp_predicate_node fmt x = (printer ())#predicate_node fmt x
   let pp_predicate fmt x = (printer ())#predicate fmt x
+  let pp_toplevel_predicate fmt x =
+    (printer())#predicate fmt x.Cil_types.tp_statement
   let pp_identified_predicate fmt x = (printer ())#identified_predicate fmt x
   let pp_code_annotation fmt x = (printer ())#code_annotation fmt x
   let pp_funspec fmt x = (printer ())#funspec fmt x
diff --git a/src/kernel_services/ast_queries/cil.ml b/src/kernel_services/ast_queries/cil.ml
index 6448005f8a5aeb68f557acfd7bb5ef6507445678..04582c3557e7c494163aa7e400bbd6ad1c7753b9 100644
--- a/src/kernel_services/ast_queries/cil.ml
+++ b/src/kernel_services/ast_queries/cil.ml
@@ -605,6 +605,11 @@ let () = registerAttribute frama_c_mutable (AttrName false)
 let () =
   registerAttribute (Extlib.strip_underscore frama_c_mutable) (AttrName false)
 
+let frama_c_inlined = "__fc_inlined"
+let () = registerAttribute frama_c_inlined (AttrName false)
+let () =
+  registerAttribute (Extlib.strip_underscore frama_c_inlined) (AttrName false)
+
 let unrollType (t: typ) : typ =
   let rec withAttrs (al: attributes) (t: typ) : typ =
     match t with
@@ -1769,9 +1774,14 @@ and visitCilPredicate vis p =
   doVisitCil vis
     id vis#vpredicate childrenPredicate p
 
+and visitCilToplevel_predicate vis p =
+  let s = p.tp_statement in
+  let s' = visitCilPredicate vis s in
+  if s != s' then { p with tp_statement = s' } else p
+
 and childrenIdentified_predicate vis ip =
   let p = ip.ip_content in
-  let p' = visitCilPredicate vis p in
+  let p' = visitCilToplevel_predicate vis p in
   if p != p' then { ip with ip_content = p' }
   else ip
 
@@ -2089,7 +2099,7 @@ and childrenAnnotation vis a =
         vis#get_filling_actions;
     if ti' != ti then Dtype (ti',loc) else a
   | Dlemma(s,is_axiom,labels,tvars,p,attr,loc) ->
-    let p' = visitCilPredicate vis p in
+    let p' = visitCilToplevel_predicate vis p in
     let attr' = visitCilAttributes vis attr in
     if p' != p || attr != attr' then
       Dlemma(s,is_axiom,labels,tvars,p',attr',loc)
@@ -2142,14 +2152,14 @@ and visitCilCodeAnnotation vis ca =
     vis (Visitor_behavior.ccode_annotation vis#behavior) vis#vcode_annot childrenCodeAnnot ca
 
 and childrenCodeAnnot vis ca =
-  let vPred p = visitCilPredicate vis p in
+  let vPred p = visitCilToplevel_predicate vis p in
   let vTerm t = visitCilTerm vis t in
   let vSpec s = visitCilFunspec vis s in
   let change_content annot = { ca with annot_content = annot } in
   match ca.annot_content with
-    AAssert (behav,kind,p) ->
+    AAssert (behav,p) ->
     let p' = vPred p in if p' != p then
-      change_content (AAssert (behav,kind,p'))
+      change_content (AAssert (behav,p'))
     else ca
   | APragma (Impact_pragma t) ->
     let t' = visitCilImpactPragma vis t in
diff --git a/src/kernel_services/ast_queries/cil.mli b/src/kernel_services/ast_queries/cil.mli
index 64a5b55a779e982ac5e1cd44d0269eaff07d47c4..df110d9e57e479c9d9642a4aa05770c490d6b758 100644
--- a/src/kernel_services/ast_queries/cil.mli
+++ b/src/kernel_services/ast_queries/cil.mli
@@ -1248,6 +1248,11 @@ val frama_c_init_obj: string
 *)
 val frama_c_mutable: string
 
+(** A block marked with this attribute is known to be inlined, i.e.
+    it replaces a call to an inline function.
+*)
+val frama_c_inlined: string
+
 (** [true] if the given lval is allowed to be assigned to thanks to
     a [frama_c_init_obj] or a [frama_c_mutable] attribute.
 *)
diff --git a/src/kernel_services/ast_queries/cil_datatype.ml b/src/kernel_services/ast_queries/cil_datatype.ml
index e3437fa40dd4b9f93bed8c05a3826b3266070abe..e512e92b3b9929177593d9f3f538b090db862236 100644
--- a/src/kernel_services/ast_queries/cil_datatype.ml
+++ b/src/kernel_services/ast_queries/cil_datatype.ml
@@ -2248,8 +2248,8 @@ module Code_annotation = struct
       end)
 
   let loc ca = match ca.annot_content with
-    | AAssert(_,_,{pred_loc=loc})
-    | AInvariant(_,_,{pred_loc=loc})
+    | AAssert(_,{ tp_statement = {pred_loc=loc}})
+    | AInvariant(_,_,{tp_statement = {pred_loc=loc}})
     | AVariant({term_loc=loc},_) -> Some loc
     | AAssigns _ | AAllocation _ | APragma _ | AExtended _
     | AStmtSpec _ -> None
@@ -2272,6 +2272,20 @@ module Predicate = struct
       end)
 end
 
+module Toplevel_predicate = struct
+  let pretty_ref = ref (fun _ _ -> assert false)
+  include Make
+      (struct
+        type t = toplevel_predicate
+        let name = "Toplevel_predicate"
+        let reprs =
+          [ { tp_statement = List.hd Predicate.reprs; tp_only_check = false }]
+        let internal_pretty_code = Datatype.undefined
+        let pretty fmt x = !pretty_ref fmt x
+        let varname _ = "p"
+      end)
+end
+
 module Identified_predicate = struct
   let pretty_ref = ref (fun _ _ -> assert false)
   include Make_with_collections
@@ -2279,7 +2293,7 @@ module Identified_predicate = struct
         type t = identified_predicate
         let name = "Identified_predicate"
         let reprs =
-          [ { ip_content = List.hd Predicate.reprs; ip_id = -1} ]
+          [ { ip_content = List.hd Toplevel_predicate.reprs; ip_id = -1} ]
         let compare x y = Extlib.compare_basic x.ip_id y.ip_id
         let equal x y = x.ip_id = y.ip_id
         let copy = Datatype.undefined
diff --git a/src/kernel_services/ast_queries/cil_datatype.mli b/src/kernel_services/ast_queries/cil_datatype.mli
index 460f01de5cb0fe57a65b3123cf6e77d965a652c1..22b09a997e1a07f6634c988cb473e13a54338339 100644
--- a/src/kernel_services/ast_queries/cil_datatype.mli
+++ b/src/kernel_services/ast_queries/cil_datatype.mli
@@ -310,6 +310,7 @@ module Term_lval: S_with_collections_pretty with type t = term_lval
 module Logic_real: S_with_collections_pretty with type t = logic_real
 
 module Predicate: S_with_pretty with type t = predicate
+module Toplevel_predicate: S_with_pretty with type t = toplevel_predicate
 module Identified_predicate: 
   S_with_collections_pretty with type t = identified_predicate
 (** @since Neon-20140301 *)
diff --git a/src/kernel_services/ast_queries/file.ml b/src/kernel_services/ast_queries/file.ml
index 97264eb5a3c3cd16ee95cdfc57aa8a97b6e57a20..7021478b1ee3fd43d9ffbe6104f6e17a26941047 100644
--- a/src/kernel_services/ast_queries/file.ml
+++ b/src/kernel_services/ast_queries/file.ml
@@ -410,7 +410,7 @@ let safe_remove_file (f : Datatype.Filepath.t) =
   if not (Kernel.is_debug_key_enabled Kernel.dkey_parser) then
     Extlib.safe_remove (f :> string)
 
-let build_cpp_cmd cmdl supp_args in_file out_file =
+let replace_in_cpp_cmd cmdl supp_args in_file out_file =
   (* using Filename.quote for filenames which contain space or shell
      metacharacters *)
   let in_file = Filename.quote in_file
@@ -428,16 +428,10 @@ let build_cpp_cmd cmdl supp_args in_file out_file =
     ignore (Str.search_forward regexp cmdl 0); (* Try to find one match *)
     Str.global_substitute regexp substitute cmdl
   with Not_found ->
-    Format.sprintf "%s %s -o %s %s" cmdl supp_args out_file in_file
+    Format.sprintf "%s %s %s -o %s" cmdl supp_args in_file out_file
 
-let parse_cabs = function
-  | NoCPP f ->
-    if not (Sys.file_exists (f:>string)) then
-      Kernel.abort "preprocessed file %a does not exist"
-        Filepath.Normalized.pretty f;
-    Kernel.feedback "Parsing %a (no preprocessing)"
-      Datatype.Filepath.pretty f;
-    Frontc.parse f ()
+let build_cpp_cmd = function
+  | NoCPP _ | External _ -> None
   | NeedCPP (f, cmdl, is_gnu_like) ->
     if not (Sys.file_exists (f :> string)) then
       Kernel.abort "source file %a does not exist"
@@ -525,12 +519,24 @@ let parse_cabs = function
         (Kernel.CppExtraArgs.get () @ extra_args @ supported_cpp_arch_args)
         include_args define_args
     in
+    let cpp_command = replace_in_cpp_cmd cmdl supp_args (f:>string) (ppf:>string) in
     Kernel.feedback ~dkey:Kernel.dkey_pp
-      "@{<i>preprocessing@} with \"%s %s %a\""
-      cmdl supp_args Filepath.Normalized.pretty f;
+      "@{<i>preprocessing@} with \"%s\""
+      cpp_command;
+    Some (cpp_command, ppf, supported_cpp_arch_args)
+
+let parse_cabs cpp_command_no_output = function
+  | NoCPP f ->
+    if not (Sys.file_exists (f:>string)) then
+      Kernel.abort "preprocessed file %a does not exist"
+        Filepath.Normalized.pretty f;
+    Kernel.feedback "Parsing %a (no preprocessing)"
+      Datatype.Filepath.pretty f;
+    Frontc.parse f ()
+  | NeedCPP (f, cmdl, is_gnu_like) ->
+    let cpp_command, ppf, supported_cpp_arch_args = Extlib.the cpp_command_no_output in
     Kernel.feedback "Parsing %a (with preprocessing)"
       Datatype.Filepath.pretty f;
-    let cpp_command = build_cpp_cmd cmdl supp_args (f:>string) (ppf:>string) in
     if Sys.command cpp_command <> 0 then begin
       safe_remove_file ppf;
       let possible_cause =
@@ -579,7 +585,7 @@ let parse_cabs = function
         in
         let ppf' =
           try Logic_preprocess.file ".c"
-                (build_cpp_cmd cmdl pp_annot_supp_args)
+                (replace_in_cpp_cmd cmdl pp_annot_supp_args)
                 (ppf : Filepath.Normalized.t :> string)
           with Sys_error _ as e ->
             safe_remove_file ppf;
@@ -607,9 +613,10 @@ let parse_cabs = function
         "could not find a suitable plugin for parsing %a."
         Filepath.Normalized.pretty f
 
-let to_cil_cabs f =
+let to_cil_cabs cpp_cmds_and_args f =
   try
-    let a,c = parse_cabs f in
+    let cpp_command = List.assoc f cpp_cmds_and_args in
+    let a,c = parse_cabs cpp_command f in
     Kernel.debug ~dkey:Kernel.dkey_file_print_one "result of parsing %s:@\n%a"
       (get_name f) Cil_printer.pp_file a;
     if Errorloc.had_errors () then raise Exit;
@@ -630,7 +637,7 @@ let to_cil_cabs f =
 let () =
   let handle f =
     let preprocess =
-      build_cpp_cmd (fst (get_preprocessor_command ())) "-nostdinc"
+      replace_in_cpp_cmd (fst (get_preprocessor_command ())) "-nostdinc"
     in
     let ppf =
       try Logic_preprocess.file ".c" preprocess f
@@ -667,12 +674,12 @@ let isRoot g =
     keepTypes
   | _ -> false
 
-let files_to_cabs_cil files =
+let files_to_cabs_cil files cpp_commands =
   Kernel.feedback ~level:2 "parsing";
   (* Parsing and merging must occur in the very same order.
      Otherwise the order of files on the command line will not be consistently
      handled. *)
-  let cil_cabs = List.fold_left (fun acc f -> to_cil_cabs f :: acc) [] files in
+  let cil_cabs = List.fold_left (fun acc f -> to_cil_cabs cpp_commands f :: acc) [] files in
   let cil_files, cabs_files = List.split cil_cabs in
   (* fold_left reverses the list order.
      This is an issue with pre-registered files. *)
@@ -1601,7 +1608,18 @@ let init_cil () =
 let prepare_from_c_files () =
   init_cil ();
   let files = Files.get () in (* Allow pre-registration of prolog files *)
-  let cil, cabs_files = files_to_cabs_cil files in
+  let cpp_commands = List.map (fun f -> (f, build_cpp_cmd f)) files in
+  if Kernel.PrintCppCommands.get () then begin
+    List.iter (fun (_f, opt_cpp_cmd) ->
+        match opt_cpp_cmd with
+        | None -> ()
+        | Some (cpp_cmd, _ppf, _) ->
+          Kernel.result
+            "Preprocessing command:@.%s" cpp_cmd
+      ) cpp_commands;
+    raise Cmdline.Exit
+  end;
+  let cil, cabs_files = files_to_cabs_cil files cpp_commands in
   prepare_cil_file cil;
   (* prepare_cil_file may call syntactic transformers, that will ultimately
      reset the untyped AST. Restore it here. *)
diff --git a/src/kernel_services/ast_queries/filecheck.ml b/src/kernel_services/ast_queries/filecheck.ml
index c6214a4461ba9731be1ba117c42aa38093129d4c..2eb9c7560b2bd1dd8164cb4cffc039614fca390a 100644
--- a/src/kernel_services/ast_queries/filecheck.ml
+++ b/src/kernel_services/ast_queries/filecheck.ml
@@ -650,7 +650,7 @@ module Base_checker = struct
            names of statement contracts. *)
         if is_normalized then begin
           match ca.annot_content with
-          | AAssert(bhvs,_,_) | AStmtSpec(bhvs,_) | AInvariant (bhvs,_,_)
+          | AAssert(bhvs,_) | AStmtSpec(bhvs,_) | AInvariant (bhvs,_,_)
           | AAssigns(bhvs,_) | AAllocation(bhvs,_) | AExtended (bhvs,_,_) ->
             List.iter
               (fun b ->
diff --git a/src/kernel_services/ast_queries/json_compilation_database.ml b/src/kernel_services/ast_queries/json_compilation_database.ml
index 5e0124ac2b1d59fb49d71896598f905243a8cec7..eb529f3c23932565e139de9604c6d29b95bc7f10 100644
--- a/src/kernel_services/ast_queries/json_compilation_database.ml
+++ b/src/kernel_services/ast_queries/json_compilation_database.ml
@@ -240,7 +240,7 @@ let parse_entry jcdb_dir r =
     Flags.add path flags
 
 let compute_flags_from_file () =
-  let database = Kernel.JsonCompilationDatabase.get () in
+  let database = (Kernel.JsonCompilationDatabase.get () :> string) in
   let jcdb_dir, jcdb_path =
     if Sys.is_directory database then
       database, Filename.concat database "compile_commands.json"
@@ -264,7 +264,7 @@ let compute_flags_from_file () =
   Flags.mark_as_computed ()
 
 let get_flags f =
-  if Kernel.JsonCompilationDatabase.get () <> "" then begin
+  if not (Filepath.Normalized.is_unknown (Kernel.JsonCompilationDatabase.get ())) then begin
     if not (Flags.is_computed ()) then compute_flags_from_file ();
     try
       let flags = Flags.find f in
diff --git a/src/kernel_services/ast_queries/logic_const.ml b/src/kernel_services/ast_queries/logic_const.ml
index 8ee64b0b36651d60f18a87251d73e9db53d5a161..861d64099492abe32e3cc6026ce0eee7beba3c1f 100644
--- a/src/kernel_services/ast_queries/logic_const.ml
+++ b/src/kernel_services/ast_queries/logic_const.ml
@@ -43,12 +43,15 @@ let new_code_annotation annot =
 
 let fresh_code_annotation = AnnotId.next
 
-let new_predicate p =
-  { ip_id = PredicateId.next (); ip_content = p }
+let toplevel_predicate ?(only_check=false) p =
+  { tp_only_check = only_check; tp_statement = p }
+
+let new_predicate ?only_check p =
+  { ip_id = PredicateId.next (); ip_content = toplevel_predicate ?only_check p }
 
 let fresh_predicate_id = PredicateId.next
 
-let pred_of_id_pred p = p.ip_content
+let pred_of_id_pred p = p.ip_content.tp_statement
 
 let refresh_predicate p = { p with ip_id = PredicateId.next () }
 
diff --git a/src/kernel_services/ast_queries/logic_const.mli b/src/kernel_services/ast_queries/logic_const.mli
index 51759d05c132490f56e7b7a7644677cc944c9fac..9079513585804f3b4d54d1c4052eb7b30f392675 100644
--- a/src/kernel_services/ast_queries/logic_const.mli
+++ b/src/kernel_services/ast_queries/logic_const.mli
@@ -46,8 +46,19 @@ val refresh_code_annotation: code_annotation -> code_annotation
 *)
 val refresh_spec: funspec -> funspec
 
-(** creates a new identified predicate with a fresh id. *)
-val new_predicate: predicate -> identified_predicate
+(** creates a new toplevel predicate.
+    [only_check] is true if the corresponding predicate should only be used
+    to check a property, without adding it as hypothesis for the rest of the
+    verification. See {!Cil_types.toplevel_predicate} for more information.
+    Default is [false], i.e. use standard ACSL semantics.
+    @since Frama-C+dev
+*)
+val toplevel_predicate: ?only_check:bool -> predicate -> toplevel_predicate
+
+(** creates a new identified predicate with a fresh id.
+    @modify Frama-C+dev add [only_check] optional parameter
+ *)
+val new_predicate: ?only_check:bool -> predicate -> identified_predicate
 
 (** creates a new acsl_extension with a fresh id.
     @plugin development guide
diff --git a/src/kernel_services/ast_queries/logic_typing.ml b/src/kernel_services/ast_queries/logic_typing.ml
index 8bd52d2425db3ee2d4b36909b04efa6b388ae7d4..86129401b2122b383b0ef430311205fb8317452d 100644
--- a/src/kernel_services/ast_queries/logic_typing.ml
+++ b/src/kernel_services/ast_queries/logic_typing.ml
@@ -3513,6 +3513,10 @@ struct
 
   let id_predicate env pred = Logic_const.new_predicate (predicate env pred)
 
+  let id_predicate_top env pred =
+    let { tp_only_check = only_check; tp_statement = pred } = pred in
+    Logic_const.new_predicate ~only_check (predicate env pred)
+
   let id_term_ptr env t =
     let loc = t.lexpr_loc in
     let t = term env t in
@@ -3675,11 +3679,12 @@ struct
               ~type_assigns:type_assign
           in
           let b_assumes = List.map (id_predicate env) bas in
-          let b_requires= List.map (id_predicate env) br in
+          let b_requires= List.map (id_predicate_top env) br in
           let b_post_cond =
             List.map
               (fun (k,p)->
-                 let p' = id_predicate (post_state_env k) p in (k,p')) be
+                 let p' = id_predicate_top (post_state_env k) p in (k,p'))
+              be
           in
           let b_assigns =
             type_assign typing_context ~accept_formal:is_stmt_contract assigns_env ba
@@ -3773,15 +3778,14 @@ struct
     append_loop_labels (append_here_label (append_pre_label (append_init_label
                                                                (Lenv.empty()))))
 
-  let assertion_kind =
-    function Assert -> Cil_types.Assert | Check -> Cil_types.Check
-
   let code_annot loc current_behaviors current_return_type ca =
     let source = fst loc in
     let annot = match ca with
-      | AAssert (behav,k,p) ->
+      | AAssert (behav,{tp_only_check=only_check; tp_statement = p}) ->
         check_behavior_names loc current_behaviors behav;
-        Cil_types.AAssert(behav,assertion_kind k,predicate (code_annot_env()) p)
+        let p = predicate (code_annot_env()) p in
+        let p = Logic_const.toplevel_predicate ~only_check p in
+        Cil_types.AAssert(behav,p)
       | APragma (Impact_pragma sp) ->
         Cil_types.APragma
           (Cil_types.Impact_pragma (impact_pragma (code_annot_env()) sp))
@@ -3807,10 +3811,11 @@ struct
         Cil_types.AStmtSpec (behav,my_spec)
       | AVariant v ->
         Cil_types.AVariant (type_variant (loop_annot_env ()) v)
-      | AInvariant (behav,f,i) ->
+      | AInvariant (behav,f,{ tp_only_check = only_check; tp_statement = i}) ->
         let env = if f then loop_annot_env () else code_annot_env () in
         check_behavior_names loc current_behaviors behav;
-        Cil_types.AInvariant (behav,f,predicate env i)
+        let p = Logic_const.toplevel_predicate ~only_check (predicate env i) in
+        Cil_types.AInvariant (behav,f,p)
       | AAllocation (behav,fa) ->
         check_behavior_names loc current_behaviors behav;
         Cil_types.AAllocation(behav,
@@ -4116,7 +4121,8 @@ struct
         C.error loc "Definition of %s is cyclic" s;
       my_info.lt_def <- tdef;
       Dtype (my_info,loc)
-    | LDlemma (x,is_axiom, labels, poly, e) ->
+    | LDlemma (x,is_axiom, labels, poly,
+               { tp_only_check = only_check; tp_statement = e}) ->
       if Logic_env.Lemmas.mem x then begin
         let old_def = Logic_env.Lemmas.find x in
         let old_loc = Cil_datatype.Global_annotation.loc old_def in
@@ -4132,7 +4138,7 @@ struct
           Cil_datatype.Location.pretty old_loc
       end;
       let labels,env = annot_env loc labels poly in
-      let p = predicate env e in
+      let p = Logic_const.toplevel_predicate ~only_check (predicate env e) in
       let labels = match !Lenv.default_label with
         | None -> labels
         | Some lab -> [lab]
diff --git a/src/kernel_services/ast_queries/logic_utils.ml b/src/kernel_services/ast_queries/logic_utils.ml
index bd2af8507ff33b2cc6e28ab4b1557d552988b316..84f577652be9fe9e441826834c0199835914997f 100644
--- a/src/kernel_services/ast_queries/logic_utils.ml
+++ b/src/kernel_services/ast_queries/logic_utils.ml
@@ -129,7 +129,7 @@ let coerce_type typ =
   else if Cil.isFloatingType ty then Lreal
   else Ctype typ
 
-let predicate_of_identified_predicate ip = ip.ip_content
+let predicate_of_identified_predicate ip = ip.ip_content.tp_statement
 
 let translate_old_label s p =
   let get_label () =
@@ -1037,8 +1037,13 @@ and is_same_predicate pred1 pred2 =
   is_same_list Datatype.String.equal pred1.pred_name pred2.pred_name &&
   is_same_predicate_node pred1.pred_content pred2.pred_content
 
+
+and is_same_toplevel_predicate p1 p2 =
+  p1.tp_only_check = p2.tp_only_check &&
+  is_same_predicate p1.tp_statement p2.tp_statement
+
 and is_same_identified_predicate p1 p2 =
-  is_same_predicate p1.ip_content p2.ip_content
+  is_same_toplevel_predicate p1.ip_content p2.ip_content
 
 and is_same_identified_term l1 l2 =
   is_same_term l1.it_content l2.it_content
@@ -1142,12 +1147,12 @@ let is_same_extension x1 x2 =
 
 let is_same_code_annotation (ca1:code_annotation) (ca2:code_annotation) =
   match ca1.annot_content, ca2.annot_content with
-  | AAssert(l1,k1,p1), AAssert(l2,k2,p2) ->
-    is_same_list (=) l1 l2 && k1 = k2 && is_same_predicate p1 p2
+  | AAssert(l1,p1), AAssert(l2,p2) ->
+    is_same_list (=) l1 l2 && is_same_toplevel_predicate p1 p2
   | AStmtSpec (l1,s1), AStmtSpec (l2,s2) ->
     is_same_list (=) l1 l2 && is_same_spec s1 s2
   | AInvariant(l1,b1,p1), AInvariant(l2,b2,p2) ->
-    is_same_list (=) l1 l2 && b1 = b2 && is_same_predicate p1 p2
+    is_same_list (=) l1 l2 && b1 = b2 && is_same_toplevel_predicate p1 p2
   | AVariant v1, AVariant v2 -> is_same_variant v1 v2
   | AAssigns(l1,a1), AAssigns(l2,a2) ->
     is_same_list (=) l1 l2 && is_same_assigns a1 a2
@@ -1177,7 +1182,7 @@ let rec is_same_global_annotation ga1 ga2 =
     Dlemma(n2,ax2,labs2,typs2,st2,attr2,_) ->
     is_same_string n1 n2 && ax1 = ax2 &&
     is_same_list is_same_logic_label labs1 labs2 &&
-    is_same_list (=) typs1 typs2 && is_same_predicate st1 st2 &&
+    is_same_list (=) typs1 typs2 && is_same_toplevel_predicate st1 st2 &&
     is_same_attributes attr1 attr2
   | Dinvariant (li1,_), Dinvariant (li2,_) -> is_same_logic_info li1 li2
   | Dtype_annot (li1,_), Dtype_annot (li2,_) -> is_same_logic_info li1 li2
@@ -2170,10 +2175,10 @@ let lhost_c_type thost =
   | TResult ty -> ty
 
 let is_assert ca =
-  match ca.annot_content with AAssert (_, Assert, _) -> true | _ -> false
+  match ca.annot_content with AAssert (_, p) -> not p.tp_only_check | _ -> false
 
 let is_check ca =
-  match ca.annot_content with AAssert (_, Check, _) -> true | _ -> false
+  match ca.annot_content with AAssert (_, p) -> p.tp_only_check | _ -> false
 
 let is_contract ca =
   match ca.annot_content with AStmtSpec _ -> true | _ -> false
@@ -2217,7 +2222,7 @@ let is_loop_annot s =
 
 let is_trivial_annotation a =
   match a.annot_content with
-  | AAssert (_,_,a) -> is_trivially_true a
+  | AAssert (_,a) -> is_trivially_true a.tp_statement
   | APragma _ | AStmtSpec _ | AInvariant _ | AVariant _
   | AAssigns _| AAllocation _ | AExtended _
     -> false
diff --git a/src/kernel_services/ast_transformations/filter.ml b/src/kernel_services/ast_transformations/filter.ml
index caff6cef46efa2b4fe32181dfc5868163ff6509d..d36b2cf000fee0b47bff693060a297d72a290f9f 100644
--- a/src/kernel_services/ast_transformations/filter.ml
+++ b/src/kernel_services/ast_transformations/filter.ml
@@ -448,9 +448,12 @@ end = struct
           Printer.pp_code_annotation v;
         ChangeTo
           (Logic_const.new_code_annotation
-             (AAssert ([], Assert,
-                       { pred_name = []; pred_loc = Cil_datatype.Location.unknown;
-                         pred_content = Ptrue})))
+             (AAssert
+                ([],
+                 Logic_const.toplevel_predicate
+                   { pred_name = [];
+                     pred_loc = Cil_datatype.Location.unknown;
+                     pred_content = Ptrue})))
       end
 
     method private process_call is_init_call call_stmt lval _f args loc =
@@ -714,7 +717,8 @@ end = struct
 
     method private visit_pred p =
       Logic_const.new_predicate
-        (visitCilPredicate (self:>Cil.cilVisitor) p.ip_content)
+        (visitCilPredicate (self:>Cil.cilVisitor)
+           (Logic_const.pred_of_id_pred p))
 
     method private visit_identified_term t =
       let t' = visitCilTerm (self:>Cil.cilVisitor) t.it_content in
@@ -733,11 +737,15 @@ end = struct
     method! vbehavior b =
       let finfo = self#get_finfo () in
 
-      let pre_visible p =  Info.fun_precond_visible finfo p.ip_content in
+      let pre_visible p =
+        Info.fun_precond_visible finfo (Logic_const.pred_of_id_pred p)
+      in
       b.b_assumes <- filter_list pre_visible self#visit_pred b.b_assumes;
       b.b_requires <- filter_list pre_visible self#visit_pred b.b_requires;
 
-      let ensure_visible (_,p) = Info.fun_postcond_visible finfo p.ip_content in
+      let ensure_visible (_,p) =
+        Info.fun_postcond_visible finfo (Logic_const.pred_of_id_pred p)
+      in
       b.b_post_cond <-
         filter_list ensure_visible (fun (k,p) -> k,self#visit_pred p)
           b.b_post_cond;
@@ -785,7 +793,7 @@ end = struct
       let new_term = match spec.spec_terminates with
         | None -> None
         | Some p ->
-          if Info.fun_precond_visible finfo p.ip_content
+          if Info.fun_precond_visible finfo (Logic_const.pred_of_id_pred p)
           then Some (self#visit_pred p)
           else None
       in
diff --git a/src/kernel_services/ast_transformations/inline.ml b/src/kernel_services/ast_transformations/inline.ml
index b50798b0e70b5fa79be73f4ff36a9cd19e35fbc3..2c815da3e976eb9279ec522af5bb930e4f6ec7e9 100644
--- a/src/kernel_services/ast_transformations/inline.ml
+++ b/src/kernel_services/ast_transformations/inline.ml
@@ -260,6 +260,9 @@ let inliner functions_to_inline = object (self)
               (Extlib.the self#current_kf)
               callee return_aux args
           in
+          let fun_name = Kernel_function.get_name callee in
+          let new_attribute = (Attr (Cil.frama_c_inlined,[AStr fun_name])) in
+          block.battrs <- Cil.addAttribute new_attribute block.battrs;
           let skind =
             if needs_assign then begin
               match return_aux, return with
diff --git a/src/kernel_services/cmdline_parameters/cmdline.ml b/src/kernel_services/cmdline_parameters/cmdline.ml
index f3210b908e38ed557bf9ad55338e63c00aef6586..24d333957fdef3f060d7cf605429eee20f0bfcad 100644
--- a/src/kernel_services/cmdline_parameters/cmdline.ml
+++ b/src/kernel_services/cmdline_parameters/cmdline.ml
@@ -76,6 +76,7 @@ let journal_isset_ref = ref false
 let use_obj_ref = ref true
 let use_type_ref = ref true
 let deterministic = ref false
+let permissive = ref false
 
 let last_project_created_by_copy = ref (fun () -> assert false)
 
@@ -106,11 +107,11 @@ let get_backtrace () =
 
 let request_crash_report =
   Format.sprintf
-    "Please report as 'crash' at http://bts.frama-c.com/.\n\
+    "Please report as 'crash' at https://git.frama-c.com/pub/frama-c/issues\n\
      Your Frama-C version is %s.\n\
      Note that a version and a backtrace alone often do not contain enough\n\
      information to understand the bug. Guidelines for reporting bugs are at:\n\
-     http://bts.frama-c.com/dokuwiki/doku.php?id=mantis:frama-c:bug_reporting_guidelines\n"
+     https://git.frama-c.com/pub/frama-c/-/wikis/Guidelines-for-reporting-bugs\n"
     Fc_config.version_and_codename
 
 let protect = function
@@ -139,7 +140,8 @@ let protect = function
       let name = long_plugin_name p in
       Printf.sprintf
         "%s aborted: unimplemented feature.%s\n\
-         You may send a feature request at http://bts.frama-c.com with:\n\
+         You may send a feature request at \
+         https://git.frama-c.com/pub/frama-c/issues with:\n\
          '[%s] %s'."
         name (additional_info ()) name m
   | e ->
@@ -252,7 +254,11 @@ type option_setting =
   | Unit of (unit -> unit)
   | Int of (int -> unit)
   | String of (string -> unit)
-  | String_list of (string list -> unit)
+
+let option_setting_and_warn warn = function
+  | Unit f -> Unit (fun () -> warn (); f ())
+  | Int f -> Int (fun i -> warn (); f i)
+  | String f -> String (fun s -> warn (); f s)
 
 exception Cannot_parse of string * string
 let raise_error name because = raise (Cannot_parse(name, because))
@@ -263,6 +269,11 @@ let error name msg =
     "option `%s' %s.@\nuse `%s -help' for more information."
     name msg bin_name
 
+let warning name msg =
+  Kernel_log.warning
+    "option `%s' %s, ignoring. [-permissive]@\n"
+    name msg
+
 let all_options = match Array.to_list Sys.argv with
   | [] -> assert false
   | _binary :: l -> l
@@ -310,10 +321,6 @@ let parse known_options_list then_expected options_list =
             check_string_argname ();
             f arg;
             true
-        | String_list f ->
-            check_string_argname ();
-            f (Str.split (Str.regexp "[ \t]*,[ \t]*") arg);
-            true
       in
       unknown_options, use_arg && not explicit, true
     with Not_found ->
@@ -342,6 +349,9 @@ let parse known_options_list then_expected options_list =
         unknown_options, nb_used, Some (then_options, Replace)
     | "-then-on" :: project_name :: then_options when then_expected ->
         unknown_options, nb_used, Some (then_options, Name project_name)
+    | "-permissive" :: next_options ->
+      permissive := true;
+      go unknown_options nb_used next_options
     | option :: (arg :: next_options as arg_next) ->
         let unknown, use_arg, is_used =
           parse_one_option unknown_options option arg
@@ -385,6 +395,7 @@ let () =
         "-kernel-verbose", Int (fun n -> Kernel_verbose_level.set n);
         "-kernel-debug", Int (fun n -> Kernel_debug_level.set n);
         "-deterministic", Unit (fun () -> deterministic := true);
+        "-permissive", Unit (fun () -> permissive := true);
       ]
       false
       all_options
@@ -416,6 +427,7 @@ let journal_isset = !journal_isset_ref
 let use_obj = !use_obj_ref
 let use_type = !use_type_ref
 let deterministic = !deterministic
+let permissive = !permissive
 
 (* ************************************************************************* *)
 (** {2 Plugin} *)
@@ -441,7 +453,8 @@ module Plugin: sig
   val add_group: ?memo:bool -> plugin:string -> string -> string * bool
   val add_option: string -> group:string -> cmdline_option -> unit
   val add_aliases:
-    orig:string -> string -> group:string -> string list -> cmdline_option list
+    orig:string -> string -> group:string -> ?visible:bool -> ?deprecated:bool
+    -> string list -> cmdline_option list
   val replace_option_setting: 
     string -> plugin:string -> group:string -> option_setting -> unit
   val replace_option_help:
@@ -530,7 +543,7 @@ end = struct
   (* table name_of_the_original_option --> aliases *)
   let aliases_tbl = Hashtbl.create 7
 
-  let add_aliases ~orig shortname ~group names =
+  let add_aliases ~orig shortname ~group ?(visible=true) ?(deprecated=false) names =
     (* mostly inline [add_option] and perform additional actions *)
     let options_group = find_group shortname group in
     let option = List.find (fun o -> o.oname = orig) !options_group in
@@ -538,7 +551,19 @@ end = struct
       if name = "" then invalid_arg "empty alias name";
       Hashtbl.replace all_options name option;
       Option_names.add name true;
-      let alias = { option with oname = name } in
+      let setting =
+        if deprecated
+        then
+          let warn () =
+            Kernel_log.warning ~once:true
+              "@[%s is@ a deprecated alias@ for option %s.@ \
+               Please use %s instead.@]"
+              name option.oname option.oname
+          in
+          option_setting_and_warn warn option.setting
+        else option.setting
+      in
+      let alias = { option with oname = name; ovisible = visible; setting; } in
       options_group := alias :: !options_group;
       alias
     in
@@ -728,8 +753,8 @@ let add_option_without_action
       ohelp = help; ext_help = ext_help; ovisible = visible;
       setting = Unit (fun () -> assert false) }
 
-let add_aliases orig ~plugin ~group stage aliases =
-  let l = Plugin.add_aliases ~orig plugin ~group aliases in
+let add_aliases orig ~plugin ~group ?visible ?deprecated stage aliases =
+  let l = Plugin.add_aliases ~orig plugin ~group ?visible ?deprecated aliases in
   let add = match stage with
     | Early -> Early_Stage.add_for_parsing
     | Extending -> Extending_Stage.add_for_parsing
@@ -748,11 +773,19 @@ let use_cmdline_files = On_Files.extend
 
 let set_files used_loading l =
   Kernel_log.feedback ~dkey "setting files from command lines.";
-  List.iter
-    (fun s ->
-       if s = "" then error "" "has no name. What do you exactly have in mind?";
-       if s.[0] = '-' then error s "is unknown")
-    l;
+  let l =
+    List.fold_right
+      (fun s acc ->
+         if s = "" then
+           if permissive then (warning "" "has no name"; acc)
+           else error "" "has no name. What do you exactly have in mind?"
+         else if s.[0] = '-' then
+           if permissive then (warning s "is unknown"; acc)
+           else error s "is unknown"
+         else
+           s :: acc
+      ) l []
+  in
   assert
     (Kernel_log.verify
        (not (On_Files.is_empty ()))
@@ -896,7 +929,6 @@ let low_print_option_help fmt print_invisible o =
         | Unit _ -> ""
         | Int _ -> " <n>"
         | String _ -> " <s>"
-        | String_list _ -> " <s1, ..., sn>"
       else
         " <" ^ s ^ ">"
     in
@@ -905,7 +937,8 @@ let low_print_option_help fmt print_invisible o =
       print_helpline fmt (name ^ ty) o.ohelp o.ext_help;
       List.iter
         (fun o ->
-           print_helpline fmt (o.oname ^ ty) ("alias for option " ^ name) "")
+           if print_invisible || o.ovisible then
+             print_helpline fmt (o.oname ^ ty) ("alias for option " ^ name) "")
         (Plugin.find_option_aliases o)
     end;
     true
@@ -1042,42 +1075,6 @@ let list_plugins () =
     end ;
   raise Exit
 
-let list_all_plugin_options ~print_invisible =
-  Log.print_on_output
-    begin fun fmt ->
-      let of_name s =
-        if s = "" then (if Unix.isatty Unix.stdout then
-                          "\x1b[31mNO NAME\x1b[0m" else "NO NAME")
-        else s
-      in
-      let print_cmdline_option fmt (c:cmdline_option) =
-        if print_invisible || c.ovisible then
-          Format.fprintf fmt "@[<v>Name: %s@]" c.oname
-        else
-          Format.ifprintf fmt "@[<v>Name: %s@]" c.oname
-      in
-      let print_cmdline_option_list fmt cs =
-        (Pretty_utils.pp_list ~pre:"@[<v>" ~suf:"@]" ~sep:"@;"
-           print_cmdline_option) fmt (sort_cmdline_options cs)
-      in
-      let print_groups fmt gs =
-        let sorted_gs = sort_groups gs in
-        (Pretty_utils.pp_list
-           ~pre:"@[<v>" ~sep:"@;" ~suf:"@]"
-           (Pretty_utils.pp_pair ~pre:"@[<v 2>" ~suf:"@]" ~sep:"@;"
-              (fun fmt name -> Format.pp_print_string fmt (of_name name))
-              (fun fmt p -> print_cmdline_option_list fmt !p))) fmt sorted_gs
-      in
-      let print_plugin fmt p =
-        Format.fprintf fmt "@[<v 2>Name: %s@;%a@]"
-          p.Plugin.name print_groups p.Plugin.groups
-      in
-      Format.fprintf fmt "%a@."
-        (Pretty_utils.pp_list ~pre:"@[<v>" ~suf:"@]" ~sep:"@;" print_plugin)
-        (Plugin.all_plugins ())
-    end;
-  raise Exit
-
 (* ************************************************************************* *)
 (** {3 Explain}
 
diff --git a/src/kernel_services/cmdline_parameters/cmdline.mli b/src/kernel_services/cmdline_parameters/cmdline.mli
index e90f49af9605d478eeadf0a6fc519e3423aabdc7..5c3c75356662ba186d2b0f8971194a4e7698e821 100644
--- a/src/kernel_services/cmdline_parameters/cmdline.mli
+++ b/src/kernel_services/cmdline_parameters/cmdline.mli
@@ -239,11 +239,6 @@ val list_plugins: unit -> exit
   (** Display the list of installed plug-ins 
       @since Magnesium-20151001 *)
 
-(** Display the list of all installed plug-ins and their options, in
-    a condensed format. Used for zsh autocompletion.
-    @since Phosphorus-20170501-beta1 *)
-val list_all_plugin_options : print_invisible:bool -> exit
-
 val explain_cmdline : unit -> exit
 
 val plugin_help: string -> exit
@@ -270,7 +265,6 @@ type option_setting =
   | Unit of (unit -> unit)
   | Int of (int -> unit)
   | String of (string -> unit)
-  | String_list of (string list -> unit)
 
 val add_option:
   string ->
@@ -314,13 +308,18 @@ val add_aliases:
   string ->
   plugin:string ->
   group:Group.t ->
+  ?visible: bool ->
+  ?deprecated: bool ->
   stage ->
   string list ->
   unit
 (** [add_aliases orig plugin group aliases] adds a list of aliases to the given
     option name [orig].
+    If [visible] is set to false, the aliases do not appear in help messages.
+    If [deprecated] is set to true, the use of the aliases emits a warning.
     @Invalid_argument if an alias name is the empty string
-    @since Carbon-20110201 *)
+    @since Carbon-20110201
+    @modify Frama-c+dev add [visible] and [deprecated] arguments. *)
 
 val replace_option_setting: 
   string -> plugin:string -> group:Group.t -> option_setting -> unit
@@ -392,6 +391,13 @@ val deterministic: bool
       are acceptable, as reproducibility is more important.
       @since Aluminium-20160501 *)
 
+val permissive: bool
+  (** Downgrades some command-line errors to warnings, such as
+      unknown option names and invalid values for some options
+      (e.g. non-existent function names).
+
+      @since Frama-C+dev *)
+
 val last_project_created_by_copy: (unit -> string option) ref
 
 val load_all_plugins: (unit -> unit) ref
diff --git a/src/kernel_services/cmdline_parameters/parameter_builder.ml b/src/kernel_services/cmdline_parameters/parameter_builder.ml
index 533be6968e7c37f0b8e0eb30919a465623537770..80881489f15e2a298c73e0f316f432f1a9c5ec6b 100644
--- a/src/kernel_services/cmdline_parameters/parameter_builder.ml
+++ b/src/kernel_services/cmdline_parameters/parameter_builder.ml
@@ -70,8 +70,8 @@ let force_ast_compute
 (** {2 Specific functors} *)
 (* ************************************************************************* *)
 
-let iter_on_this_parameter stage =
-  match !Parameter_customize.do_iterate_ref, stage with
+let is_parameter_reconfigurable stage =
+  match !Parameter_customize.is_reconfigurable_ref, stage with
   | Some false, _
   | None, (Cmdline.Early | Cmdline.Extending | Cmdline.Extended
           | Cmdline.Exiting | Cmdline.Loading) ->
@@ -96,17 +96,15 @@ struct
   let parameters_ref : Typed_parameter.t list ref = ref []
   let parameters () = !parameters_ref
 
-  let add_parameter group stage param =
-    if iter_on_this_parameter stage then begin
-      parameters_ref := param :: !parameters_ref;
-      let parameter_groups = P.parameters in
-      try
-        let group_name = Cmdline.Group.name group in
-        let parameters = Hashtbl.find P.parameters group_name in
-        Hashtbl.replace parameter_groups group_name (param :: parameters)
-      with Not_found ->
-        assert false
-    end
+  let add_parameter group _stage param =
+    parameters_ref := param :: !parameters_ref;
+    let parameter_groups = P.parameters in
+    try
+      let group_name = Cmdline.Group.name group in
+      let parameters = Hashtbl.find P.parameters group_name in
+      Hashtbl.replace parameter_groups group_name (param :: parameters)
+    with Not_found ->
+      assert false
 
   (* ************************************************************************ *)
   (** {3 Bool} *)
@@ -212,8 +210,10 @@ struct
              add_set_hook = add_set_hook; add_update_hook = add_update_hook },
            negative_option)
       in
+      let reconfigurable = is_parameter_reconfigurable stage in
       let p =
-        Typed_parameter.create ~name ~help:X.help ~accessor:accessor ~is_set
+        Typed_parameter.create ~name ~help:X.help ~accessor:accessor
+          ~visible:is_visible ~reconfigurable ~is_set
       in
       add_parameter !Parameter_customize.group_ref stage p;
       Parameter_customize.reset ();
@@ -223,14 +223,15 @@ struct
           ~plugin X.option_name Typed_parameter.ty ~journalize:false p
       else p
 
-    let add_aliases list =
-      add_aliases list;
+    let add_aliases ?visible ?deprecated list =
+      add_aliases ?visible ?deprecated list;
       match !negative_option_ref with
       | None -> ()
       | Some negative_option ->
         let negative_list = List.map negate_name list in
         let plugin = P.shortname in
-        Cmdline.add_aliases negative_option ~plugin ~group stage negative_list
+        Cmdline.add_aliases
+          negative_option ~plugin ~group ?visible ?deprecated stage negative_list
 
   end
 
@@ -317,8 +318,10 @@ struct
              add_set_hook = add_set_hook; add_update_hook = add_update_hook },
            get_range)
       in
+      let reconfigurable = is_parameter_reconfigurable stage in
       let p =
-        Typed_parameter.create ~name ~help:X.help ~accessor ~is_set:is_set
+        Typed_parameter.create ~name ~help:X.help ~accessor
+          ~visible:is_visible ~reconfigurable ~is_set:is_set
       in
       add_parameter !Parameter_customize.group_ref stage p;
       add_option X.option_name;
@@ -424,8 +427,10 @@ struct
              add_set_hook = add_set_hook; add_update_hook = add_update_hook },
            get_possible_values)
       in
+      let reconfigurable = is_parameter_reconfigurable stage in
       let p =
-        Typed_parameter.create ~name ~help:X.help ~accessor ~is_set
+        Typed_parameter.create ~name ~help:X.help ~accessor
+          ~visible:is_visible ~reconfigurable ~is_set
       in
       add_parameter !Parameter_customize.group_ref stage p;
       add_option X.option_name;
@@ -512,8 +517,10 @@ struct
              add_update_hook = parameter_add_update_hook },
            fun () -> [])
       in
+      let reconfigurable = is_parameter_reconfigurable stage in
       let p =
-        Typed_parameter.create ~name ~help:X.help ~accessor ~is_set
+        Typed_parameter.create ~name ~help:X.help ~accessor
+          ~visible:is_visible ~reconfigurable ~is_set
       in
       add_parameter !Parameter_customize.group_ref stage p;
       add_option X.option_name;
@@ -1030,7 +1037,7 @@ struct
       if must_exist then
         error s
       else
-      if !Parameter_customize.is_permissive_ref then begin
+      if Cmdline.permissive then begin
         P.L.warning "ignoring non-existing function%s '%s'."
           specific_msg s;
         set
@@ -1719,8 +1726,8 @@ struct
         f ();
       end
 
-    let add_aliases list =
-      add_aliases list;
+    let add_aliases ?visible ?deprecated list =
+      add_aliases ?visible ?deprecated list;
       Output.add_aliases (List.map (fun alias -> alias ^ "-print") list)
 
   end
diff --git a/src/kernel_services/cmdline_parameters/parameter_customize.ml b/src/kernel_services/cmdline_parameters/parameter_customize.ml
index 9781ec098dc28cec951d5b2ddbe749758700f7d3..456dae219a15c6f38969ed908b003ba67619ccc8 100644
--- a/src/kernel_services/cmdline_parameters/parameter_customize.ml
+++ b/src/kernel_services/cmdline_parameters/parameter_customize.ml
@@ -81,20 +81,18 @@ let argument_must_be_existing_fun () =
 let group_ref = ref Cmdline.Group.default
 let set_group s = group_ref := s
 
-let do_iterate_ref = ref None
-let do_iterate () = do_iterate_ref := Some true
-let do_not_iterate () = do_iterate_ref := Some false
+let is_reconfigurable_ref = ref None
+let is_reconfigurable () = is_reconfigurable_ref := Some true
+let is_not_reconfigurable () = is_reconfigurable_ref := Some false
 
 let is_visible_ref = ref true
 let is_invisible () =
   is_visible_ref := false;
-  do_not_iterate ()
+  is_not_reconfigurable ()
 
 let use_category_ref = ref true
 let no_category () = use_category_ref := false
 
-let is_permissive_ref = ref false
-
 let find_kf_by_name: (string -> Cil_types.kernel_function) ref =
   Extlib.mk_fun "Parameter_customize.find_kf_by_name"
 
@@ -126,7 +124,7 @@ let reset () =
   must_save_ref := true;
   module_name_ref := empty_string;
   group_ref := Cmdline.Group.default;
-  do_iterate_ref := None;
+  is_reconfigurable_ref := None;
   is_visible_ref := true;
   argument_is_function_name_ref := false;
   argument_may_be_fundecl_ref := false;
diff --git a/src/kernel_services/cmdline_parameters/parameter_customize.mli b/src/kernel_services/cmdline_parameters/parameter_customize.mli
index f919786877fadc98dfb96c4f1e0865df2dc1dd41..49e2f1433d6c778fb4c6d10de01a67bb6eb23032 100644
--- a/src/kernel_services/cmdline_parameters/parameter_customize.mli
+++ b/src/kernel_services/cmdline_parameters/parameter_customize.mli
@@ -90,7 +90,8 @@ val set_group: Cmdline.Group.t -> unit
       @since Beryllium-20090901 *)
 
 val is_invisible: unit -> unit
-(** Prevent the help to list the parameter. Also imply {!do_not_iterate}.
+(** Prevent -help from listing the parameter.
+    Also imply {!is_not_reconfigurable}.
     @since Carbon-20101201
     @modify Nitrogen-20111001 does not appear in the help *)
 
@@ -123,17 +124,21 @@ val argument_must_be_existing_fun: unit -> unit
     unset, names of defined-only functions will raise an error as well.
     @since Sodium-20150201 *)
 
-val do_iterate: unit -> unit
-(** Ensure that {!iter_on_plugins} is applied to this parameter. By default
+val is_reconfigurable: unit -> unit
+(** Ensure that the GUI will show this parameter. By default
     only parameters corresponding to options registered at the
-    {!Cmdline.Configuring} stage are iterable.
-    @since Nitrogen-20111001 *)
+    {!Cmdline.Configuring} stage are reconfigurable.
+    @since Nitrogen-20111001
+    @modify Frama-C+dev [do_iterate] renamed to [is_reconfigurable]
+*)
 
-val do_not_iterate: unit -> unit
-(** Prevent {!iter_on_plugins} to be applied on the parameter. By default, only
+val is_not_reconfigurable: unit -> unit
+(** Prevent the GUI from showing this parameter. By default, only
     parameters corresponding to options registered at the
-    {!Cmdline.Configuring} stage are iterable.
-    @since Nitrogen-20111001 *)
+    {!Cmdline.Configuring} stage are reconfigurable.
+    @since Nitrogen-20111001
+    @modify Frama-C+dev [do_iterate] renamed to [is_reconfigurable]
+ *)
 
 val no_category: unit -> unit
 (** Prevent a collection parameter to use categories and the extension '+', and
@@ -143,11 +148,6 @@ val no_category: unit -> unit
     @since Sodium-20150201
  *)
 
-val is_permissive_ref: bool ref
-(** if [true], less checks are performed on value of arguments.
-    Set by {!Kernel.Permissive} option
- *)
-
 (* ************************************************************************* *)
 (** {2 Function names} *)
 (* ************************************************************************* *)
@@ -211,7 +211,7 @@ val argument_may_be_fundecl_ref: bool ref
 val argument_must_be_fundecl_ref: bool ref
 val argument_must_be_existing_fun_ref: bool ref
 val group_ref: Cmdline.Group.t ref
-val do_iterate_ref: bool option ref
+val is_reconfigurable_ref: bool option ref
 val is_visible_ref: bool ref
 val module_name_ref: string ref
 val use_category_ref: bool ref
diff --git a/src/kernel_services/cmdline_parameters/parameter_sig.ml b/src/kernel_services/cmdline_parameters/parameter_sig.ml
index 9ab4f1cca7e940a4f2b0cc4ca127f70c19a78f68..89a439f71b324967ac4c0775bf8eaf4587a86af8 100644
--- a/src/kernel_services/cmdline_parameters/parameter_sig.ml
+++ b/src/kernel_services/cmdline_parameters/parameter_sig.ml
@@ -179,10 +179,13 @@ module type S_no_parameter = sig
 
   val equal: t -> t -> bool
 
-  val add_aliases: string list -> unit
+  val add_aliases: ?visible: bool -> ?deprecated:bool -> string list -> unit
   (** Add some aliases for this option. That is other option names which have
       exactly the same semantics that the initial option.
-      @raise Invalid_argument if one of the strings is empty *)
+      If [visible] is set to false, the aliases do not appear in help messages.
+      If [deprecated] is set to true, the use of the aliases emits a warning.
+      @raise Invalid_argument if one of the strings is empty
+      @modify Frama-c+dev add [visible] and [deprecated] arguments. *)
 
   (**/**)
   val is_set: unit -> bool
diff --git a/src/kernel_services/cmdline_parameters/parameter_state.ml b/src/kernel_services/cmdline_parameters/parameter_state.ml
index a61ea576898dec21a9e3a700a6231b9967de394e..8941eec275878ca1c8a2910fbc536089dd161f2a 100644
--- a/src/kernel_services/cmdline_parameters/parameter_state.ml
+++ b/src/kernel_services/cmdline_parameters/parameter_state.ml
@@ -270,8 +270,9 @@ struct
 
   let option_name = X.option_name
 
-  let add_aliases = 
-    Cmdline.add_aliases option_name ~plugin:P.shortname ~group stage
+  let add_aliases ?visible ?deprecated =
+    Cmdline.add_aliases
+      option_name ~plugin:P.shortname ~group stage ?visible ?deprecated
 
   let print_help fmt =
     Cmdline.print_option_help fmt ~plugin:P.shortname ~group option_name
diff --git a/src/kernel_services/cmdline_parameters/typed_parameter.ml b/src/kernel_services/cmdline_parameters/typed_parameter.ml
index 92429eec2cb1a28388d784e9da503c02c408f12c..581fe62fbf8756b730889f4167bb9310c834851d 100644
--- a/src/kernel_services/cmdline_parameters/typed_parameter.ml
+++ b/src/kernel_services/cmdline_parameters/typed_parameter.ml
@@ -36,7 +36,9 @@ type typed_accessor =
 type parameter = 
     { name: string; 
       help: string; 
-      accessor: typed_accessor; 
+      accessor: typed_accessor;
+      visible: bool;
+      reconfigurable: bool;
       is_set: unit -> bool }
 
 include
@@ -56,6 +58,8 @@ include
                  add_set_hook = (fun _ -> ());
 		 add_update_hook = (fun _ -> ()) },
                None);
+            visible = false ;
+            reconfigurable = false ;
             is_set = fun () -> false }
         ]
       let equal = (==)
@@ -71,8 +75,8 @@ include
 
 let parameters = Datatype.String.Hashtbl.create 97
   
-let create ~name ~help ~accessor ~is_set = 
-  let p = { name = name; help = help; accessor = accessor; is_set = is_set } in
+let create ~name ~help ~accessor ~visible ~reconfigurable ~is_set =
+  let p = { name; help; accessor; visible; reconfigurable; is_set } in
   (* parameter name unicity already checks in [Plugin]. *)
   assert (not (Datatype.String.Hashtbl.mem parameters name));
   Datatype.String.Hashtbl.add parameters name p;
diff --git a/src/kernel_services/cmdline_parameters/typed_parameter.mli b/src/kernel_services/cmdline_parameters/typed_parameter.mli
index 35117db7c005009230504c8fe0144a386d60b469..28fafe6d94b701c16f25e1b9cf7d4f0daa9bcc3f 100644
--- a/src/kernel_services/cmdline_parameters/typed_parameter.mli
+++ b/src/kernel_services/cmdline_parameters/typed_parameter.mli
@@ -45,6 +45,8 @@ type parameter = private
       help: string; (** Help message *)
       accessor: typed_accessor; (** How to get and set the value of the
 				    parameter *)
+      visible: bool; (** Is visible to the user, e.g. in the command-line help *)
+      reconfigurable: bool; (** Can be reconfigured, e.g. in the GUI *)
       is_set: unit -> bool (** Is this option really set? *) }
 
 include Datatype.S_with_collections with type t = parameter
@@ -61,6 +63,8 @@ val create:
   name:string -> 
   help:string -> 
   accessor:typed_accessor ->
+  visible:bool ->
+  reconfigurable:bool ->
   is_set: (unit -> bool) ->
   t
 (**/**)
diff --git a/src/kernel_services/parsetree/cabshelper.mli b/src/kernel_services/parsetree/cabshelper.mli
index a4b0498146e4bce7b14fa47a60c7adf8d615981e..458c01febc4a9f2eb6b482b78cd1d48e7dda3ab8 100644
--- a/src/kernel_services/parsetree/cabshelper.mli
+++ b/src/kernel_services/parsetree/cabshelper.mli
@@ -80,8 +80,9 @@ val is_attr_test: unit -> bool
 val mk_behavior :
   ?name:string ->
   ?assumes:Logic_ptree.lexpr list ->
-  ?requires:Logic_ptree.lexpr list ->
-  ?post_cond:(Cil_types.termination_kind * Logic_ptree.lexpr) list ->
+  ?requires:Logic_ptree.toplevel_predicate list ->
+  ?post_cond:
+    (Cil_types.termination_kind * Logic_ptree.toplevel_predicate) list ->
   ?assigns:Logic_ptree.assigns ->
   ?allocation:Logic_ptree.allocation ->
   ?extended:Logic_ptree.extension list ->
diff --git a/src/kernel_services/parsetree/logic_ptree.ml b/src/kernel_services/parsetree/logic_ptree.ml
index adde2634144cb07084ca310b5ea944ea7ed119c8..bff3332bb8dff7075b6aedd448b7caecbfb70469 100644
--- a/src/kernel_services/parsetree/logic_ptree.ml
+++ b/src/kernel_services/parsetree/logic_ptree.ml
@@ -161,6 +161,7 @@ and lexpr_node =
   | PLrepeat of lexpr * lexpr
       (** repeat a list of elements a number of times. *)
 
+type toplevel_predicate = { tp_only_check: bool; tp_statement: lexpr }
 
 type extension = string * lexpr list
 
@@ -231,7 +232,7 @@ and decl_node =
         (** [LDinductive_def(name,labels,type_params, parameters, indcases)]
             represents an inductive definition of a new predicate.
          *)
-  | LDlemma of string * bool * string list * string list * lexpr
+  | LDlemma of string * bool * string list * string list * toplevel_predicate
       (** LDlemma(name,is_axiom,labels,type_params,property) represents
           a lemma or an axiom [name].
           [is_axiom] is true for an axiom and false for a lemma. [labels]
@@ -276,9 +277,11 @@ and variant = lexpr * string option
     with {!Cil_types.behavior}. *)
 type behavior = {
   mutable b_name : string; (** name of the behavior. *)
-  mutable b_requires : lexpr list; (** require clauses. *)
+  mutable b_requires : toplevel_predicate list; (** require clauses. *)
   mutable b_assumes : lexpr list; (** assume clauses. *)
-  mutable b_post_cond : (Cil_types.termination_kind * lexpr) list; (** post-condition. *)
+  mutable b_post_cond :
+    (Cil_types.termination_kind * toplevel_predicate) list;
+  (** post-condition. *)
   mutable b_assigns : assigns; (** assignments. *)
   mutable b_allocation : allocation; (** frees, allocates. *)
   mutable b_extended : extension list (** extensions *)
@@ -329,13 +332,10 @@ and pragma =
   | Slice_pragma of slice_pragma
   | Impact_pragma of impact_pragma
 
-and assertion_kind = Assert | Check
-
-
 (** all annotations that can be found in the code. This type shares the name of
     its constructors with {!Cil_types.code_annotation_node}. *)
 type code_annot =
-  | AAssert of string list * assertion_kind * lexpr
+  | AAssert of string list * toplevel_predicate
   (** assertion to be checked. The list of strings is the list of
       behaviors to which this assertion applies. *)
 
@@ -343,7 +343,7 @@ type code_annot =
   (** statement contract
       (potentially restricted to some enclosing behaviors). *)
 
-  | AInvariant of string list * bool * lexpr
+  | AInvariant of string list * bool * toplevel_predicate
   (** loop/code invariant. The list of strings is the list of behaviors to which
       this invariant applies.  The boolean flag is true for normal loop
       invariants and false for invariant-as-assertions. *)
diff --git a/src/kernel_services/plugin_entry_points/db.mli b/src/kernel_services/plugin_entry_points/db.mli
index 360b783ab48f9316db4ab3ffdc0212aa2e7e2f76..30c474f13e54fc9f343a44f0492a507f23476459 100644
--- a/src/kernel_services/plugin_entry_points/db.mli
+++ b/src/kernel_services/plugin_entry_points/db.mli
@@ -1317,8 +1317,7 @@ module Operational_inputs : sig
   val get_internal_precise: (?stmt:stmt -> kernel_function -> Inout_type.t) ref
     (** More precise version of [get_internal] function. If [stmt] is
         specified, and is a possible call to the given kernel_function,
-        returns the operational inputs for this call (if option -inout-callwise
-        has been set). *)
+        returns the operational inputs for this call. *)
 
 (**/**)
     (* Internal use *)
diff --git a/src/kernel_services/plugin_entry_points/kernel.ml b/src/kernel_services/plugin_entry_points/kernel.ml
index 5402977b89ee2ae8f19028fe6015c61c7c522784..d042cacf5d5569d50b78e4cceb09ab119e8f3c8d 100644
--- a/src/kernel_services/plugin_entry_points/kernel.ml
+++ b/src/kernel_services/plugin_entry_points/kernel.ml
@@ -25,6 +25,7 @@
 (* ************************************************************************* *)
 
 module CamlString = String
+module FcPlugin = Plugin
 
 let () = Plugin.register_kernel ()
 
@@ -420,17 +421,29 @@ let () = Parameter_customize.set_cmdline_stage Cmdline.Exiting
 let () = Parameter_customize.do_not_journalize ()
 let () = Parameter_customize.set_negative_option_name ""
 module AutocompleteHelp =
-  False
+  P.String_set
     (struct
       let option_name = "-autocomplete"
-      let help = "displays all plugin options. Used for zsh autocompletion"
-      let module_name = "AutocompleteHelp"
+      let arg_name = "p1,p2,..."
+      let help = "displays all Frama-C options, used for shell autocompletion. \
+                  Prints options for the specified plugin names (or '@all' for \
+                  all plugins). Note: for the kernel, use an empty string."
+    end)
+
+let _ =
+  AutocompleteHelp.Category.enable_all
+    []
+    (object
+      method fold: 'a. (string -> 'a -> 'a) -> 'a -> 'a =
+        fun f acc ->
+        FcPlugin.fold_on_plugins (fun p acc -> f p.FcPlugin.p_shortname acc) acc
+      method mem name =
+        try
+          FcPlugin.iter_on_plugins
+            (fun p -> if name = p.FcPlugin.p_shortname then raise Exit);
+          false
+        with Exit -> true
     end)
-let run_list_all_plugin_options () =
-  if AutocompleteHelp.get () then
-    Cmdline.list_all_plugin_options ~print_invisible:true
-  else Cmdline.nop
-let () = Cmdline.run_after_exiting_stage run_list_all_plugin_options
 
 let () = Parameter_customize.set_group help
 let () = Parameter_customize.set_cmdline_stage Cmdline.Extending
@@ -460,7 +473,7 @@ let () = Parameter_customize.set_group messages
 let () = Parameter_customize.do_not_projectify ()
 let () = Parameter_customize.do_not_journalize ()
 let () = Parameter_customize.set_cmdline_stage Cmdline.Early
-let () = Parameter_customize.do_iterate ()
+let () = Parameter_customize.is_reconfigurable ()
 module GeneralVerbose =
   Int
     (struct
@@ -482,7 +495,7 @@ let () = Parameter_customize.set_group messages
 let () = Parameter_customize.do_not_projectify ()
 let () = Parameter_customize.do_not_journalize ()
 let () = Parameter_customize.set_cmdline_stage Cmdline.Early
-let () = Parameter_customize.do_iterate ()
+let () = Parameter_customize.is_reconfigurable ()
 module GeneralDebug =
   Zero
     (struct
@@ -506,7 +519,7 @@ let () =
 let () = Parameter_customize.set_group messages
 let () = Parameter_customize.set_negative_option_name ""
 let () = Parameter_customize.set_cmdline_stage Cmdline.Early
-let () = Parameter_customize.do_iterate ()
+let () = Parameter_customize.is_reconfigurable ()
 let () = Parameter_customize.do_not_projectify ()
 let () = Parameter_customize.do_not_journalize ()
 module Quiet =
@@ -521,23 +534,6 @@ let () =
   Quiet.add_set_hook
     (fun _ b -> assert b; GeneralVerbose.set 0; GeneralDebug.set 0)
 
-let () = Parameter_customize.set_group messages
-let () = Parameter_customize.set_cmdline_stage Cmdline.Early
-let () = Parameter_customize.do_not_projectify ()
-let () = Parameter_customize.do_not_journalize ()
-module Permissive =
-  Bool
-    (struct
-      let default = !Parameter_customize.is_permissive_ref
-      let option_name = "-permissive"
-      let module_name = "Permissive"
-      let help =
-        "performs less verification on validity of command-line options"
-    end)
-let () =
-  Permissive.add_set_hook
-    (fun _ b -> Parameter_customize.is_permissive_ref := b)
-
 let () = Parameter_customize.set_group messages
 let () = Parameter_customize.set_cmdline_stage Cmdline.Extended
 let () = Parameter_customize.do_not_journalize ()
@@ -1016,6 +1012,17 @@ module CppGnuLike =
          have pre-processing issues with a custom pre-processor."
     end)
 
+let () = Parameter_customize.set_group parsing
+let () = Parameter_customize.do_not_reset_on_copy ()
+module PrintCppCommands =
+  False
+    (struct
+      let module_name = "PrintCppCommands"
+      let option_name = "-print-cpp-commands"
+      let help = "prints the preprocessing command(s) used by Frama-C \
+                  and exits."
+    end)
+
 let () = Parameter_customize.set_group parsing
 let () = Parameter_customize.do_not_reset_on_copy ()
 module FramaCStdLib =
@@ -1124,12 +1131,12 @@ module C11 =
 let () = Parameter_customize.set_group parsing
 let () = Parameter_customize.do_not_reset_on_copy ()
 module JsonCompilationDatabase =
-  String
+  P.Filepath
     (struct
-      let module_name = "JsonCompilationDatabase"
       let option_name = "-json-compilation-database"
-      let default = ""
       let arg_name = "path"
+      let file_kind = "directory or json"
+      let existence = Filepath.Must_exist
       let help =
         "when set, preprocessing of each file will include corresponding \
          flags (e.g. -I, -D) from the JSON compilation database \
@@ -1653,11 +1660,48 @@ let () =
        Project.Datatype.Set.iter (fun project -> Project.remove ~project ()) s)
 
 (* ************************************************************************* *)
-(** {2 Others options} *)
+(** {2 Checks} *)
+(* ************************************************************************* *)
+
+let checks = add_group "Checks"
+
+let () = Parameter_customize.set_group checks
+let () = Parameter_customize.do_not_projectify ()
+let () = Parameter_customize.do_not_reset_on_copy ()
+module Check =
+  False(struct
+    let option_name = "-check"
+    let module_name = "Check"
+    let help = "performs consistency checks over the Abstract Syntax \
+                Tree"
+  end)
+
+let () = Parameter_customize.set_group checks
+let () = Parameter_customize.do_not_projectify ()
+module Copy =
+  False(struct
+    let option_name = "-copy"
+    let module_name = "Copy"
+    let help =
+      "always perform a copy of the original AST before analysis begin"
+  end)
+
+let () = Parameter_customize.set_group checks
+let () = Parameter_customize.do_not_projectify ()
+let () = Parameter_customize.set_negative_option_name ""
+module TypeCheck =
+  True(struct
+    let module_name = "TypeCheck"
+    let option_name = "-typecheck"
+    let help = "forces typechecking of the source files"
+  end)
+
+(* ************************************************************************* *)
+(** {2 Other options} *)
 (* ************************************************************************* *)
 
 [@@@warning "-60"]
-(* Warning this three options are parsed and used directly from Cmdline *)
+(* Warning: these options are parsed and used directly from Cmdline *)
 
 let () = Parameter_customize.set_negative_option_name ""
 let () = Parameter_customize.set_cmdline_stage Cmdline.Early
@@ -1695,41 +1739,20 @@ module Deterministic =
       let help = ""
     end)
 
-[@@@warning "+60"]
-
-(* ************************************************************************* *)
-(** {2 Checks} *)
-(* ************************************************************************* *)
-
-let checks = add_group "Checks"
-
-let () = Parameter_customize.set_group checks
-let () = Parameter_customize.do_not_reset_on_copy ()
-module Check =
-  False(struct
-    let option_name = "-check"
-    let module_name = "Check"
-    let help = "performs consistency checks over the Abstract Syntax \
-                Tree"
-  end)
-
-let () = Parameter_customize.set_group checks
-module Copy =
-  False(struct
-    let option_name = "-copy"
-    let module_name = "Copy"
-    let help =
-      "always perform a copy of the original AST before analysis begin"
-  end)
-
 let () = Parameter_customize.set_group checks
+let () = Parameter_customize.do_not_projectify ()
 let () = Parameter_customize.set_negative_option_name ""
-module TypeCheck =
-  True(struct
-    let module_name = "TypeCheck"
-    let option_name = "-typecheck"
-    let help = "forces typechecking of the source files"
-  end)
+let () = Parameter_customize.set_cmdline_stage Cmdline.Early
+module Permissive =
+  False
+    (struct
+      let module_name = "Permissive"
+      let option_name = "-permissive"
+      let help =
+        "perform less verifications on validity of command-line options"
+    end)
+
+[@@@warning "+60"]
 
 (*
 Local Variables:
diff --git a/src/kernel_services/plugin_entry_points/kernel.mli b/src/kernel_services/plugin_entry_points/kernel.mli
index 1a79a063bcccf19f424e65cd849fe2f881c7f838..33ca7c164f58687e2d998762d3b0108f4ea5f14f 100644
--- a/src/kernel_services/plugin_entry_points/kernel.mli
+++ b/src/kernel_services/plugin_entry_points/kernel.mli
@@ -233,6 +233,9 @@ module PrintLib: Parameter_sig.Bool
 module PrintPluginPath: Parameter_sig.Bool
 (** Behavior of option "-print-plugin-path" *)
 
+module AutocompleteHelp: Parameter_sig.String_set
+(** Behavior of option "-autocomplete" *)
+
 (* ************************************************************************* *)
 (** {2 Output Messages} *)
 (* ************************************************************************* *)
@@ -246,6 +249,9 @@ module GeneralDebug: Parameter_sig.Int
 module Quiet: Parameter_sig.Bool
 (** Behavior of option "-quiet" *)
 
+module Permissive: Parameter_sig.Bool
+(** Behavior of option "-permissive" *)
+
 (** @plugin development guide *)
 module Unicode: sig
   include Parameter_sig.Bool
@@ -394,6 +400,9 @@ module CppExtraArgsPerFile: Parameter_sig.Filepath_map with type value = string
 module CppGnuLike: Parameter_sig.Bool
 (** Behavior of option "-cpp-frama-c-compliant" *)
 
+module PrintCppCommands: Parameter_sig.Bool
+(** Behavior of option "-print-cpp-commands" *)
+
 module FramaCStdLib: Parameter_sig.Bool
 (** Behavior of option "-frama-c-stdlib" *)
 
@@ -465,7 +474,7 @@ module ImplicitFunctionDeclaration: Parameter_sig.String
 module C11: Parameter_sig.Bool
 (** Behavior of option "-c11" *)
 
-module JsonCompilationDatabase: Parameter_sig.String
+module JsonCompilationDatabase: Parameter_sig.Filepath
 (** Behavior of option "-json-compilation-database" *)
 
 (* ************************************************************************* *)
diff --git a/src/kernel_services/plugin_entry_points/log.ml b/src/kernel_services/plugin_entry_points/log.ml
index d40ae03aa1d0dff04bf3a7e4b7e9930d0989ff29..aae66eac586ef30524b4a062ecc16adb150dd63e 100644
--- a/src/kernel_services/plugin_entry_points/log.ml
+++ b/src/kernel_services/plugin_entry_points/log.ml
@@ -71,7 +71,7 @@ type terminal = {
   mutable delayed : (terminal -> unit) list ;
   mutable output : string -> int -> int -> unit ;
   (* Same as Format.make_formatter *)
-  mutable flush : unit -> unit ;  
+  mutable flush : unit -> unit ;
   (* Same as Format.make_formatter *)
 }
 
@@ -90,7 +90,7 @@ let is_ready t =
   | Locked | DelayedLock -> false
   | Ready -> true
 
-let term_clean t = 
+let term_clean t =
   if t.isatty && not t.clean then
     begin
       let u = "\r\027[K" in
@@ -126,7 +126,7 @@ let stdout = {
 
 let clean () = term_clean stdout
 
-let set_output ?(isatty=false) output flush = 
+let set_output ?(isatty=false) output flush =
   set_terminal stdout isatty output flush
 
 (* -------------------------------------------------------------------------- *)
@@ -204,7 +204,7 @@ let is_prefixed_event = function
 
 let is_single_line text =
   try ignore (String.index_from text 0 '\n') ; false
-  with Not_found -> true 
+  with Not_found -> true
 
 let echo_firstline output text p q width =
   let t = try String.index_from text p '\n' with Not_found -> succ q in
@@ -372,10 +372,13 @@ let () = Array.iteri
 (* -------------------------------------------------------------------------- *)
 
 let all_channels : (string,channelstate) Hashtbl.t = Hashtbl.create 31
-let default_emitters = Array.map (fun _ -> { listeners=[] ; echo=true }) all_kinds
+let default_emitters =
+  Array.map (fun _ -> { listeners=[] ; echo=true })
+    all_kinds
 
 let new_emitters () =
-  Array.map (fun e -> { listeners = e.listeners ; echo = e.echo }) default_emitters
+  Array.map (fun e -> { listeners = e.listeners ; echo = e.echo })
+    default_emitters
 
 let get_emitters plugin =
   try
@@ -477,6 +480,8 @@ let logtransient channel text =
          raise e
     ) buffer text
 
+let locked_listeners = ref false
+
 let logwithfinal finally channel
     ?(fire=true)    (* fire channel listeners *)
     ?emitwith       (* additional emitter *)
@@ -498,7 +503,7 @@ let logwithfinal finally channel
          Format.pp_print_newline fmt () ;
          Format.pp_print_flush fmt () ;
          let p,q = Rich_text.trim buffer in
-         let output = 
+         let output =
            if p <= q then
              let source = get_source current source in
              let message = Rich_text.range buffer p q in
@@ -515,7 +520,16 @@ let logwithfinal finally channel
                  if echo && e.echo then
                    do_echo channel.terminal event ;
                  Extlib.may (do_fire event) emitwith;
-                 if fire then List.iter (do_fire event) e.listeners ;
+                 if fire && not !locked_listeners then
+                   begin
+                     try
+                       locked_listeners := true ;
+                       List.iter (do_fire event) e.listeners ;
+                       locked_listeners := false ;
+                     with exn ->
+                       locked_listeners := false ;
+                       raise exn
+                   end ;
                  Some event
                end
              else None
@@ -586,26 +600,26 @@ let deferred_raise ~fatal ~unreported event msg =
   logwithfinal finally channel ?append ~kind:event.evt_kind msg
 
 let treat_deferred_error () =
-    match !deferred_exn with
-    | DNo_exn -> ()
-    | DWarn_as_error event ->
-      let unreported = unreported_event event in
-      let wkey =
-        match event.evt_category with
-        | None -> ""
-        | Some s when s = unreported_error -> ""
-        | Some s -> s
-      in
-      deferred_raise ~fatal:false ~unreported event
-        "warning %s treated as deferred error." wkey
-    | DError event ->
-      let unreported = unreported_event event in
-      deferred_raise ~fatal:false ~unreported event
-        "Deferred error message was emitted during execution."
-    | DFatal event ->
-      let unreported = unreported_event event in
-      deferred_raise ~fatal:true ~unreported event
-        "Deferred internal error message was emitted during execution."
+  match !deferred_exn with
+  | DNo_exn -> ()
+  | DWarn_as_error event ->
+    let unreported = unreported_event event in
+    let wkey =
+      match event.evt_category with
+      | None -> ""
+      | Some s when s = unreported_error -> ""
+      | Some s -> s
+    in
+    deferred_raise ~fatal:false ~unreported event
+      "warning %s treated as deferred error." wkey
+  | DError event ->
+    let unreported = unreported_event event in
+    deferred_raise ~fatal:false ~unreported event
+      "Deferred error message was emitted during execution."
+  | DFatal event ->
+    let unreported = unreported_event event in
+    deferred_raise ~fatal:true ~unreported event
+      "Deferred internal error message was emitted during execution."
 
 (* -------------------------------------------------------------------------- *)
 (* --- Messages Interface                                                 --- *)
@@ -1242,7 +1256,7 @@ struct
         with error ->
           unlock_terminal stdout fmt ; raise error
       end
-    else 
+    else
       Pretty_utils.nullprintf text
 
   let pp_all_warn_categories_status () =
diff --git a/src/kernel_services/plugin_entry_points/log.mli b/src/kernel_services/plugin_entry_points/log.mli
index 9fd4675ec6b7d20a58043141b0257fdb14b50bbf..a01c5b99e605d977136ca4867624ab02c8df0a68 100644
--- a/src/kernel_services/plugin_entry_points/log.mli
+++ b/src/kernel_services/plugin_entry_points/log.mli
@@ -45,17 +45,17 @@ type 'a pretty_printer =
 (**
     Generic type for the various logging channels which are not aborting
     Frama-C.
-    - When [current] is [false] (default for most of the channels),
-   no location is output. When it is [true], the last registered location
-   is used as current (see {!Cil_const.CurrentLoc}).
+   - When [current] is [false] (default for most of the channels),
+     no location is output. When it is [true], the last registered location
+     is used as current (see {!Cil_const.CurrentLoc}).
    - [source] is the location to be output. If nil, [current] is used to
-   determine if a location should be output
+     determine if a location should be output
    - [emitwith] function which is called each time an event is processed
    - [echo] is [true] if the event should be output somewhere in addition
-   to [stdout]
+     to [stdout]
    - [append] adds some actions performed on the formatter after the event
-   has been processed.
-   @since Beryllium-20090601-beta1 *)
+     has been processed.
+     @since Beryllium-20090601-beta1 *)
 
 type ('a,'b) pretty_aborter =
   ?current:bool -> ?source:Filepath.position -> ?echo:bool ->
@@ -120,7 +120,7 @@ module type Messages = sig
 
   type category
   (** category for debugging/verbose messages. Must be registered before
-      any use. 
+      any use.
       Each column in the string defines a sub-category, e.g.
       a:b:c defines a subcategory c of b, which is itself a subcategory of a.
       Enabling a category (via -plugin-msg-category) will enable all its
@@ -140,7 +140,7 @@ module type Messages = sig
   val debug_atleast : int -> bool
   (** @since Beryllium-20090601-beta1 *)
 
-  val printf : ?level:int -> ?dkey:category -> 
+  val printf : ?level:int -> ?dkey:category ->
     ?current:bool -> ?source:Filepath.position ->
     ?append:(Format.formatter -> unit) ->
     ?header:(Format.formatter -> unit) ->
@@ -202,7 +202,7 @@ module type Messages = sig
       [false].
 
       The intended usage is: [assert (verify e "Bla...") ;].
-      @since Beryllium-20090601-beta1 
+      @since Beryllium-20090601-beta1
       @plugin development guide *)
 
   val not_yet_implemented : ('a,formatter,unit,'b) format4 -> 'a
@@ -242,13 +242,13 @@ module type Messages = sig
   (** Generic log routine. The default kind is [Result]. Use cases (with
       [n,m > 0]):
       - [log ~verbose:n]: emit the message only when verbosity level is
-      at least [n].
+        at least [n].
       - [log ~debug:n]: emit the message only when debugging level is
-      at least [n].
+        at least [n].
       - [log ~verbose:n ~debug:m]: any debugging or verbosity level is
-      sufficient.
-      @since Beryllium-20090901
-      @plugin development guide *)
+        sufficient.
+        @since Beryllium-20090901
+        @plugin development guide *)
 
   val logwith : (event option -> 'b) ->
     ?wkey:warn_category -> ?emitwith:(event -> unit) -> ?once:bool ->
@@ -397,14 +397,18 @@ module Register
 val set_echo : ?plugin:string -> ?kind:kind list -> bool -> unit
 (** Turns echo on or off. Applies to all channel unless specified,
     and all kind of messages unless specified.
-    @since Beryllium-20090601-beta1 
+    @since Beryllium-20090601-beta1
     @plugin development guide *)
 
 val add_listener : ?plugin:string -> ?kind:kind list -> (event -> unit) -> unit
 (** Register a hook that is called each time an event is
     emitted. Applies to all channel unless specified,
     and all kind of messages unless specified.
-    @since Beryllium-20090601-beta1 
+
+    Warning: when executing the listener, all listeners will be
+    temporarily deactivated in order to avoid infinite recursion.
+
+    @since Beryllium-20090601-beta1
     @plugin development guide *)
 
 val echo : event -> unit
@@ -426,7 +430,7 @@ type channel
 (** @since Beryllium-20090601-beta1 *)
 
 val new_channel : string -> channel
-(** @since Beryllium-20090901 
+(** @since Beryllium-20090901
     @plugin development guide *)
 
 val log_channel : channel ->
@@ -447,7 +451,7 @@ val kernel_label_name: string
 val source : file:Filepath.Normalized.t -> line:int -> Filepath.position
 (** @since Chlorine-20180501
     @modify 18.0-Argon change type of [file]
- *)
+*)
 
 val get_current_source : unit -> Filepath.position
 
@@ -463,7 +467,7 @@ val clean : unit -> unit
 val null : formatter
 [@@ deprecated "Use 'Pretty_utils.null' instead"]
 (** Prints nothing.
-    @since Beryllium-20090901 
+    @since Beryllium-20090901
     @deprecated Chlorine-20180501 use {!Pretty_utils} instead. *)
 
 val nullprintf :  ('a,formatter,unit) format -> 'a
@@ -480,7 +484,7 @@ val with_null : (unit -> 'b) -> ('a,formatter,unit,'b) format4 -> 'a
 
 val set_output : ?isatty:bool -> (string -> int -> int -> unit) -> (unit -> unit) -> unit
 (** This function has the same parameters as Format.make_formatter.
-    @since Beryllium-20090901 
+    @since Beryllium-20090901
     @plugin development guide *)
 
 val print_on_output : (Format.formatter -> unit) -> unit
@@ -490,8 +494,8 @@ val print_on_output : (Format.formatter -> unit) -> unit
     Notification of listeners is not delayed, however.
 
     Can not be recursively invoked.
-    @since Beryllium-20090901 
-    @modify Nitrogen-20111001 signature changed 
+    @since Beryllium-20090901
+    @modify Nitrogen-20111001 signature changed
     @plugin development guide *)
 
 val print_delayed : (Format.formatter -> unit) -> unit
@@ -502,7 +506,7 @@ val print_delayed : (Format.formatter -> unit) -> unit
 
     Can not be recursively invoked.
     @since Beryllium-20090901
-    @modify Nitrogen-20111001 signature changed 
+    @modify Nitrogen-20111001 signature changed
     @plugin development guide *)
 
 (**/**)
@@ -528,7 +532,7 @@ val treat_deferred_error: unit -> unit
    a delayed error or failure. Currently done:
    - after each command-line stage.
    - after each analysis step (as separated by -then and its derivatives),
-   including the last one.
+     including the last one.
 *)
 
 (**/**)
diff --git a/src/kernel_services/plugin_entry_points/plugin.ml b/src/kernel_services/plugin_entry_points/plugin.ml
index eb6788d998dbc149e961930f96b3cc9a69bf3add..b03caf400b38df4a6edcb80bcc4d63bc29adf6c1 100644
--- a/src/kernel_services/plugin_entry_points/plugin.ml
+++ b/src/kernel_services/plugin_entry_points/plugin.ml
@@ -45,7 +45,8 @@ module type S_no_log = sig
   module Config: Parameter_sig.Specific_dir
   val help: Cmdline.Group.t
   val messages: Cmdline.Group.t
-  val add_plugin_output_aliases: string list -> unit
+  val add_plugin_output_aliases:
+    ?visible:bool -> ?deprecated:bool -> string list -> unit
 end
 
 module type S = sig
@@ -116,16 +117,18 @@ type plugin =
     p_parameters: (string, Typed_parameter.t list) Hashtbl.t }
 
 let plugins: plugin list ref = ref []
+let cmp_plugins p1 p2 =
+  (* the kernel is the smallest plug-in *)
+  match p1.p_name, p2.p_name with
+  | s1, s2 when s1 = kernel_name && s2 = kernel_name -> 0
+  | s1, _ when s1 = kernel_name -> -1
+  | _, s2 when s2 = kernel_name -> 1
+  | s1, s2 -> String.compare s1 s2
 let iter_on_plugins f =
-  let cmp p1 p2 =
-    (* the kernel is the smaller plug-in *)
-    match p1.p_name, p2.p_name with
-    | s1, s2 when s1 = kernel_name && s2 = kernel_name -> 0
-    | s1, _ when s1 = kernel_name -> -1
-    | _, s2 when s2 = kernel_name -> 1
-    | s1, s2 -> String.compare s1 s2
-  in
-  List.iter f (List.sort cmp !plugins)
+  List.iter f (List.sort cmp_plugins !plugins)
+
+let fold_on_plugins (f : (plugin -> 'a -> 'a)) (acc : 'a) : 'a =
+  List.fold_left (fun acc e -> f e acc) acc (List.sort cmp_plugins !plugins)
 
 let is_present s = List.exists (fun p -> p.p_shortname = s) !plugins
 let get_from_name s = List.find (fun p -> p.p_name = s) !plugins
@@ -309,7 +312,7 @@ struct
 
     let () =
       Parameter_customize.set_cmdline_stage Cmdline.Extended;
-      if is_visible then Parameter_customize.do_iterate ()
+      if is_visible then Parameter_customize.is_reconfigurable ()
       else Parameter_customize.is_invisible ()
 
     module Dir_name =
@@ -516,7 +519,7 @@ struct
     Parameter_customize.set_group messages;
     Parameter_customize.do_not_projectify ();
     Parameter_customize.do_not_journalize ();
-    Parameter_customize.do_iterate ();
+    Parameter_customize.is_reconfigurable ();
     if is_kernel () then begin
       Parameter_customize.set_cmdline_stage Cmdline.Early;
       Parameter_customize.set_module_name modname;
@@ -797,14 +800,14 @@ struct
     let is_kernel = is_kernel () in
     Warn_category.add_set_hook (parse_warn_directives is_kernel)
 
-  let add_plugin_output_aliases aliases =
+  let add_plugin_output_aliases ?visible ?deprecated aliases =
     let aliases = List.filter (fun alias -> alias <> "") aliases in
     let optname suffix = List.map (fun alias -> "-" ^ alias ^ suffix) aliases in
-    Help.add_aliases (optname "-help");
-    Verbose.add_aliases (optname "-verbose");
-    Debug_category.add_aliases (optname "-msg-key");
-    Warn_category.add_aliases (optname "-warn-key");
-    LogToFile.add_aliases (optname "-log")
+    Help.add_aliases ?visible ?deprecated (optname "-help");
+    Verbose.add_aliases ?visible ?deprecated (optname "-verbose");
+    Debug_category.add_aliases ?visible ?deprecated (optname "-msg-key");
+    Warn_category.add_aliases ?visible ?deprecated (optname "-warn-key");
+    LogToFile.add_aliases ?visible ?deprecated (optname "-log")
 
   let () = reset_plugin ()
 
diff --git a/src/kernel_services/plugin_entry_points/plugin.mli b/src/kernel_services/plugin_entry_points/plugin.mli
index a5e41ee354ec50753ba9200ccb84281524757210..39798e3efef3bb17f497d9ef1ff1a7da81101dd9 100644
--- a/src/kernel_services/plugin_entry_points/plugin.mli
+++ b/src/kernel_services/plugin_entry_points/plugin.mli
@@ -64,12 +64,14 @@ module type S_no_log = sig
   (** The group containing options -*-debug and -*-verbose.
       @since Boron-20100401 *)
 
-  val add_plugin_output_aliases: string list -> unit
-  (** Adds aliases to the options -plugin-help, -plugin-verbose, -plugin-log,
-      -plugin-msg-key, and -plugin-warn-key.
-      [add_plugin_output_aliases [alias]] adds the aliases -alias-help,
-      -alias-verbose, etc.
-      @since 18.0-Argon *)
+  val add_plugin_output_aliases:
+    ?visible:bool -> ?deprecated:bool -> string list -> unit
+    (** Adds aliases to the options -plugin-help, -plugin-verbose, -plugin-log,
+        -plugin-msg-key, and -plugin-warn-key.
+        [add_plugin_output_aliases [alias]] adds the aliases -alias-help,
+        -alias-verbose, etc.
+        @since 18.0-Argon
+        @modify Frama-c+dev add [visible] and [deprecated] arguments. *)
 end
 
 (** Provided plug-general services for plug-ins.
@@ -87,9 +89,10 @@ type plugin = private
     p_shortname: string;
     p_help: string;
     p_parameters: (string, Typed_parameter.t list) Hashtbl.t }
-(** Only iterable parameters (see {!do_iterate} and {!do_not_iterate}) are
-    registered in the field [p_parameters].
-    @since Beryllium-20090901 *)
+(** @since Beryllium-20090901
+    @modify Frama-C+dev previously only "iterable" parameters were included,
+                        now all parameters are.
+*)
 
 module type General_services = sig
   include S
@@ -167,9 +170,13 @@ val get: string -> plugin
     @deprecated since Oxygen-20120901 *)
 
 val iter_on_plugins: (plugin -> unit) -> unit
-(** Iterate on each registered plug-ins.
+(** Iterate on each registered plug-in.
     @since Beryllium-20090901 *)
 
+val fold_on_plugins: (plugin -> 'a -> 'a) -> 'a -> 'a
+(** Fold [f] on each registered plug-in.
+    @since Frama-C+dev *)
+
 (**/**)
 (* ************************************************************************* *)
 (** {2 Internal kernel stuff} *)
diff --git a/src/libraries/utils/filepath.ml b/src/libraries/utils/filepath.ml
index b408b1729b19bcbca0402b0639e0031a6ffaba1a..e0f807015696b9bfb2663174b39dbafadfaeac05 100644
--- a/src/libraries/utils/filepath.ml
+++ b/src/libraries/utils/filepath.ml
@@ -252,6 +252,10 @@ module Normalized = struct
   let pp_abs fmt p = Format.fprintf fmt "%s" p
   let unknown = normalize ""
   let is_unknown fp = equal fp unknown
+  let is_file fp =
+    try
+      (Unix.stat (fp :> string)).Unix.st_kind = Unix.S_REG
+    with _ -> false
 end
 
 type position =
diff --git a/src/libraries/utils/filepath.mli b/src/libraries/utils/filepath.mli
index 39c084bffa8cecef1fb71baca36e9870c5d834c1..41c56ec816717618e136353f659045276feadad5 100644
--- a/src/libraries/utils/filepath.mli
+++ b/src/libraries/utils/filepath.mli
@@ -144,6 +144,12 @@ module Normalized: sig
 
   (** @since 20.0-Calcium *)
   val is_unknown: t -> bool
+
+  (** [is_file f] returns [true] iff [f] points to a regular file
+      (or a symbolic link pointing to a file).
+      Returns [false] if any errors happen when [stat]'ing the file.
+      @since Frama-C+dev *)
+  val is_file: t -> bool
 end
 
 (** Describes a position in a source file.
diff --git a/src/plugins/aorai/aorai_option.ml b/src/plugins/aorai/aorai_option.ml
index 850d0efb9068ee5b2b337cb725369ba283ac8f74..1dfe1a0504a9c33546d943fe3705f79c97373bf9 100644
--- a/src/plugins/aorai/aorai_option.ml
+++ b/src/plugins/aorai/aorai_option.ml
@@ -31,36 +31,44 @@ include Plugin.Register
    end)
 
 module Ltl_File =
-  Empty_string
+  Filepath
     (struct
        let option_name = "-aorai-ltl"
        let arg_name = ""
+       let file_kind = "ltl"
+       let existence = Fc_Filepath.Must_exist
        let help = "specifies file name for LTL property"
      end)
 
 module To_Buchi =
-  Empty_string
+  Filepath
     (struct
        let option_name = "-aorai-to-buchi"
        let arg_name = "f"
+       let file_kind = "Promela"
+       let existence = Fc_Filepath.Indifferent
        let help =
          "only generates the buchi automata (in Promela language) in file <s>"
      end)
 
 module Buchi =
-  Empty_string
+  Filepath
     (struct
        let option_name = "-aorai-buchi"
        let arg_name = "f"
+       let file_kind = "Promela"
+       let existence = Fc_Filepath.Must_exist
        let help = "considers the property described by the buchi automata \
                    (in Promela language) from file <f>."
      end)
 
 module Ya =
-  Empty_string
+  Filepath
     (struct
        let option_name = "-aorai-automata"
        let arg_name = "f"
+       let file_kind = "Ya"
+       let existence = Fc_Filepath.Must_exist
        let help = "considers the property described by the ya automata \
                    (in Ya language) from file <f>."
      end)
@@ -74,10 +82,12 @@ module Output_Spec =
         end)
 
 module Output_C_File =
-  Empty_string
+  Filepath
     (struct
        let option_name = "-aorai-output-c-file"
        let arg_name = ""
+       let file_kind = "annotated C"
+       let existence = Fc_Filepath.Indifferent
        let help = "specifies generated file name for annotated C code"
      end)
 
@@ -155,7 +165,7 @@ let is_on () =
        Buchi.is_default ()    && Ya.is_default () )
 
 let promela_file () =
-  if Buchi.get () = "" then To_Buchi.get () else Buchi.get ()
+  if Fc_Filepath.Normalized.is_unknown (Buchi.get ()) then To_Buchi.get () else Buchi.get ()
 
 let advance_abstract_interpretation () =
   not (AbstractInterpretationOff.get ()) && not (AbstractInterpretation.get ())
diff --git a/src/plugins/aorai/aorai_option.mli b/src/plugins/aorai/aorai_option.mli
index 66037798612cfea8300cd165c375b650f76d41b9..111cf0e74ea3f7ac344cb47ffd02be462f11734c 100644
--- a/src/plugins/aorai/aorai_option.mli
+++ b/src/plugins/aorai/aorai_option.mli
@@ -25,12 +25,12 @@
 
 include Plugin.S
 
-module Ltl_File: Parameter_sig.String
-module To_Buchi: Parameter_sig.String
-module Buchi: Parameter_sig.String
-module Ya: Parameter_sig.String
+module Ltl_File: Parameter_sig.Filepath
+module To_Buchi: Parameter_sig.Filepath
+module Buchi: Parameter_sig.Filepath
+module Ya: Parameter_sig.Filepath
 module Output_Spec: Parameter_sig.Bool
-module Output_C_File: Parameter_sig.String
+module Output_C_File: Parameter_sig.Filepath
 module Dot: Parameter_sig.Bool
 module DotSeparatedLabels: Parameter_sig.Bool
 module AbstractInterpretation: Parameter_sig.Bool
@@ -44,7 +44,7 @@ module AddingOperationNameAndStatusInSpecification: Parameter_sig.Bool
 module Deterministic: State_builder.Ref with type data = bool
 
 val is_on : unit -> bool
-val promela_file: unit -> string
+val promela_file: unit -> Filepath.Normalized.t
 val advance_abstract_interpretation: unit -> bool
 
 val emitter: Emitter.t
diff --git a/src/plugins/aorai/aorai_register.ml b/src/plugins/aorai/aorai_register.ml
index a9c5a2bcd068e6efecf8f92a956e28d7e7bf24e7..664f3289886e08fbe4ea271b3460dbfd5f3ba63f 100644
--- a/src/plugins/aorai/aorai_register.ml
+++ b/src/plugins/aorai/aorai_register.ml
@@ -27,13 +27,12 @@ open Logic_ptree
 open Promelaast
 
 (* [VP] Need to get rid of those global references at some point. *)
-let promela_file = ref ""
-let ya_file = ref ""
-let c_file = ref ""
-let output_c_file = ref ""
-let ltl_tmp_file = ref ""
-let ltl_file = ref ""
-let dot_file = ref ""
+let promela_file = ref Filepath.Normalized.unknown
+let c_file = ref Filepath.Normalized.unknown
+let output_c_file = ref Filepath.Normalized.unknown
+let ltl_tmp_file = ref Filepath.Normalized.unknown
+let ltl_file = ref Filepath.Normalized.unknown
+let dot_file = ref Filepath.Normalized.unknown
 let generatesCFile = ref true
 let ltl2ba_params = " -l -p -o "
 
@@ -81,63 +80,66 @@ let syntax_error loc msg =
     ((snd loc).Lexing.pos_cnum - (fst loc).Lexing.pos_bol)
     msg
 
-let ltl_to_ltlLight f_ltl f_out =
+(* Performs some checks before calling [open_in f], reporting ["errmsg: <f>"]
+   in case of error. *)
+let check_and_open_in (f : Filepath.Normalized.t) errmsg =
+  if not (Filepath.Normalized.is_file f) then
+    Aorai_option.abort "%s: %a" errmsg Filepath.Normalized.pretty f;
+  open_in (f :> string)
+
+let ltl_to_ltlLight f_ltl (f_out : Filepath.Normalized.t) =
   try
-    let c = open_in f_ltl in
+    let c = check_and_open_in f_ltl "invalid LTL file" in
     let (ltl_form,exprs) = Ltllexer.parse c in
     close_in c;
-    Ltl_output.output ltl_form f_out;
+    Ltl_output.output ltl_form (f_out :> string);
     set_ltl_correspondence exprs
-  with 
-    | Not_found -> Aorai_option.abort "Unknown LTL file %s" f_ltl
-    | Ltllexer.Error (loc,msg) -> syntax_error loc msg
+  with
+  | Ltllexer.Error (loc,msg) -> syntax_error loc msg
 
-let load_ya_file f  =
+let load_ya_file f =
   try
-    let c = open_in f in
+    let c = check_and_open_in f "invalid Ya file" in
     let automata = Yalexer.parse c  in
     close_in c;
     Data_for_aorai.setAutomata automata;
   with
-    | Not_found -> Aorai_option.abort "Unknown Ya file %s" f
-    | Yalexer.Error (loc,msg) -> syntax_error loc msg
+  | Yalexer.Error (loc,msg) -> syntax_error loc msg
 
 let load_promela_file f  =
   try
-    let c = open_in f in
+    let c = check_and_open_in f "invalid Promela file" in
     let (s,t) = Promelalexer.parse c  in
     let t = convert_ltl_exprs t in
     close_in c;
     Data_for_aorai.setAutomata (s,t);
   with 
-    | Not_found -> Aorai_option.abort "Unknown Promela file %s" f
-    | Promelalexer.Error(loc,msg) -> syntax_error loc msg
+  | Promelalexer.Error(loc,msg) -> syntax_error loc msg
 
-let load_promela_file_withexps f  =
+let load_promela_file_withexps f =
   try
-    let c = open_in f in
+    let c = check_and_open_in f "invalid Promela file" in
     let automata = Promelalexer_withexps.parse c  in
     close_in c;
     Data_for_aorai.setAutomata automata;
   with 
-    | Not_found -> Aorai_option.abort "Unknown Promela file %s" f
-    | Promelalexer_withexps.Error(loc,msg) -> syntax_error loc msg
+  | Promelalexer_withexps.Error(loc,msg) -> syntax_error loc msg
 
 let display_status () =
   if Aorai_option.verbose_atleast 2 then begin
     Aorai_option.feedback "\n"  ;
-    Aorai_option.feedback "C file:            '%s'\n" !c_file ;
+    Aorai_option.feedback "C file:            '%a'\n" Filepath.Normalized.pretty !c_file ;
     Aorai_option.feedback "Entry point:       '%a'\n" 
       Kernel_function.pretty (fst (Globals.entry_point())) ;
-    Aorai_option.feedback "LTL property:      '%s'\n" !ltl_file ;
-    Aorai_option.feedback "Files to generate: '%s' (Annotated code)\n"
-      (if !generatesCFile then !output_c_file else "(none)");
+    Aorai_option.feedback "LTL property:      '%a'\n" Filepath.Normalized.pretty !ltl_file ;
+    Aorai_option.feedback "Files to generate: '%a' (Annotated code)\n"
+      (if !generatesCFile then Filepath.Normalized.pretty else (fun fmt _ -> Format.fprintf fmt "(none)")) !output_c_file;
     if Aorai_option.Dot.get () then
-      Aorai_option.feedback "Dot file:          '%s'\n"  !dot_file;
-    Aorai_option.feedback "Tmp files:         '%s' (Light LTL file)\n"
-      !ltl_tmp_file ;
-    Aorai_option.feedback "                   '%s' (Promela file)\n"
-      !promela_file ;
+      Aorai_option.feedback "Dot file:          '%a'\n" Filepath.Normalized.pretty !dot_file;
+    Aorai_option.feedback "Tmp files:         '%a' (Light LTL file)\n"
+      Filepath.Normalized.pretty !ltl_tmp_file ;
+    Aorai_option.feedback "                   '%a' (Promela file)\n"
+      Filepath.Normalized.pretty !promela_file ;
     Aorai_option.feedback "\n"
   end
 
@@ -146,10 +148,13 @@ let init_file_names () =
      generation *)
   let err= ref false in
   let dispErr mesg f =
-    Aorai_option.error "Error. File '%s' %s.\n" f mesg;
+    Aorai_option.error "Error. File '%a' %s.\n" Filepath.Normalized.pretty f mesg;
     err:=true
   in
-  let freshname pre suf =
+  let freshname ?opt_suf file suf =
+    let name = Filepath.Normalized.to_pretty_string file in
+    let pre = Filename.remove_extension name in
+    let pre = match opt_suf with None -> pre | Some s -> pre ^ s in
     let rec fn p s n =
       if not (Sys.file_exists (p^(string_of_int n)^s)) then (p^(string_of_int n)^s)
       else fn p s (n+1)
@@ -157,55 +162,52 @@ let init_file_names () =
     let name =
       if not (Sys.file_exists (pre^suf)) then pre^suf
       else fn pre suf 0
-    in name
+    in Filepath.Normalized.of_string name
   in
 
   (* c_file name is given and has to point out a valid file. *)
   c_file :=
     (match Kernel.Files.get () with
-      | [] -> "dummy.i"
-      | f :: _ -> Filepath.Normalized.to_pretty_string f);
-  if (!c_file="") then dispErr ": invalid C file name" !c_file;
-  if (not (Sys.file_exists !c_file)) then dispErr "not found" !c_file;
+      | [] -> Filepath.Normalized.of_string "dummy.i"
+      | f :: _ -> f);
+  if (Filepath.Normalized.is_unknown !c_file) then dispErr ": invalid C file name" !c_file;
 
   (* The output C file has to be a valid file name if it is used. *)
-  output_c_file := (Aorai_option.Output_C_File.get ()) ;
-  if (!output_c_file="") then output_c_file:=freshname ((Filename.chop_extension !c_file)^"_annot") ".c";
+  output_c_file := Aorai_option.Output_C_File.get ();
+  if (Filepath.Normalized.is_unknown !output_c_file) then
+    output_c_file := freshname ~opt_suf:"_annot" !c_file ".c";
   (*   else if Sys.file_exists !output_c_file then dispErr "already exists" !output_c_file; *)
 
   if Aorai_option.Dot.get () then
-    dot_file:=freshname (Filename.chop_extension !c_file) ".dot";
+    dot_file:= freshname !c_file ".dot";
 
-  if Aorai_option.Ya.get () = "" then
-    if Aorai_option.Buchi.get () = "" then begin
+  if Filepath.Normalized.is_unknown (Aorai_option.Ya.get ()) then
+    if Filepath.Normalized.is_unknown (Aorai_option.Buchi.get ()) then begin
       (* ltl_file name is given and has to point out a valid file. *)
       ltl_file := Aorai_option.Ltl_File.get ();
-      if (!ltl_file="") then dispErr ": invalid LTL file name" !ltl_file;
-      if (not (Sys.file_exists !ltl_file)) then dispErr "not found" !ltl_file;
 
       (* The LTL file is always used. *)
       (* The promela file can be given or not. *)
-      if Aorai_option.To_Buchi.get () <> "" then begin
+      if not (Filepath.Normalized.is_unknown (Aorai_option.To_Buchi.get ())) then begin
         ltl_tmp_file:=
-          freshname
-          (Filename.chop_extension
-             (Aorai_option.promela_file ())) ".ltl";
+          freshname (Aorai_option.promela_file ()) ".ltl";
         promela_file:= Aorai_option.promela_file ();
-        Extlib.cleanup_at_exit !ltl_tmp_file
+        Extlib.cleanup_at_exit (!ltl_tmp_file :> string)
       end else begin
         ltl_tmp_file:=
           (try
-             Extlib.temp_file_cleanup_at_exit
-               (Filename.basename !c_file) ".ltl"
+             Filepath.Normalized.of_string
+               (Extlib.temp_file_cleanup_at_exit
+                  (Filename.basename (!c_file:>string)) ".ltl")
            with Extlib.Temp_file_error s ->
              Aorai_option.abort "cannot create temporary file: %s" s);
         promela_file:=
-          freshname (Filename.chop_extension !ltl_tmp_file) ".promela";
-        Extlib.cleanup_at_exit !promela_file;
+          freshname !ltl_tmp_file ".promela";
+        Extlib.cleanup_at_exit (!promela_file :> string);
       end
     end else begin
-      if Aorai_option.To_Buchi.get () <> "" &&
-        Aorai_option.Ltl_File.get () <> ""
+      if not (Filepath.Normalized.is_unknown (Aorai_option.To_Buchi.get ())) &&
+         not (Filepath.Normalized.is_unknown (Aorai_option.Ltl_File.get ()))
       then begin
         Aorai_option.error
           "Error. '-buchi' option is incompatible with '-to-buchi' and '-ltl' \
@@ -217,9 +219,8 @@ options.";
       promela_file := Aorai_option.promela_file ();
     end
   else begin
-    ya_file := Aorai_option.Ya.get ();
-    if (!ya_file="") then dispErr ": invalid Ya file name" !ya_file;
-    if (not (Sys.file_exists !ya_file)) then dispErr "not found" !ya_file
+   let ya_file = Aorai_option.Ya.get () in
+    if (Filepath.Normalized.is_unknown ya_file) then dispErr ": invalid Ya file name" ya_file;
   end;
   display_status ();
   !err
@@ -236,7 +237,7 @@ let output () =
   if (Aorai_option.Dot.get()) then
     begin
       Promelaoutput.output_dot_automata (Data_for_aorai.getAutomata ())
-        !dot_file;
+        (!dot_file:>string);
       printverb "Generating dot file    : done\n"
     end;
 
@@ -245,7 +246,7 @@ let output () =
     printverb "C file generation      : skipped\n"
   else
     begin
-      let cout = open_out !output_c_file in
+      let cout = open_out (!output_c_file:>string) in
       let fmt = Format.formatter_of_out_channel cout in
       Kernel.Unicode.without_unicode
         (fun () ->
@@ -258,33 +259,35 @@ let output () =
   printverb "Finished.\n";
   (* Some test traces. *)
   Data_for_aorai.debug_computed_state ();
-  if !generatesCFile then Kernel.Files.set [ Datatype.Filepath.of_string !output_c_file ]
+  if !generatesCFile then Kernel.Files.set [ !output_c_file ]
 
 let work () =
   let file = Ast.get () in
   Aorai_utils.initFile file;
   printverb "C file loading         : done\n";
-  if Aorai_option.Ya.get () = "" then
-    if Aorai_option.Buchi.get () = "" then begin
+  if Filepath.Normalized.is_unknown (Aorai_option.Ya.get ()) then
+    if Filepath.Normalized.is_unknown (Aorai_option.Buchi.get ()) then begin
       ltl_to_ltlLight !ltl_file !ltl_tmp_file;
       printverb "LTL loading            : done\n";
-      let cmd = Format.sprintf "ltl2ba %s -F %s > %s"
-        ltl2ba_params !ltl_tmp_file !promela_file
+      let cmd = Format.asprintf "ltl2ba %s -F %a > %a"
+          ltl2ba_params
+          Filepath.Normalized.pretty !ltl_tmp_file
+          Filepath.Normalized.pretty !promela_file
       in if Sys.command cmd <> 0 then
           Aorai_option.abort "failed to run: %s" cmd ;
       printverb "LTL ~> Promela (ltl2ba): done\n"
     end;
-  if Aorai_option.To_Buchi.get () <> "" then
-    printverb ("Finished.\nGenerated file: '"^(!promela_file)^"'\n")
+  if not (Filepath.Normalized.is_unknown (Aorai_option.To_Buchi.get ())) then
+    printverb ("Finished.\nGenerated file: '"^(Filepath.Normalized.to_pretty_string !promela_file)^"'\n")
   else
     begin
         (* Step 3 : Loading promela_file and checking the consistency between informations from C code and LTL property *)
         (*          Such as functions name and global variables. *)
 
-      if Aorai_option.Buchi.get () <> "" then
+      if not (Filepath.Normalized.is_unknown (Aorai_option.Buchi.get ())) then
         load_promela_file_withexps !promela_file
-      else if Aorai_option.Ya.get  () <> "" then
-        load_ya_file !ya_file
+      else if not (Filepath.Normalized.is_unknown (Aorai_option.Ya.get ())) then
+        load_ya_file (Aorai_option.Ya.get ())
       else
         load_promela_file !promela_file;
       printverb "Loading promela        : done\n";
diff --git a/src/plugins/aorai/aorai_utils.ml b/src/plugins/aorai/aorai_utils.ml
index c4fb25191c1f4b7f166ad3666763e6eff90a1aa1..8ace0513ae632217120f86caaa07cee32e0dd722 100644
--- a/src/plugins/aorai/aorai_utils.ml
+++ b/src/plugins/aorai/aorai_utils.ml
@@ -957,6 +957,7 @@ let mk_deterministic_lemma () =
     in
     let trans = Path_analysis.get_transitions_of_state state automaton in
     let prop = Extlib.product_fold disjoint_guards ptrue trans trans in
+    let prop = Logic_const.toplevel_predicate ~only_check:true prop in
     let name = state.Promelaast.name ^ "_deterministic_trans" in
     let lemma =
       Dlemma (name, false, [label],[],prop,[],Cil_datatype.Location.unknown)
diff --git a/src/plugins/aorai/aorai_visitors.ml b/src/plugins/aorai/aorai_visitors.ml
index 7ce63778b530c98bf41e20013662ec11946bf0c9..2b7c52b53ecfa135f351fee114293ad84e50b706 100644
--- a/src/plugins/aorai/aorai_visitors.ml
+++ b/src/plugins/aorai/aorai_visitors.ml
@@ -463,6 +463,7 @@ let get_unchanged_aux_var loc current_state =
 class visit_adding_pre_post_from_buch treatloops =
 
   let predicate_to_invariant kf stmt pred =
+    let pred = Logic_const.toplevel_predicate pred in
     Annotations.add_code_annot
       Aorai_option.emitter
       ~kf
diff --git a/src/plugins/aorai/tests/aorai/assigns.c b/src/plugins/aorai/tests/aorai/assigns.c
index c8d63fdb9dba75b9fb13a0021f32cf20f1435241..843e5dd51192b344faa975e2e7cf0ffc85e39ae2 100644
--- a/src/plugins/aorai/tests/aorai/assigns.c
+++ b/src/plugins/aorai/tests/aorai/assigns.c
@@ -1,8 +1,8 @@
 /* run.config*
-   EXECNOW: make -s @PTEST_DIR@/name_projects.cmxs
    OPT: -aorai-automata tests/aorai/assigns.ya  -aorai-test 1 -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ @PROVE_OPTIONS@
    OPT: -aorai-automata tests/aorai/assigns_det.ya -aorai-test 1 -load-module tests/aorai/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ @PROVE_OPTIONS@
-   OPT: -aorai-automata tests/aorai/assigns.ya -load-module @PTEST_DIR@/name_projects -aorai-test 1 -then -print
+   MODULE: @PTEST_DIR@/name_projects.cmxs
+   OPT: -aorai-automata tests/aorai/assigns.ya -aorai-test 1 -then -print
 */
 
 int X;
diff --git a/src/plugins/aorai/tests/aorai/oracle/assigns.1.res.oracle b/src/plugins/aorai/tests/aorai/oracle/assigns.1.res.oracle
index 7e00479c453e3e785b4726a59de9906430c04c39..5f5602cdd80d5cc5e3123a0fe3281b1fd19fbe99 100644
--- a/src/plugins/aorai/tests/aorai/oracle/assigns.1.res.oracle
+++ b/src/plugins/aorai/tests/aorai/oracle/assigns.1.res.oracle
@@ -18,15 +18,15 @@ enum aorai_OpStatusList {
     aorai_Terminated = 1,
     aorai_Called = 0
 };
-/*@ lemma in_main_deterministic_trans{L}: \true;
+/*@ check lemma in_main_deterministic_trans{L}: \true;
  */
-/*@ lemma Sf_deterministic_trans{L}: \true;
+/*@ check lemma Sf_deterministic_trans{L}: \true;
  */
-/*@ lemma S_in_f_deterministic_trans{L}: \true;
+/*@ check lemma S_in_f_deterministic_trans{L}: \true;
  */
-/*@ lemma S2_deterministic_trans{L}: \true;
+/*@ check lemma S2_deterministic_trans{L}: \true;
  */
-/*@ lemma S1_deterministic_trans{L}: \true;
+/*@ check lemma S1_deterministic_trans{L}: \true;
  */
 int X;
 /*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */
diff --git a/src/plugins/aorai/tests/aorai/oracle/declared_function.res.oracle b/src/plugins/aorai/tests/aorai/oracle/declared_function.res.oracle
index f30827619507d6a1d3244f24cb2af9416e749eb3..9d37fe0b6442bed85a03f3b4a22d895bf153f3ca 100644
--- a/src/plugins/aorai/tests/aorai/oracle/declared_function.res.oracle
+++ b/src/plugins/aorai/tests/aorai/oracle/declared_function.res.oracle
@@ -19,7 +19,7 @@ int f(void);
 /*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */
 /*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; */
 /*@
-lemma I_deterministic_trans{L}:
+check lemma I_deterministic_trans{L}:
   (∀ int __retres_f;
      ¬(\at(aorai_CurOperation,L) ≡ op_f ∧
         \at(aorai_CurOpStatus,L) ≡ aorai_Terminated ∧
diff --git a/src/plugins/aorai/tests/aorai/oracle/deterministic.res.oracle b/src/plugins/aorai/tests/aorai/oracle/deterministic.res.oracle
index 37d537ca5af54b6e147169cb5a78c9903dc749fb..75acb9204ee5a6aee059455def9e02c64419a037 100644
--- a/src/plugins/aorai/tests/aorai/oracle/deterministic.res.oracle
+++ b/src/plugins/aorai/tests/aorai/oracle/deterministic.res.oracle
@@ -23,22 +23,22 @@ enum aorai_OpStatusList {
     aorai_Terminated = 1,
     aorai_Called = 0
 };
-/*@ lemma Si_deterministic_trans{L}: \true;
+/*@ check lemma Si_deterministic_trans{L}: \true;
  */
-/*@ lemma Sf_deterministic_trans{L}: \true;
+/*@ check lemma Sf_deterministic_trans{L}: \true;
  */
-/*@ lemma S5_deterministic_trans{L}: \true;
+/*@ check lemma S5_deterministic_trans{L}: \true;
  */
-/*@ lemma S4_deterministic_trans{L}: \true;
+/*@ check lemma S4_deterministic_trans{L}: \true;
  */
-/*@ lemma S2_deterministic_trans{L}: \true;
+/*@ check lemma S2_deterministic_trans{L}: \true;
  */
 int X;
 int Y;
 /*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */
 /*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; */
 /*@
-lemma S3_deterministic_trans{L}:
+check lemma S3_deterministic_trans{L}:
   ∀ int x;
     ¬(\at(aorai_CurOperation,L) ≡ op_g ∧
        \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧ x ≡ 5 ∧
@@ -46,7 +46,7 @@ lemma S3_deterministic_trans{L}:
        \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧ x ≡ 4);
  */
 /*@
-lemma S1_deterministic_trans{L}:
+check lemma S1_deterministic_trans{L}:
   ∀ int __retres_f, int x;
     ¬(\at(aorai_CurOperation,L) ≡ op_f ∧
        \at(aorai_CurOpStatus,L) ≡ aorai_Terminated ∧ __retres_f ≡ 0 ∧
@@ -54,7 +54,7 @@ lemma S1_deterministic_trans{L}:
        \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧ x ≡ 4);
  */
 /*@
-lemma S0_deterministic_trans{L}:
+check lemma S0_deterministic_trans{L}:
   ∀ int c;
     ¬(\at(aorai_CurOperation,L) ≡ op_real_main ∧
        \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧ c ≢ 0 ∧
diff --git a/src/plugins/aorai/tests/aorai/oracle/formals.res.oracle b/src/plugins/aorai/tests/aorai/oracle/formals.res.oracle
index b850086cbe94dbafa142e58f40a017022d73a22c..f7b7f60952fc0de58218d819587217b5ac8e2cb3 100644
--- a/src/plugins/aorai/tests/aorai/oracle/formals.res.oracle
+++ b/src/plugins/aorai/tests/aorai/oracle/formals.res.oracle
@@ -22,16 +22,16 @@ enum aorai_OpStatusList {
     aorai_Terminated = 1,
     aorai_Called = 0
 };
-/*@ lemma init_deterministic_trans{L}: \true;
+/*@ check lemma init_deterministic_trans{L}: \true;
  */
-/*@ lemma aorai_reject_deterministic_trans{L}: \true;
+/*@ check lemma aorai_reject_deterministic_trans{L}: \true;
  */
-/*@ lemma OK_deterministic_trans{L}: \true;
+/*@ check lemma OK_deterministic_trans{L}: \true;
  */
 /*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */
 /*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; */
 /*@
-lemma main_0_deterministic_trans{L}:
+check lemma main_0_deterministic_trans{L}:
   ∀ int x;
     ¬(\at(aorai_CurOperation,L) ≡ op_f ∧
        \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧ x ≡ 3 ∧
@@ -39,7 +39,7 @@ lemma main_0_deterministic_trans{L}:
        \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧ x ≡ 1);
  */
 /*@
-lemma aorai_intermediate_state_0_deterministic_trans{L}:
+check lemma aorai_intermediate_state_0_deterministic_trans{L}:
   ¬(\at(aorai_CurOperation,L) ≡ op_g ∧
      \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧
      ¬(\at(aorai_CurOperation,L) ≡ op_g ∧
@@ -48,7 +48,7 @@ lemma aorai_intermediate_state_0_deterministic_trans{L}:
 /*@ ghost int aorai_CurStates = init; */
 /*@ ghost int aorai_x_0 = 0; */
 /*@
-lemma aorai_intermediate_state_2_deterministic_trans{L}:
+check lemma aorai_intermediate_state_2_deterministic_trans{L}:
   ¬(\at(aorai_CurOperation,L) ≡ op_f ∧
      \at(aorai_CurOpStatus,L) ≡ aorai_Terminated ∧
      \at(aorai_x_0,L) ≡ 3 ∧
@@ -58,7 +58,7 @@ lemma aorai_intermediate_state_2_deterministic_trans{L}:
  */
 /*@ ghost int aorai_y = 0; */
 /*@
-lemma aorai_intermediate_state_1_deterministic_trans{L}:
+check lemma aorai_intermediate_state_1_deterministic_trans{L}:
   ¬(\at(aorai_CurOperation,L) ≡ op_g ∧
      \at(aorai_CurOpStatus,L) ≡ aorai_Terminated ∧
      \at(aorai_y,L) ≡ 2 ∧
@@ -68,7 +68,7 @@ lemma aorai_intermediate_state_1_deterministic_trans{L}:
  */
 /*@ ghost int aorai_x = 0; */
 /*@
-lemma aorai_intermediate_state_deterministic_trans{L}:
+check lemma aorai_intermediate_state_deterministic_trans{L}:
   ¬(\at(aorai_CurOperation,L) ≡ op_f ∧
      \at(aorai_CurOpStatus,L) ≡ aorai_Terminated ∧
      \at(aorai_x,L) ≡ 1 ∧
diff --git a/src/plugins/aorai/tests/aorai/oracle/incorrect.res.oracle b/src/plugins/aorai/tests/aorai/oracle/incorrect.res.oracle
index ebe6f07db4c9567f195bde9895293748e61bd6a4..f0441fa89f01c774e4a8ac2e8e94708bf91e14b0 100644
--- a/src/plugins/aorai/tests/aorai/oracle/incorrect.res.oracle
+++ b/src/plugins/aorai/tests/aorai/oracle/incorrect.res.oracle
@@ -15,7 +15,7 @@ enum aorai_OpStatusList {
     aorai_Terminated = 1,
     aorai_Called = 0
 };
-/*@ lemma s0_deterministic_trans{L}: \true;
+/*@ check lemma s0_deterministic_trans{L}: \true;
  */
 int f(void);
 
diff --git a/src/plugins/aorai/tests/aorai/oracle/monostate.res.oracle b/src/plugins/aorai/tests/aorai/oracle/monostate.res.oracle
index e4e6c64f81a3e62fcd37119fae12ca6dd86062c6..00d9af27024d4c9f1ab797e12c8459678891dfb0 100644
--- a/src/plugins/aorai/tests/aorai/oracle/monostate.res.oracle
+++ b/src/plugins/aorai/tests/aorai/oracle/monostate.res.oracle
@@ -19,19 +19,19 @@ enum aorai_OpStatusList {
     aorai_Terminated = 1,
     aorai_Called = 0
 };
-/*@ lemma aorai_reject_deterministic_trans{L}: \true;
+/*@ check lemma aorai_reject_deterministic_trans{L}: \true;
  */
 /*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */
 /*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; */
 /*@
-lemma aorai_intermediate_state_deterministic_trans{L}:
+check lemma aorai_intermediate_state_deterministic_trans{L}:
   ¬(\at(aorai_CurOperation,L) ≡ op_main ∧
      \at(aorai_CurOpStatus,L) ≡ aorai_Terminated ∧
      ¬(\at(aorai_CurOperation,L) ≡ op_main ∧
         \at(aorai_CurOpStatus,L) ≡ aorai_Terminated));
  */
 /*@
-lemma Init_deterministic_trans{L}:
+check lemma Init_deterministic_trans{L}:
   ¬(\at(aorai_CurOperation,L) ≡ op_main ∧
      \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧
      ¬(\at(aorai_CurOperation,L) ≡ op_main ∧
diff --git a/src/plugins/e-acsl/.gitignore b/src/plugins/e-acsl/.gitignore
index f5ee39fdfacb148fe2e6ab6c724865925290ea92..5543dbdb43e12ae58f5c6ecfa2674b7ebf5243c4 100644
--- a/src/plugins/e-acsl/.gitignore
+++ b/src/plugins/e-acsl/.gitignore
@@ -77,3 +77,4 @@ lib/libeacsl-rtl-bittree-dbg.a
 lib/libeacsl-rtl-segment-dbg.a
 tests/csrv14/*
 src/local_config.ml
+src/dependencies/dep_eva.ml
diff --git a/src/plugins/e-acsl/E_ACSL.ml b/src/plugins/e-acsl/E_ACSL.ml
index 9b1aebd33a7832ca9946de458d313ed0fcfca0a8..058077663607548d8326ae0a4ff4839a413e28b5 100644
--- a/src/plugins/e-acsl/E_ACSL.ml
+++ b/src/plugins/e-acsl/E_ACSL.ml
@@ -24,30 +24,11 @@
 
 open Cil_types
 
-module Error: sig
-  exception Typing_error of string
-  exception Not_yet of string
-end = Error
+module Error = Error
 
-module Translate: sig
-  exception No_simple_translation of term
-  val term_to_exp: typ option -> term -> exp
-  (** @raise New_typing_error when the given term cannot be typed (something wrong
-      happened with this term)
-      @raise Not_yet when the given term contains an unsupported construct.
-      @raise No_simple_translation when the given term cannot be translated into
-      a single expression. *)
-end = Translate
+module Translate = Translate
 
-module Functions: sig
-  module RTL: sig
-    val is_generated_name: string -> bool
-    (** @return [true] if the prefix of the given name indicates that it has been
-        generated by E-ACSL instrumentation (see [mk_gen_name] function). *)
-  end
-end = Functions
-
-(** No function is directly exported: they are dynamically registered. *)
+module Functions = Functions
 
 (*
 Local Variables:
diff --git a/src/plugins/e-acsl/E_ACSL.mli b/src/plugins/e-acsl/E_ACSL.mli
new file mode 100644
index 0000000000000000000000000000000000000000..590545155a859fa12010075e32be15311b64b281
--- /dev/null
+++ b/src/plugins/e-acsl/E_ACSL.mli
@@ -0,0 +1,64 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of the Frama-C's E-ACSL plug-in.                    *)
+(*                                                                        *)
+(*  Copyright (C) 2012-2020                                               *)
+(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
+(*         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).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(** E-ACSL. *)
+
+open Cil_types
+
+module Error: sig
+  exception Typing_error of string
+  exception Not_yet of string
+end
+
+module Translate: sig
+  exception No_simple_term_translation of term
+  val untyped_term_to_exp: typ option -> term -> exp
+  (** @raise Typing_error when the given term cannot be typed (something wrong
+      happened with this term)
+      @raise Not_yet when the given term contains an unsupported construct.
+      @raise No_simple_term_translation when the given term cannot be translated
+      into a single expression. *)
+
+  exception No_simple_predicate_translation of predicate
+  val untyped_predicate_to_exp: predicate -> exp
+  (** @raise Typing_error when the given predicate cannot be typed
+      (something wrong happened with this predicate).
+      @raise Not_yet when the given predicate contains an unsupported construct.
+      @raise No_simple_predicate_translation when the given predicate cannot be
+      translated into a single expression. *)
+end
+
+module Functions: sig
+  module RTL: sig
+    val is_generated_name: string -> bool
+    (** @return [true] if the prefix of the given name indicates that it has been
+        generated by E-ACSL instrumentation (see [mk_gen_name] function). *)
+  end
+end
+
+(** No function is directly exported: they are dynamically registered. *)
+
+(*
+Local Variables:
+compile-command: "make"
+End:
+*)
diff --git a/src/plugins/e-acsl/Makefile.in b/src/plugins/e-acsl/Makefile.in
index a44d27242911d78ca3342a8cac5779d96a85f5d7..65408186eef27164c5d7e5f98f0d6297d33c74e4 100644
--- a/src/plugins/e-acsl/Makefile.in
+++ b/src/plugins/e-acsl/Makefile.in
@@ -44,6 +44,11 @@ SRC_LIBRARIES:= \
 	varname
 SRC_LIBRARIES:=$(addprefix src/libraries/, $(SRC_LIBRARIES))
 
+# source files that depend on optional dependencies
+SRC_DYN_DEPENDENCIES:= \
+	dep_eva
+SRC_DYN_DEPENDENCIES:=$(addprefix src/dependencies/, $(SRC_DYN_DEPENDENCIES))
+
 # project initializer
 SRC_PROJECT_INITIALIZER:= \
 	rtl \
@@ -55,7 +60,7 @@ SRC_PROJECT_INITIALIZER:=\
 SRC_ANALYSES:= \
 	rte \
 	literal_strings \
-	mmodel_analysis \
+	memory_tracking \
 	exit_points \
 	lscope \
 	interval \
@@ -63,8 +68,13 @@ SRC_ANALYSES:= \
 SRC_ANALYSES:=$(addprefix src/analyses/, $(SRC_ANALYSES))
 
 # code generator
+CODE_GENERATOR_CMI:= \
+	contract_types
+CODE_GENERATOR_CMI:=$(addprefix src/code_generator/, $(CODE_GENERATOR_CMI))
+
 SRC_CODE_GENERATOR:= \
-	constructor \
+	smart_exp \
+	smart_stmt \
 	gmp \
 	label \
 	env \
@@ -72,10 +82,12 @@ SRC_CODE_GENERATOR:= \
 	loops \
 	quantif \
 	at_with_lscope \
-	mmodel_translate \
+	memory_translate \
 	logic_functions \
 	logic_array \
 	translate \
+	contract \
+	translate_annots \
 	temporal \
 	memory_observer \
 	literal_observer \
@@ -91,6 +103,7 @@ PLUGIN_DIR ?=.
 PLUGIN_EXTRA_DIRS:=\
 	src \
 	src/libraries \
+	src/dependencies \
 	src/analyses \
 	src/project_initializer \
 	src/code_generator
@@ -100,22 +113,65 @@ PLUGIN_NAME:=E_ACSL
 PLUGIN_CMO:= src/local_config \
 	src/options \
 	$(SRC_LIBRARIES) \
+	$(SRC_DYN_DEPENDENCIES) \
 	$(SRC_PROJECT_INITIALIZER) \
 	$(SRC_ANALYSES) \
 	$(SRC_CODE_GENERATOR) \
 	src/main
-
+PLUGIN_CMI:= \
+	$(CODE_GENERATOR_CMI)
 PLUGIN_HAS_MLI:=yes
 PLUGIN_DISTRIBUTED:=yes
 PLUGIN_DEPENDENCIES:= RteGen
+PLUGIN_GENERATED:=
 
 # We "save" this variable so that it can be used once PLUGIN_DIR has been reset
 EACSL_PLUGIN_DIR:=$(PLUGIN_DIR)
 
 # Suppress a spurious warning with OCaml >= 4.04.0
-$(EACSL_PLUGIN_DIR)/src/analyses/mmodel_analysis.cmo \
-$(EACSL_PLUGIN_DIR)/src/analyses/mmodel_analysis.cmi: E_ACSL_BFLAGS+= -w -60
-$(EACSL_PLUGIN_DIR)/src/analyses/mmodel_analysis.cmx: E_ACSL_OFLAGS+= -w -60
+$(EACSL_PLUGIN_DIR)/src/analyses/memory_tracking.cmo \
+$(EACSL_PLUGIN_DIR)/src/analyses/memory_tracking.cmi: E_ACSL_BFLAGS+= -w -60
+$(EACSL_PLUGIN_DIR)/src/analyses/memory_tracking.cmx: E_ACSL_OFLAGS+= -w -60
+
+########################
+# Dynamic dependencies #
+########################
+
+# Distributed files for the dynamic dependencies
+EACSL_DISTRIB_DYNDEP:=
+
+# Eva
+DEP_EVA :=src/dependencies/dep_eva
+DEP_EVA_ENABLED :=$(DEP_EVA).enabled.ml
+DEP_EVA_DISABLED :=$(DEP_EVA).disabled.ml
+PLUGIN_GENERATED += $(EACSL_PLUGIN_DIR)/$(DEP_EVA).ml
+
+## Add enabled and disabled files to the list of distributed files
+## (relative to e-acsl directory)
+EACSL_DISTRIB_DYNDEP += $(DEP_EVA_ENABLED) $(DEP_EVA_DISABLED)
+
+## Update enabled and disabled files path to be relative to the root directory
+DEP_EVA_ENABLED:=$(addprefix $(EACSL_PLUGIN_DIR)/, $(DEP_EVA_ENABLED))
+DEP_EVA_DISABLED:=$(addprefix $(EACSL_PLUGIN_DIR)/, $(DEP_EVA_DISABLED))
+
+## Add Eva to the plugin dependencies if enabled
+ifneq "$(ENABLE_EVA)" "no"
+	PLUGIN_DEPENDENCIES+= Eva
+endif
+
+## Copy enabled or disabled file to the source file that will be used for the
+## compilation
+$(EACSL_PLUGIN_DIR)/src/dependencies/dep_eva.ml: \
+		$(DEP_EVA_ENABLED) $(DEP_EVA_DISABLED) \
+		$(EACSL_PLUGIN_DIR)/Makefile share/Makefile.config
+	$(PRINT_MAKING) $@
+	$(RM) $@
+ifneq "$(ENABLE_EVA)" "no"
+	$(CP) $(DEP_EVA_ENABLED) $@
+else
+	$(CP) $(DEP_EVA_DISABLED) $@
+endif
+	$(CHMOD_RO) $@
 
 ###############
 # Local Flags #
@@ -127,7 +183,7 @@ IS_DISTRIBUTED:=no
 # Local configuration #
 #######################
 
-PLUGIN_GENERATED:= $(EACSL_PLUGIN_DIR)/src/local_config.ml
+PLUGIN_GENERATED += $(EACSL_PLUGIN_DIR)/src/local_config.ml
 
 VERSION_FILE=$(FRAMAC_ROOT_SRCDIR)/VERSION
 
@@ -159,7 +215,7 @@ PLUGIN_TESTS_DIRS := \
 	arith \
 	memory \
 	gmp-only \
-	full-mmodel \
+	full-mtracking \
 	format \
 	temporal \
 	special
@@ -290,8 +346,8 @@ EACSL_TEST_FILES = \
 	tests/test_config_ci.in \
 	tests/gmp-only/test_config_ci \
 	tests/gmp-only/test_config_dev \
-	tests/full-mmodel/test_config_ci \
-	tests/full-mmodel/test_config_dev \
+	tests/full-mtracking/test_config_ci \
+	tests/full-mtracking/test_config_dev \
 	tests/builtin/test_config_ci \
 	tests/builtin/test_config_dev \
 	tests/temporal/test_config_ci \
@@ -323,6 +379,7 @@ EACSL_MISC_FILES = \
 EACSL_SHARE_FILES = share/e-acsl/*.[ch] share/e-acsl/*/*.[ch]
 
 EACSL_DISTRIB_EXTERNAL =\
+  $(EACSL_DISTRIB_DYNDEP) \
   $(EACSL_SHARE_FILES) \
   $(EACSL_MISC_FILES) \
   $(EACSL_DOC_FILES) \
@@ -398,18 +455,25 @@ include $(FRAMAC_SHARE)/Makefile.dynamic
 
 EACSL_INSTALL_MANUAL_FILES=$(wildcard $(addprefix $(EACSL_PLUGIN_DIR)/, $(EACSL_MANUAL_FILES)))
 
+EACSL_INSTALL_C_DIRECTORIES := \
+	e-acsl \
+	e-acsl/internals \
+	e-acsl/instrumentation_model \
+	e-acsl/observation_model \
+	e-acsl/observation_model/internals \
+	e-acsl/observation_model/bittree_model \
+	e-acsl/observation_model/segment_model \
+	e-acsl/numerical_model \
+	e-acsl/libc_replacements
+
 install::
 	$(PRINT_INSTALL) E-ACSL share files
-	$(MKDIR) $(FRAMAC_DATADIR)/e-acsl
-	$(CP) $(E_ACSL_DIR)/share/e-acsl/*.[ch] $(FRAMAC_DATADIR)/e-acsl
-	$(MKDIR) $(FRAMAC_DATADIR)/e-acsl/bittree_model \
-	         $(FRAMAC_DATADIR)/e-acsl/segment_model
-	$(CP) $(E_ACSL_DIR)/share/e-acsl/bittree_model/* \
-	      $(FRAMAC_DATADIR)/e-acsl/bittree_model
-	$(CP) $(E_ACSL_DIR)/share/e-acsl/segment_model/* \
-	      $(FRAMAC_DATADIR)/e-acsl/segment_model
-        # manuals are not present in standard distribution.
-        # Don't fail because of that.
+	for dir in $(EACSL_INSTALL_C_DIRECTORIES); do \
+		$(MKDIR) $(FRAMAC_DATADIR)/$$dir && \
+		$(CP) $(E_ACSL_DIR)/share/$$dir/*.[ch] $(FRAMAC_DATADIR)/$$dir ; \
+	done
+	# manuals are not present in standard distribution.
+	# Don't fail because of that.
 ifneq ("$(EACSL_INSTALL_MANUAL_FILES)","")
 	$(PRINT_INSTALL) E-ACSL manuals
 	$(MKDIR) $(FRAMAC_DATADIR)/manuals
diff --git a/src/plugins/e-acsl/doc/Changelog b/src/plugins/e-acsl/doc/Changelog
index caec156e2bce6ce838c1bb9d1c4957685e808264..7f0e79e4a4ae6417fc10bef94e80e4437d76c49f 100644
--- a/src/plugins/e-acsl/doc/Changelog
+++ b/src/plugins/e-acsl/doc/Changelog
@@ -25,9 +25,17 @@
 Plugin E-ACSL <next-release>
 ############################
 
+-  E-ACSL       [2020-09-22] Support of complete and disjoint behavior
+                (frama-c/e-acsl#92 and frama-c/e-acsl#27).
+-* runtime      [2020-09-15] Fix wrong value returned for the stack size in the
+                segment memory model (frama-c/e-acsl#126).
+-  E-ACSL       [2020-09-15] Deprecate -e-acsl-full-mmodel in favor of
+                -e-acsl-full-mtracking.
+-  e-acsl-gcc   [2020-09-15] Deprecate --full-mmodel in favor of
+                --full-mtracking.
 -* E-ACSL       [2020-08-28] Fix crash that may occur when translating
-	        properties that have been proved valid by another plug-in
-	        (frama-c/e-acsl#106).
+                properties that have been proved valid by another plug-in
+                (frama-c/e-acsl#106).
 -! E-ACSL       [2020-08-28] Remove option -e-acsl-prepare-ast.
 -! E-ACSL       [2020-08-28] Remove option -e-acsl-check.
 -  E-ACSL       [2020-08-07] Add support for logical array comparison
diff --git a/src/plugins/e-acsl/doc/refman/changes_modern.tex b/src/plugins/e-acsl/doc/refman/changes_modern.tex
index 4f0069fb4e7c0d7e473ef5906dc90906f4b35de0..9e419b0fc1d84c7e97754ddf782071981b44aea8 100644
--- a/src/plugins/e-acsl/doc/refman/changes_modern.tex
+++ b/src/plugins/e-acsl/doc/refman/changes_modern.tex
@@ -137,6 +137,8 @@ in \lstinline|\\at|}
 \item \changeinsection{reals}{support of rational numbers and operations}
 \item \changeinsection{fn-behavior}{remove abrupt clauses from the list of
   exceptions}
+\item \changeinsection{fn-behavior}{support of \lstinline|complete behaviors|
+  and \lstinline|disjoint behaviors|}
 \item \changeinsection{statement_contract}{remove abrupt clauses from the list
   of exceptions}
 \item \changeinsection{abrupt}{add grammar for abrupt termination}
diff --git a/src/plugins/e-acsl/doc/refman/fn_behavior.tex b/src/plugins/e-acsl/doc/refman/fn_behavior.tex
index cf6a3ebb9814ededf4a8f31d03341f3c099b2692..6db1b9dfa974cf8e773bb668896416f3de2f282f 100644
--- a/src/plugins/e-acsl/doc/refman/fn_behavior.tex
+++ b/src/plugins/e-acsl/doc/refman/fn_behavior.tex
@@ -1,7 +1,7 @@
 \begin{syntax}
   [ function-contract ] ::= requires-clause*
                             { decreases-clause? } simple-clause*
-                            named-behavior* { completeness-clause* }
+                            named-behavior* completeness-clause*
   \
   requires-clause ::= "requires" pred ";"
   \
@@ -24,6 +24,6 @@
   \
   assumes-clause ::= "assumes" pred ";"
   \
-  { completeness-clause } ::= { "complete" "behaviors" (id (","id)*)? ";" } ;
-     | { "disjoint" "behaviors" (id (","id)*)? ";" }
+  completeness-clause ::= "complete" "behaviors" (id (","id)*)? ";"
+                        | "disjoint" "behaviors" (id (","id)*)? ";"
 \end{syntax}
diff --git a/src/plugins/e-acsl/doc/refman/intro_modern.tex b/src/plugins/e-acsl/doc/refman/intro_modern.tex
index 869c0d0e427e8504a1638ab7d97df20c439366a4..ef546063d84e099f17b5c1c8c101bcc4931f2042 100644
--- a/src/plugins/e-acsl/doc/refman/intro_modern.tex
+++ b/src/plugins/e-acsl/doc/refman/intro_modern.tex
@@ -70,8 +70,7 @@ currently implemented into the \framac's \eacsl plug-in.
       & assigns \\
       & allocates \\
       & decreases \\
-      & abrupt termination \\
-      & complete and disjoint behaviors
+      & abrupt termination
       \\
       \hline
     \end{tabular}
diff --git a/src/plugins/e-acsl/doc/userman/limitations.tex b/src/plugins/e-acsl/doc/userman/limitations.tex
index c42ab93808d1fb2fbfb644ce3e4293bbeb443485..45caa5d91dc753ea7b10f85f37b2c7ed3b01dae8 100644
--- a/src/plugins/e-acsl/doc/userman/limitations.tex
+++ b/src/plugins/e-acsl/doc/userman/limitations.tex
@@ -87,9 +87,9 @@ plug-in is running (see examples of Sections~\ref{sec:no-main} and
 
 The instrumentation in the generated program is partial for every program
 without main containing memory-related annotations, except if the option
-\optionuse{-}{e-acsl-full-mmodel} or the \eacsl plug-in (of \shortopt{M} option
-of \eacslgcc) is provided. In that case, violations of such annotations are
-undetected.
+\optionuse{-}{e-acsl-full-mtracking} or the \eacsl plug-in (of \shortopt{M}
+option of \eacslgcc) is provided. In that case, violations of such annotations
+are undetected.
 
 Consider the following example.
 
@@ -144,7 +144,7 @@ instrumented code (linked against this main) could print some warnings from the
 \index{Function!Undefined}
 
 The instrumentation in the generated program is partial for a program $p$ if $p$
-contains a memory-related annotation $a$ and an undefined function 
+contains a memory-related annotation $a$ and an undefined function
 $f$ such that:
 \begin{itemize}
 \item either $f$ has an (even indirect) effect on a left-value occurring in $a$;
diff --git a/src/plugins/e-acsl/doc/userman/provides.tex b/src/plugins/e-acsl/doc/userman/provides.tex
index accd222ac1c299c54589bc2c69647b8855ab3ec6..f9dedfdf86881ca09adbaa043b83b45d4bb5087a 100644
--- a/src/plugins/e-acsl/doc/userman/provides.tex
+++ b/src/plugins/e-acsl/doc/userman/provides.tex
@@ -550,7 +550,7 @@ this means that
 is, however, still possible to systematically instrument the code for handling
 potential memory-related annotations even when it is not required.  This
 feature can be enabled using the \shortopt{M} switch of \eacslgcc or
-\shortopt{e-acsl-full-mmodel} option of the \eacsl plug-in.
+\shortopt{e-acsl-full-mtracking} option of the \eacsl plug-in.
 
 \begin{important}
 The above-mentioned static analysis is probably the less robust part of \eacsl
diff --git a/src/plugins/e-acsl/dune b/src/plugins/e-acsl/dune
index a70d4fff9c301636814f13e425d2b40d7b8bdf27..06692e97e383524ff6b195d34db18bef84b4f6af 100644
--- a/src/plugins/e-acsl/dune
+++ b/src/plugins/e-acsl/dune
@@ -1,8 +1,12 @@
 ( library
-  (name eacsl)
+  (name E_ACSL)
   (public_name frama-c-e-acsl.core)
   (flags -open Frama_c_kernel)
-  (libraries frama-c.kernel)
+ (libraries frama-c.kernel
+  (select dep_eva.ml from
+        (frama-c-eva.core -> dep_eva.enabled.ml)
+        ( -> dep_eva.disabled.ml)
+ ))
 )
 
 (plugin (optional) (name e-acsl) (libraries frama-c-e-acsl.core) (site (frama-c plugins)))
@@ -11,4 +15,5 @@
 (copy_files# src/analyses/*.ml*)
 (copy_files# src/code_generator/*.ml*)
 (copy_files# src/libraries/*.ml*)
+(copy_files# src/dependencies/*.ml*)
 (copy_files# src/project_initializer/*.ml*)
diff --git a/src/plugins/e-acsl/examples/contracts/function_contract.c b/src/plugins/e-acsl/examples/contracts/function_contract.c
new file mode 100644
index 0000000000000000000000000000000000000000..24d6902df9b18467c4cd865239850bb0c73b9f32
--- /dev/null
+++ b/src/plugins/e-acsl/examples/contracts/function_contract.c
@@ -0,0 +1,42 @@
+#include <limits.h>
+
+/*@
+    requires value > INT_MIN;
+    ensures \result == value;
+
+    behavior neg:
+        assumes value < 0;
+        requires value < 1;
+        ensures \result == value;
+
+    behavior pos:
+        assumes value >= 0;
+        requires value > -1;
+        ensures \result == value;
+
+    behavior odd:
+        assumes value % 2 == 1;
+        requires (value % 2) - 1 == 0;
+        ensures \result == value;
+
+    behavior even:
+        assumes value % 2 == 0;
+        requires (value % 2) + 1 == 1;
+        ensures \result == value;
+
+    complete behaviors neg, pos;
+    complete behaviors odd, even;
+    complete behaviors;
+
+    disjoint behaviors neg, pos;
+    disjoint behaviors odd, even;
+*/
+int f(int value) {
+    return value;
+}
+
+int main() {
+    f(3);
+    return 0;
+}
+
diff --git a/src/plugins/e-acsl/examples/contracts/statement_contract.c b/src/plugins/e-acsl/examples/contracts/statement_contract.c
new file mode 100644
index 0000000000000000000000000000000000000000..12d2ecefd0165bf2afcd1d764fb45075bfdbebfa
--- /dev/null
+++ b/src/plugins/e-acsl/examples/contracts/statement_contract.c
@@ -0,0 +1,42 @@
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+
+int main() {
+    int value, sign, result;
+
+    srand(time(NULL));
+    value = rand();
+    sign = rand();
+    if (sign % 2) {
+        value = -value;
+    }
+
+    /*@
+        requires value > INT_MIN;
+        assigns result;
+        ensures result >= 0;
+
+        behavior pos:
+            assumes value >= 0;
+            ensures result == value;
+
+        behavior neg:
+            assumes value < 0;
+            ensures result == -value;
+
+        complete behaviors;
+        disjoint behaviors;
+    */
+    if (value < 0) {
+        result = -value;
+    } else {
+        result = value;
+    }
+
+    printf("Value: %d, Result: %d\n", value, result);
+
+    return 0;
+}
+
diff --git a/src/plugins/e-acsl/examples/known_bugs/let-alias.c b/src/plugins/e-acsl/examples/known_bugs/let-alias.c
index 25af1ec3080abc2de0e9850d8d478a7617aa7488..8529a4461186a5715ee39f30c252c1a5409f428e 100644
--- a/src/plugins/e-acsl/examples/known_bugs/let-alias.c
+++ b/src/plugins/e-acsl/examples/known_bugs/let-alias.c
@@ -2,7 +2,7 @@
    DONTRUN:
 */
 
-/* let binding on alias: only work with -e-acsl-full-mmodel;
+/* let binding on alias: only work with -e-acsl-full-mtracking;
    should not be the case. */
 
 int main(void) {
diff --git a/src/plugins/e-acsl/headers/header_spec.txt b/src/plugins/e-acsl/headers/header_spec.txt
index 41708b793a5ad7c2b97a1cf4fb703068e7457a1f..cf2b2a13c0e9dec43354173a1758d67cf4a4132d 100644
--- a/src/plugins/e-acsl/headers/header_spec.txt
+++ b/src/plugins/e-acsl/headers/header_spec.txt
@@ -11,31 +11,61 @@ license/SPARETIMELABS: .ignore
 license/headache_config.txt: .ignore
 man/e-acsl-gcc.sh.1: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 scripts/e-acsl-gcc.sh: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/bittree_model/e_acsl_bittree.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/bittree_model/e_acsl_bittree_api.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/bittree_model/e_acsl_bittree_mmodel.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/instrumentation_model/e_acsl_assert.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/instrumentation_model/e_acsl_assert.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/instrumentation_model/e_acsl_contract.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/instrumentation_model/e_acsl_contract.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/instrumentation_model/e_acsl_temporal.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/instrumentation_model/e_acsl_temporal.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/instrumentation_model/e_acsl_temporal_timestamp.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/internals/e_acsl_alias.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/internals/e_acsl_bits.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/internals/e_acsl_bits.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/internals/e_acsl_debug.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/internals/e_acsl_debug.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/internals/e_acsl_malloc.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/internals/e_acsl_malloc.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/internals/e_acsl_private_assert.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/internals/e_acsl_private_assert.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/internals/e_acsl_rtl_io.c: MODIFIED_SPARETIMELABS
+share/e-acsl/internals/e_acsl_rtl_io.h: MODIFIED_SPARETIMELABS
+share/e-acsl/internals/e_acsl_rtl_string.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/internals/e_acsl_rtl_string.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/internals/e_acsl_shexec.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/internals/e_acsl_shexec.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/internals/e_acsl_trace.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/internals/e_acsl_trace.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/libc_replacements/e_acsl_stdio.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/libc_replacements/e_acsl_stdio.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/libc_replacements/e_acsl_string.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/libc_replacements/e_acsl_string.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/numerical_model/e_acsl_floating_point.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/numerical_model/e_acsl_floating_point.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/numerical_model/e_acsl_gmp_api.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/bittree_model/e_acsl_bittree.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/bittree_model/e_acsl_bittree.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/bittree_model/e_acsl_bittree_observation_model.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/bittree_model/e_acsl_bittree_omodel_debug.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/bittree_model/e_acsl_bittree_timestamp_retrieval.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/internals/e_acsl_heap_tracking.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/internals/e_acsl_heap_tracking.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/internals/e_acsl_omodel_debug.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/internals/e_acsl_safe_locations.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/internals/e_acsl_safe_locations.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/internals/e_acsl_timestamp_retrieval.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/segment_model/e_acsl_segment_observation_model.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/segment_model/e_acsl_segment_omodel_debug.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/segment_model/e_acsl_segment_timestamp_retrieval.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/e_acsl_heap.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/e_acsl_heap.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/e_acsl_observation_model.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+share/e-acsl/observation_model/e_acsl_observation_model.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 share/e-acsl/e_acsl.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_alias.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_assert.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_bits.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_debug.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_floating_point.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_format.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_gmp_api.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_leak.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_libc_replacements.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_malloc.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_printf.h: MODIFIED_SPARETIMELABS
 share/e-acsl/e_acsl_rtl.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_safe_locations.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_shexec.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_string.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_temporal.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_temporal_timestamp.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/e_acsl_trace.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/segment_model/e_acsl_segment_mmodel.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/segment_model/e_acsl_segment_tracking.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-share/e-acsl/segment_model/e_acsl_shadow_layout.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/analyses/exit_points.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/analyses/exit_points.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/analyses/interval.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
@@ -44,16 +74,17 @@ src/analyses/literal_strings.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/analyses/literal_strings.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/analyses/lscope.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/analyses/lscope.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-src/analyses/mmodel_analysis.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-src/analyses/mmodel_analysis.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/analyses/memory_tracking.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/analyses/memory_tracking.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/analyses/rte.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/analyses/rte.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/analyses/typing.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/analyses/typing.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/code_generator/at_with_lscope.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/code_generator/at_with_lscope.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-src/code_generator/constructor.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-src/code_generator/constructor.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/code_generator/contract.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/code_generator/contract.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/code_generator/contract_types.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/code_generator/env.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/code_generator/env.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/code_generator/global_observer.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
@@ -74,16 +105,25 @@ src/code_generator/loops.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/code_generator/loops.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/code_generator/memory_observer.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/code_generator/memory_observer.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-src/code_generator/mmodel_translate.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
-src/code_generator/mmodel_translate.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/code_generator/memory_translate.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/code_generator/memory_translate.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/code_generator/quantif.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/code_generator/quantif.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/code_generator/rational.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/code_generator/rational.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/code_generator/smart_exp.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/code_generator/smart_exp.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/code_generator/smart_stmt.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/code_generator/smart_stmt.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/code_generator/temporal.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/code_generator/temporal.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/code_generator/translate.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/code_generator/translate.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/code_generator/translate_annots.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/code_generator/translate_annots.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/dependencies/dep_eva.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/dependencies/dep_eva.enabled.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/dependencies/dep_eva.disabled.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/libraries/builtins.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/libraries/builtins.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/libraries/error.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
@@ -111,8 +151,8 @@ tests/builtin/test_config_ci: .ignore
 tests/builtin/test_config_dev: .ignore
 tests/format/test_config_ci: .ignore
 tests/format/test_config_dev: .ignore
-tests/full-mmodel/test_config_ci: .ignore
-tests/full-mmodel/test_config_dev: .ignore
+tests/full-mtracking/test_config_ci: .ignore
+tests/full-mtracking/test_config_dev: .ignore
 tests/gmp-only/test_config_ci: .ignore
 tests/gmp-only/test_config_dev: .ignore
 tests/temporal/test_config_ci: .ignore
diff --git a/src/plugins/e-acsl/man/e-acsl-gcc.sh.1 b/src/plugins/e-acsl/man/e-acsl-gcc.sh.1
index e4c6801d21f29c194931cca19852edad9f241f9f..39e15364d47e040dab2ff1715b5a31109a079ed7 100644
--- a/src/plugins/e-acsl/man/e-acsl-gcc.sh.1
+++ b/src/plugins/e-acsl/man/e-acsl-gcc.sh.1
@@ -99,7 +99,7 @@ pass additional arguments to the \fBFrama-C\fP pre-processor.
 .B -L, --frama-c-stdlib
 use the \fBFrama-C\fP standard library instead of a system-wide one.
 .TP
-.B -M, --full-mmodel
+.B -M, --full-mtracking
 maximize memory-related instrumentation.
 .TP
 .B --temporal
diff --git a/src/plugins/e-acsl/scripts/e-acsl-gcc.comp b/src/plugins/e-acsl/scripts/e-acsl-gcc.comp
index 4e075e196a591c2729f55a6152d52ade99430459..b05f8fe127e674e8d15bae4d8787f5c43fc8b0c4 100644
--- a/src/plugins/e-acsl/scripts/e-acsl-gcc.comp
+++ b/src/plugins/e-acsl/scripts/e-acsl-gcc.comp
@@ -3,7 +3,7 @@
 #  This file is part of the Frama-C's E-ACSL plug-in.                    #
 #                                                                        #
 #  Copyright (C) 2012-2018                                               #
-#    CEA (Commissariat à l'énergie atomique et aux énergies              #
+#    CEA (Commissariat � l'�nergie atomique et aux �nergies              #
 #         alternatives)                                                  #
 #                                                                        #
 #  you can redistribute it and/or modify it under the terms of the GNU   #
@@ -39,7 +39,7 @@ _eacsl_gcc() {
     --frama-c-extra= --frama-c= --gcc= --e-acsl-share= --memory-model=
     --e-acsl-extra=
     --compile --compile-only --print-mmodels --frama-c-only --instrumented-only
-    --gmp --full-mmodel --rte= --rte-select= --no-int-overflow
+    --gmp --full-mtracking --rte= --rte-select= --no-int-overflow
     --no-stdlib --frama-c-stdlib --libc-replacements
     --temporal --free-valid-address --weak-validity --validate-format-strings
     --heap-size --stack-size"
diff --git a/src/plugins/e-acsl/scripts/e-acsl-gcc.sh b/src/plugins/e-acsl/scripts/e-acsl-gcc.sh
index c81e38218fb5c94dd3c75e247668f17b12f8e554..fe84dce4a7fd578c342bc564dcb4f41bdabdbcfd 100755
--- a/src/plugins/e-acsl/scripts/e-acsl-gcc.sh
+++ b/src/plugins/e-acsl/scripts/e-acsl-gcc.sh
@@ -32,6 +32,11 @@ error () {
   fi
 }
 
+# Print a warning message to STDERR.
+warning () {
+  echo "e-acsl-gcc: warning: $1" 1>&2
+}
+
 # Check if a given executable name can be found by in the PATH
 has_tool() {
   which "$@" >/dev/null 2>&1 && return 0 || return 1
@@ -264,8 +269,8 @@ check_getopt;
 
 # Getopt options
 LONGOPTIONS="help,compile,compile-only,debug:,ocode:,oexec:,verbose:,
-  frama-c-only,extra-cpp-args:,frama-c-stdlib,full-mmodel,gmp,quiet,logfile:,
-  ld-flags:,cpp-flags:,frama-c-extra:,memory-model:,keep-going,
+  frama-c-only,extra-cpp-args:,frama-c-stdlib,full-mmodel,full-mtracking,gmp,
+  quiet,logfile:,ld-flags:,cpp-flags:,frama-c-extra:,memory-model:,keep-going,
   frama-c:,gcc:,e-acsl-share:,instrumented-only,rte:,oexec-e-acsl:,
   print-mmodels,rt-debug,rte-select:,then,e-acsl-extra:,check,fail-with-code:,
   temporal,weak-validity,stack-size:,heap-size:,rt-verbose,free-valid-address,
@@ -292,7 +297,7 @@ OPTION_OUTPUT_EXEC="a.out"               # Generated executable name
 OPTION_EACSL_OUTPUT_EXEC=""              # Name of E-ACSL executable
 OPTION_EACSL="-e-acsl"                   # Specifies E-ACSL run
 OPTION_FRAMA_STDLIB="-no-frama-c-stdlib" # Use Frama-C stdlib
-OPTION_FULL_MMODEL=                      # Instrument as much as possible
+OPTION_FULL_MTRACKING=                      # Instrument as much as possible
 OPTION_GMP=                              # Use GMP integers everywhere
 OPTION_EACSL_MMODELS="segment"           # Memory model used
 OPTION_EACSL_SHARE=                      # Custom E-ACSL share directory
@@ -489,9 +494,13 @@ do
       OPTION_FRAMA_STDLIB="-frama-c-stdlib"
     ;;
     # Use as much memory-related instrumentation as possible
-    -M|--full-mmodel)
+    -M|--full-mtracking|--full-mmodel)
+      if [ "$i" = "--full-mmodel" ]; then
+        warning "--full-mmodel is a deprecated alias for option --full-mtracking."
+        warning "Please use --full-mtracking instead."
+      fi
       shift;
-      OPTION_FULL_MMODEL="-e-acsl-full-mmodel"
+      OPTION_FULL_MTRACKING="-e-acsl-full-mtracking"
     ;;
     # Use GMP everywhere
     -g|--gmp)
@@ -780,7 +789,7 @@ if [ -n "$OPTION_EACSL" ]; then
     $OPTION_EACSL
     $OPTION_GMP
     $OPTION_LIBC_REPLACEMENTS
-    $OPTION_FULL_MMODEL
+    $OPTION_FULL_MTRACKING
     $OPTION_TEMPORAL
     $OPTION_VERBOSE
     $OPTION_DEBUG
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl.h b/src/plugins/e-acsl/share/e-acsl/e_acsl.h
index e046cc017a73b9471b1b28a5434c9d8127fb2d24..a39a76b8ea612292015f57cb9d09413a13e848b9 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl.h
+++ b/src/plugins/e-acsl/share/e-acsl/e_acsl.h
@@ -21,550 +21,87 @@
 /**************************************************************************/
 
 /*! ***********************************************************************
- * \file   e_acsl.h
+ * \file
  * \brief  Public C API of E-ACSL Runtime Library
  *
  * Functions and variables with non-static linkage used for instrumentation.
 ***************************************************************************/
 
-#ifndef E_ACSL_MMODEL_H
-#define E_ACSL_MMODEL_H
+/* Memory model settings
+ *    Memory model:
+ *      E_ACSL_BITTREE_MMODEL - use Patricia-trie (tree-based) memory model, or
+ *      E_ACSL_SEGMENT_MMODEL - use segment-based (shadow) memory model
+ *    Verbosity level:
+ *      E_ACSL_VERBOSE - put an executable in verbose mode that
+ *        prints extra messages (unset by default)
+ *    Debug Features:
+ *      E_ACSL_DEBUG - enable debug features in RTL (unset by default)
+ *      E_ACSL_DEBUG_VERBOSE - verbose debug output (via DVLOG macro)
+ *      E_ACSL_DEBUG_LOG - name of the log file where debug messages are
+ *        output. The file name should be unquoted string with '-'
+ *        (set by default) indicating a standard stream
+ *    Validity:
+ *      E_ACSL_WEAK_VALIDITY - use notion of weak validity
+ *        Given an expression `(p+i)`, where `p` is a pointer and `i` is an
+ *        integer offset weak validity indicates that `(p+i)` is valid if it
+ *        belongs to memory allocation. In strong validity `(p+i)` is valid
+ *        iff both `p` and `(p+i)` belong to memory allocation and to the same
+ *        memory block.
+ *    Temporal analysis:
+ *      E_ACSL_TEMPORAL - enable temporal analysis in RTL
+ *    Assertions:
+ *      E_ACSL_NO_ASSERT_FAIL - do not issue abort signal of E-ACSL
+ *        assertion failure
+ *      E_ACSL_FAIL_EXITCODE - do not issue abort signal but exit with a
+ *        given code
+ *    Shadow spaces (only for segment model):
+ *      E_ACSL_STACK_SIZE - size (in MB) of the tracked program stack
+ *      E_ACSL_HEAP_SIZE - size (in MB) of the tracked program heap
+ *    String functions:
+ *      E_ACSL_NO_COMPILER_BUILTINS - if undefined (default) then use
+ *      compiler builtin string functions (e.g., memset -> __builtin_memset)
+ *    Behaviour of assert:
+ *      E_ACSL_EXTERNAL_ASSERT - if this macro is defined then function
+ *      `__e_acsl_assert` is excluded from compilation. This is to allow
+ *      providing alternative definitions of assertions by users.
+ *    Memory deallocation:
+ *      E_ACSL_FREE_VALID_ADDRESS -- Clause 7.20.3.2 of C99 standard states
+ *      that NULL is a valid input to free:
+ *        "The free function causes the space pointed to by ptr [its argument]
+ *         to be deallocated, that is, made available for further allocation.
+ *         If ptr is a null pointer, no action occurs."
+ *      Yet, some tools insist that it is a bug. For instance, there is a
+ *      bunch of test cases in Toyota ITC Benchmarks. To make such tools
+ *      happy the following option is introduced. By default it should be
+ *      undefined (disabled) though.
+*/
+
+/************************************************************************/
+/*** User API {{{ ***/
+/************************************************************************/
+
+#include "instrumentation_model/e_acsl_assert.h"
+#include "observation_model/e_acsl_heap.h"
 
-#include <stddef.h>
-#include <stdio.h>
-#include "e_acsl_alias.h"
-
-/************************************************************************/
-/*** API Prefixes {{{ ***/
-/************************************************************************/
-
-/* Assert */
-#define sound_verdict         export_alias(sound_verdict)
-#define assert                export_alias(assert)
-
-/* Tracking */
-#define delete_block          export_alias(delete_block)
-#define store_block           export_alias(store_block)
-#define store_block_duplicate export_alias(store_block_duplicate)
-
-/* Predicates */
-#define offset                export_alias(offset)
-#define base_addr             export_alias(base_addr)
-#define block_length          export_alias(block_length)
-#define valid_read            export_alias(valid_read)
-#define valid                 export_alias(valid)
-#define initialized           export_alias(initialized)
-#define freeable              export_alias(freeable)
-
-/* Block initialization  */
-#define mark_readonly         export_alias(mark_readonly)
-#define initialize            export_alias(initialize)
-#define full_init             export_alias(full_init)
-
-/* Libc drop-in replacements */
-#define builtin_strlen   export_alias(builtin_strlen)
-#define builtin_strcpy   export_alias(builtin_strcpy)
-#define builtin_strncpy  export_alias(builtin_strncpy)
-#define builtin_strcat   export_alias(builtin_strcat)
-#define builtin_strncat  export_alias(builtin_strncat)
-#define builtin_strncat  export_alias(builtin_strncat)
-#define builtin_strcmp   export_alias(builtin_strcmp)
-#define builtin_strncmp  export_alias(builtin_strncmp)
-#define builtin_memcpy   export_alias(builtin_memcpy)
-#define builtin_memset   export_alias(builtin_memset)
-#define builtin_memcmp   export_alias(builtin_memcmp)
-#define builtin_memmove  export_alias(builtin_memmove)
-
-/* stdio.h replacement functions */
-#define builtin_printf   export_alias(builtin_printf)
-#define builtin_fprintf  export_alias(builtin_fprintf)
-#define builtin_dprintf  export_alias(builtin_dprintf)
-#define builtin_sprintf  export_alias(builtin_sprintf)
-#define builtin_snprintf export_alias(builtin_snprintf)
-#define builtin_syslog   export_alias(builtin_syslog)
-
-/* Memory state initialization */
-#define memory_clean          export_alias(memory_clean)
-#define mspaces_init          export_alias(mspaces_init)
-#define memory_init           export_alias(memory_init)
-
-/* Heap size */
-#define heap_allocation_size      export_alias(heap_allocation_size)
-#define get_heap_allocation_size  export_alias(get_heap_allocation_size)
-
-/* Temporal analysis */
-/* No need to encapsulate via ifdef: using these extra definitions does
-   not hurt, otherwise need to pass additional parameters to frama-c */
-#define temporal_store_nblock             export_alias(temporal_store_nblock)
-#define temporal_store_nreferent          export_alias(temporal_store_nreferent)
-#define temporal_save_nblock_parameter    export_alias(temporal_save_nblock_parameter)
-#define temporal_save_nreferent_parameter export_alias(temporal_save_nreferent_parameter)
-#define temporal_save_copy_parameter  export_alias(temporal_save_copy_parameter)
-#define temporal_pull_parameter           export_alias(temporal_pull_parameter)
-#define temporal_save_return              export_alias(temporal_save_return)
-#define temporal_reset_parameters        export_alias(temporal_reset_parameters)
-#define temporal_pull_return              export_alias(temporal_pull_return)
-#define temporal_reset_return             export_alias(temporal_reset_return)
-#define temporal_memcpy                   export_alias(temporal_memcpy)
-#define temporal_memset                   export_alias(temporal_memset)
-
-/* Infinity values for floating point types */
-#define math_HUGE_VAL                   export_alias(math_HUGE_VAL)
-#define math_HUGE_VALF                  export_alias(math_HUGE_VALF)
-#define math_INFINITY                   export_alias(math_INFINITY)
-#define floating_point_exception        export_alias(floating_point_exception)
-/* }}} */
-
-/************************************************************************/
-/*** Assertion {{{ ***/
-/************************************************************************/
-
-/*! \brief Runtime assertion verifying a given predicate
- *  \param pred  integer code of a predicate
- *  \param kind  C string representing a kind an annotation (e.g., "Assertion")
- *  \param fct
- *  \param pred_txt  stringified predicate
- *  \param file un-instrumented file of predicate placement
- *  \param line line of predicate placement in the un-instrumented file */
-/*@ requires pred != 0;
-  @ assigns \nothing; */
-void assert(int pred, const char *kind, const char *fct, const char *pred_txt,
-    const char * file, int line)
-  __attribute__((FC_BUILTIN));
-/* }}} */
-
-/************************************************************************/
-/*** Dynamic memory allocation {{{ ***/
-/************************************************************************/
-
-/*! \brief Drop-in replacement for \p malloc with memory tracking enabled.
- * For further information, see \p malloc(3). */
-void * malloc(size_t size)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Drop-in replacement for \p calloc with memory tracking enabled.
- * For further information, see \p calloc(3). */
-void * calloc(size_t nbr_elt, size_t size_elt)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Drop-in replacement for \p realloc with memory tracking enabled.
- * For further information, see realloc(3) */
-void * realloc(void * ptr, size_t size)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Drop-in replacement for \p free with memory tracking enabled.
- * For further information, see \p free(3). */
-void free(void * ptr)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Allocate `size` bytes of memory such that the allocation's base
- * address is an even multiple of alignment.
- *
- * \param alignment - should be the power of two
- * \param size - should be the multiple of alignment
- * \return - pointer to the allocated memory if the restrictions placed on size
- *   and alignment parameters hold. NULL is returned otherwise. */
-void *aligned_alloc(size_t alignment, size_t size)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Allocate size bytes and place the address of the allocated memory in
- * `*memptr`.  The address of the allocated memory will be a multiple of
- * `alignment`, which must be a power of two and a multiple of `sizeof(void*)`.
- * If size  is  0, then the value placed in *memptr is NULL. */
-int posix_memalign(void **memptr, size_t alignment, size_t size)
-  __attribute__((FC_BUILTIN));
 /* }}} */
 
 /************************************************************************/
-/*** Memory tracking {{{ ***/
+/*** Generated code API {{{ ***/
 /************************************************************************/
 
-/*! \brief Initialize memory locations. */
-void mspaces_init()
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Initialize memory tracking state.
- * Called before any other statement in \p main */
-/*@ assigns \nothing; */
-void memory_init(int *argc_ref, char ***argv, size_t ptr_size)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Clean-up memory tracking state before a program's termination. */
-/*@ assigns \nothing; */
-void memory_clean(void)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Store stack or globally-allocated memory block
- * starting at an address given by \p ptr.
- *
- * \param ptr base address of the tracked memory block
- * \param size size of the tracked block in bytes */
-/*@ ensures \result == ptr;
-  @ assigns \result \from *(((char*)ptr)+(0..size-1)), ptr, size; */
-void * store_block(void * ptr, size_t size)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Same as `store_block`, but first check
- * checks whether a block with a base address given by `ptr` exists in the
- * tracked allocation and remove it before storing a new block.
- *
- * \param ptr base address of the tracked memory block
- * \param size size of the tracked block in bytes */
-/*@ ensures \result == ptr;
-  @ assigns \result \from *(((char*)ptr)+(0..size-1)), ptr, size; */
-void * store_block_duplicate(void * ptr, size_t size)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Remove a memory block which base address is \p ptr from tracking. */
-/*@ assigns \nothing; */
-void delete_block(void * ptr)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Mark the \p size bytes starting at an address given by \p ptr as
- * initialized. */
-/*@ assigns \nothing; */
-void initialize(void * ptr, size_t size)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Mark all bytes belonging to a memory block which start address is
- * given by \p ptr as initialized. */
-/*@ assigns \nothing; */
-void full_init(void * ptr)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Mark a memory block which start address is given by \p ptr as
- * read-only. */
-/*@ assigns \nothing; */
-void mark_readonly(void * ptr)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief A variable holding a byte size of tracked heap allocation. */
-extern size_t heap_allocation_size;
-
-/*@ predicate diffSize{L1,L2}(integer i) =
-  \at(heap_allocation_size, L1)
-    - \at(heap_allocation_size, L2) == i; */
-
-/*! \brief Return the cumulative size (in bytes) of tracked heap allocation. */
-/*@ assigns \result \from heap_allocation_size; */
-size_t get_heap_allocation_size(void)
-  __attribute__((FC_BUILTIN));
+#include "observation_model/e_acsl_observation_model.h"
+#include "instrumentation_model/e_acsl_contract.h"
+#include "instrumentation_model/e_acsl_temporal.h"
+#include "numerical_model/e_acsl_floating_point.h"
+#include "numerical_model/e_acsl_gmp_api.h"
 
 /* }}} */
 
 /************************************************************************/
-/*** E-ACSL predicates {{{ ***/
+/*** Builtins {{{ ***/
 /************************************************************************/
 
-/*!\brief Implementation of the \b \\freeable predicate of E-ACSL.
- *
- * Evaluate to a non-zero value if \p ptr points to a start address of
- * a block allocated via \p malloc, \p calloc or \p realloc. */
-/*@ assigns \result \from ptr; */
-int freeable(void * ptr)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Implementation of the \b \\valid predicate of E-ACSL.
- *
- * \\valid evaluates an expression of the form `p+i`, where `p` is a pointer
- * and `i` is an integer offset and returns `true` if both `p` and `p+i` belong
- * to the same allocated memory block.
- *
- * @param ptr - memory address under question
- * @param size - the byte-length (starting from `ptr`) of the memory area which
- *  needs to be valid
- * @param base - if `ptr` can be represented by the expression `p+i` then
- *  `base` refers to `p`
- * @param addrof_base - if `ptr` can be represented by the expression `p+i`
- * then `addrof_base` refers to `&p`. For the cases when the address of `p`
- * cannot be taken (e.g., address of a static array or a constant value
- * casted to a pointer) then `addrof_base` is zero.
- *
- * @returns
- *  `true` if regions `[ptr, ptr + size]` and `[base, base + size]` are
- *  writable and lie within the same memory block and `false` otherwise.
- *  If `weak validity` is used (see macro `E_ACSL_WEAK_VALIDITY`)
- *  then only region `[ptr, ptr + size]` should lie within the same block
- *  and be writable.
- */
-/*@ assigns \result \from *(((char*)ptr)+(0..size-1)), ptr, size;
-  @ behavior valid:
-  @   assumes \valid(((char *)ptr)+(0..size-1));
-  @   assumes
-  @     size <= 0 ||
-  @     ! \separated(((char *)ptr)+(0..size-1),
-  @                  ((char *)\base_addr(base))+(0..\block_length(base)-1));
-  @   ensures \result == 1;
-  @ behavior invalid_ptr:
-  @   assumes ! \valid(((char *)ptr)+(0..size-1));
-  @   ensures \result == 0;
-  @ behavior separated_ptr:
-  @   assumes size > 0;
-  @   assumes \separated(((char *)ptr)+(0..size-1),
-  @                      ((char *)\base_addr(base))+(0..\block_length(base)-1));
-  @   ensures \result == 0;
-  @ complete behaviors;
-  @ disjoint behaviors;
-  @ */
-int valid(void * ptr, size_t size, void *base, void *addrof_base)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Implementation of the \b \\valid_read predicate of E-ACSL.
- *
- * Same as ::valid except the checked memory locations are only
- * required to be allocated.  */
-/*@ assigns \result \from *(((char*)ptr)+(0..size-1)), ptr, size;
-  @ behavior valid:
-  @   assumes \valid_read(((char *)ptr)+(0..size-1));
-  @   assumes
-  @     size <= 0 ||
-  @     ! \separated(((char *)ptr)+(0..size-1),
-  @                  ((char *)\base_addr(base))+(0..\block_length(base)-1));
-  @   ensures \result == 1;
-  @ behavior invalid_ptr:
-  @   assumes ! \valid_read(((char *)ptr)+(0..size-1));
-  @   ensures \result == 0;
-  @ behavior separated_ptr:
-  @   assumes size > 0;
-  @   assumes \separated(((char *)ptr)+(0..size-1),
-  @                      ((char *)\base_addr(base))+(0..\block_length(base)-1));
-  @   ensures \result == 0;
-  @ complete behaviors;
-  @ disjoint behaviors;
-  @ */
-int valid_read(void * ptr, size_t size, void *base, void *addrof_base)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Implementation of the \b \\base_addr predicate of E-ACSL.
- * Return the base address of the memory block containing an address given
- * by \p ptr */
-/*@ ensures \result == \base_addr(ptr);
-  @ assigns \result \from ptr; */
-void * base_addr(void * ptr)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Implementation of the \b \\block_length predicate of E-ACSL.
- * Return the byte length of the memory block of the block containing a memory
- * address given by \p ptr */
-/*@ ensures \result == \block_length(ptr);
-  @ assigns \result \from ptr; */
-size_t block_length(void * ptr)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Implementation of the \b \\offset predicate of E-ACSL.
- * Return the byte offset of address given by \p ptr within a memory blocks
- * it belongs to */
-/*@ ensures \result == \offset(ptr);
-  @ assigns \result \from ptr; */
-size_t offset(void * ptr)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Implementation of the \b \\initialized predicate of E-ACSL.
- * Return a non-zero value if \p size bytes starting from an address given by
- * \p ptr are initialized and zero otherwise. */
-/*@ assigns \result \from *(((char*)ptr)+(0..size-1)), ptr, size;
-  @ behavior initialized:
-  @   assumes \initialized(((char *)ptr)+(0..size-1));
-  @   ensures \result == 1;
-  @ behavior uninitialized:
-  @   assumes ! \initialized(((char *)ptr)+(0..size-1));
-  @   ensures \result == 0;
-  @ complete behaviors;
-  @ disjoint behaviors;
-  @ */
-int initialized(void * ptr, size_t size)
-  __attribute__((FC_BUILTIN));
-/* }}} */
-
-/************************************************************************/
-/*** Drop-in replacement functions {{{ ***/
-/************************************************************************/
-
-/*@ assigns dest[0..] \from src[0..];
-  @ assigns \result \from dest;
-  @ ensures \result == dest; */
-char *builtin_strcpy(char *dest, const char *src)
-  __attribute__((FC_BUILTIN));
-
-/*@ assigns dest[0..n - 1] \from src[0..n-1];
-  @ assigns \result \from dest;
-  @ ensures \result == dest; */
-char *builtin_strncpy(char *dest, const char *src, size_t n)
-  __attribute__((FC_BUILTIN));
-
-/*@ assigns \result \from s[0..]; */
-size_t builtin_strlen(const char *s)
-  __attribute__((FC_BUILTIN));
-
-/*@ assigns dest[..] \from src[0..];
-  @ assigns \result \from dest;
-  @ ensures \result == dest; */
-char *builtin_strcat(char *dest, const char *src)
-  __attribute__((FC_BUILTIN));
-
-/*@ assigns dest[..] \from src[0..n];
-  @ assigns \result \from dest;
-  @ ensures \result == dest; */
-char *builtin_strncat(char *dest, const char *src, size_t n)
-  __attribute__((FC_BUILTIN));
-
-/*@ assigns \result \from s1[0..], s2[0..]; */
-int builtin_strcmp(const char *s1, const char *s2)
-  __attribute__((FC_BUILTIN));
-
-/*@ assigns \result \from s1[0..n-1], s2[0..n-1]; */
-int builtin_strncmp(const char *s1, const char *s2, size_t n)
-  __attribute__((FC_BUILTIN));
-
-/*@ assigns ((char*)dest)[0..n-1] \from ((char*)src)[0..n-1];
-  @ assigns \result \from dest;
-  @ ensures \result == dest; */
-void *builtin_memcpy(void *dest, const void *src, size_t n)
-  __attribute__((FC_BUILTIN));
-
-/*@ assigns ((char*)s)[0..n-1] \from c;
-  @ assigns \result \from s;
-  @ ensures \result == s; */
-void *builtin_memset(void *s, int c, size_t n)
-  __attribute__((FC_BUILTIN));
-
-/*@ assigns ((char*)dest)[0..n-1] \from ((char*)src)[0..n-1];
-  @ assigns \result \from dest;
-  @ ensures \result == dest; */
-void *builtin_memmove(void *dest, const void *src, size_t n)
-  __attribute__((FC_BUILTIN));
-
-/*@ assigns \result \from ((char*)s1)[0..n-1], ((char*)s2)[0..n-1]; */
-int builtin_memcmp(const void *s1, const void *s2, size_t n)
-  __attribute__((FC_BUILTIN));
-
-/* }}} */
-
-/************************************************************************/
-/*** Format functions {{{ ***/
-/************************************************************************/
-
-/** \brief `printf` with error checking. */
-int builtin_printf(const char *fmtdesc, const char *fmt, ...)
-  __attribute__((FC_BUILTIN));
-
-/** \brief `fprintf` with error checking. */
-int builtin_fprintf(const char *fmtdesc, FILE *stream, const char *fmt, ...)
- __attribute__((FC_BUILTIN));
-
-/** \brief `dprintf` with error checking. */
-int builtin_dprintf(const char *fmtdesc, int fd, const char *fmt, ...)
- __attribute__((FC_BUILTIN));
-
-/** \brief `sprintf` with error checking. */
-int builtin_sprintf(const char *fmtdesc, char *str, const char *fmt, ...)
- __attribute__((FC_BUILTIN));
-
-/** \brief `snprintf` with error checking. */
-int builtin_snprintf
-  (const char *fmtdesc, char *str, size_t size, const char *fmt, ...)
- __attribute__((FC_BUILTIN));
-
-/** \brief `syslog` with error checking. */
-int builtin_syslog(const char *fmtdesc, int priority, const char *fmt, ...)
- __attribute__((FC_BUILTIN));
-/* }}} */
-
-/************************************************************************/
-/*** Machine-dependent infinity values for flating points {{{ ***/
-/************************************************************************/
-
-/* Positive infinity for doubles: same as HUGE_VAL */
-extern double math_HUGE_VAL
-  __attribute__((FC_BUILTIN));
-
-/* Positive infinity for floats: same as HUGE_VALF */
-extern float  math_HUGE_VALF
-  __attribute__((FC_BUILTIN));
-
-/* Representation of infinity value for doubles: same as INFINITY */
-extern double math_INFINITY
-  __attribute__((FC_BUILTIN));
-
-/* Check for floating point exception at a given execution point */
-extern void floating_point_exception(const char *s)
-  __attribute__((FC_BUILTIN));
-/* }}} */
-
-/************************************************************************/
-/*** Temporal analysis {{{ ***/
-/************************************************************************/
-
-/*! \brief Take origin number of a memory block containing `block_addr` and
- * store it as a referent number of a pointer given by `ptr_addr`. */
-/*@ assigns \nothing; */
-void temporal_store_nblock(void *ptr_addr, void *block_addr)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Same as `temporal_store_nblock` but take a referent
- * number of `block_addr` instead */
-/*@ assigns \nothing; */
-void temporal_store_nreferent(void *ptr_addr, void *block_addr)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief store struct { .ptr = ptr, .temporal_flow = TReferentN }
- *  in the global parameter array. */
-/*@ assigns \nothing; */
-void temporal_save_nreferent_parameter(void *ptr, unsigned int param)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief store struct { .ptr = ptr, .temporal_flow = TBlockN }
- *  in the global parameter array. */
-/*@ assigns \nothing; */
-void temporal_save_nblock_parameter(void *ptr, unsigned int param)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief store struct { .ptr = ptr, .temporal_flow = TCopy } in the global
- *  parameter array. */
-/*@ assigns \nothing; */
-void temporal_save_copy_parameter(void *ptr, unsigned int param)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Assign a referent number of `ptr` based on the record in the global
- * parameter array at index `param`. */
-/*@ assigns \nothing; */
-void temporal_pull_parameter(void *ptr, unsigned int param, size_t size)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Nullify global parameter array  */
-/*@ assigns \nothing; */
-void temporal_reset_parameters()
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Save temporal referent number of `ptr` in a placeholder variable
- * tracking the referent number of a function's return. */
-/*@ assigns \nothing; */
-void temporal_save_return(void *ptr)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Take a temporal referent stored in the placeholder tracking return
- * values  as a temporal referent number of `ptr`. */
-/*@ assigns \nothing; */
-void temporal_pull_return(void *ptr)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Nullify a placeholder variable tracking the referent number of a
- * function's return. */
-/*@ assigns \nothing; */
-void temporal_reset_return()
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Copy temporal shadow data from [src, src + size] to
- * [dest, dest + size]. Counterpart of the memcpy function */
-/*@ assigns \nothing; */
-void temporal_memcpy(void *dest, void *src, size_t size)
-  __attribute__((FC_BUILTIN));
-
-/*! \brief Set temporal shadow data from [src, src + size] to 0.
- * Counterpart of memset the function */
-/*@ assigns \nothing; */
-void temporal_memset(void *dest, int n, size_t size)
-  __attribute__((FC_BUILTIN));
+#include "libc_replacements/e_acsl_stdio.h"
+#include "libc_replacements/e_acsl_string.h"
 
 /* }}} */
-#endif
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_malloc.h b/src/plugins/e-acsl/share/e-acsl/e_acsl_malloc.h
deleted file mode 100644
index 3ba677ed085cd66f3a38a7b4a822925b829f3685..0000000000000000000000000000000000000000
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_malloc.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/**************************************************************************/
-/*                                                                        */
-/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
-/*                                                                        */
-/*  Copyright (C) 2012-2020                                               */
-/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
-/*         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).            */
-/*                                                                        */
-/**************************************************************************/
-
-/*! ***********************************************************************
- * \file  e_acsl_malloc.h
- *
- * \brief E-ACSL memory allocation bindings.
-***************************************************************************/
-
-#ifndef E_ACSL_MALLOC_H
-#define E_ACSL_MALLOC_H
-
-#include <stdint.h>
-#include <stddef.h>
-
-/* Memory allocated for internal use of RTL and for the use by the application
- * is split into two mspaces (memory spaces). Memory allocation itself is
- * delegated to a slightly customised version of dlmalloc shipped with the
- * RTL. The overall pattern is as follows:
- *    mspace space = create_mspace(capacity, locks);
- *    char *p = mspace_malloc(space, size); */
-
-/* Block size units in bytes */
-#define KB (1024)         //!< Bytes in a kilobyte
-#define MB (1024*KB)      //!< Bytes in a megabyte
-#define GB (1024*MB)      //!< Bytes in a gigabyte
-#define KB_SZ(_s) (_s/KB) //!< Convert bytes to kilobytes
-#define MB_SZ(_s) (_s/MB) //!< Convert bytes to megabytes
-#define GB_SZ(_s) (_s/GB) //!< Convert bytes to gigabytes
-
-typedef void* mspace;
-
-static struct memory_spaces {
-  mspace rtl_mspace; /* `private` (RTL) mspace */
-  mspace heap_mspace;  /* `public` (application) mspace */
-  uintptr_t heap_start; /* least address in application mspace */
-  uintptr_t heap_end; /* greatest address in application mspace */
-  uintptr_t heap_mspace_least; /* Initial least address in heap mspace */
-} mem_spaces;
-
-/* While it is possible to generate prefixes using an extra level of
- * indirection with macro definitions it is probably best not to do it,
- * becomes barely readable ...*/
-
-/* Mspace allocators {{{ */
-extern mspace __e_acsl_create_mspace(size_t, int);
-extern size_t __e_acsl_destroy_mspace(mspace);
-extern void*  __e_acsl_mspace_malloc(mspace, size_t);
-extern void   __e_acsl_mspace_free(mspace, void*);
-extern void*  __e_acsl_mspace_calloc(mspace msp, size_t, size_t);
-extern void*  __e_acsl_mspace_realloc(mspace msp, void*, size_t);
-extern void*  __e_acsl_mspace_aligned_alloc(mspace, size_t, size_t);
-extern int    __e_acsl_mspace_posix_memalign(mspace, void **, size_t, size_t);
-extern void*  __e_acsl_mspace_least_addr(mspace);
-
-#define create_mspace          __e_acsl_create_mspace
-#define destroy_mspace         __e_acsl_destroy_mspace
-#define mspace_least_addr      __e_acsl_mspace_least_addr
-#define mspace_malloc          __e_acsl_mspace_malloc
-#define mspace_free            __e_acsl_mspace_free
-#define mspace_calloc          __e_acsl_mspace_calloc
-#define mspace_realloc         __e_acsl_mspace_realloc
-#define mspace_posix_memalign  __e_acsl_mspace_posix_memalign
-#define mspace_aligned_alloc   __e_acsl_mspace_aligned_alloc
-/* }}} */
-
-/* Public allocators used within RTL to override standard allocation {{{ */
-/* Shortcuts for public allocation functions */
-# define public_malloc(...)         mspace_malloc(mem_spaces.heap_mspace, __VA_ARGS__)
-# define public_realloc(...)        mspace_realloc(mem_spaces.heap_mspace, __VA_ARGS__)
-# define public_calloc(...)         mspace_calloc(mem_spaces.heap_mspace, __VA_ARGS__)
-# define public_free(...)           mspace_free(mem_spaces.heap_mspace, __VA_ARGS__)
-# define public_aligned_alloc(...)  mspace_aligned_alloc(mem_spaces.heap_mspace, __VA_ARGS__)
-# define public_posix_memalign(...) mspace_posix_memalign(mem_spaces.heap_mspace, __VA_ARGS__)
-/* }}} */
-
-/* Private allocators usable within RTL and GMP {{{ */
-void * __e_acsl_private_malloc(size_t sz) {
-  return mspace_malloc(mem_spaces.rtl_mspace, sz);
-}
-
-void *__e_acsl_private_calloc(size_t nmemb, size_t sz) {
-  return mspace_calloc(mem_spaces.rtl_mspace, nmemb, sz);
-}
-
-void *__e_acsl_private_realloc(void *p, size_t sz) {
-  return mspace_realloc(mem_spaces.rtl_mspace, p, sz);
-}
-
-void __e_acsl_private_free(void *p) {
-  mspace_free(mem_spaces.rtl_mspace, p);
-}
-
-#define private_malloc  __e_acsl_private_malloc
-#define private_calloc  __e_acsl_private_calloc
-#define private_realloc __e_acsl_private_realloc
-#define private_free    __e_acsl_private_free
-/* }}} */
-
-/* \brief Create two memory spaces, one for RTL and the other for application
-   memory. This function *SHOULD* be called before any allocations are made
-   otherwise execution fails */
-static void make_memory_spaces(size_t rtl_size, size_t heap_size) {
-  mem_spaces.rtl_mspace = create_mspace(rtl_size, 0);
-  mem_spaces.heap_mspace = create_mspace(heap_size, 0);
-  /* Do not use `mspace_least_addr` here, as it returns the address of the
-     mspace header. */
-  mem_spaces.heap_start = (uintptr_t)mspace_malloc(mem_spaces.heap_mspace,1);
-  mem_spaces.heap_end = mem_spaces.heap_start + heap_size;
-  /* Save initial least address of heap memspace. This address is used later
-     to check whether memspace has been moved. */
-  mem_spaces.heap_mspace_least = (uintptr_t)mspace_least_addr(mem_spaces.heap_mspace);
-}
-
-static void destroy_memory_spaces() {
-  destroy_mspace(mem_spaces.rtl_mspace);
-  destroy_mspace(mem_spaces.heap_mspace);
-}
-
-/* \return a true value if x is a power of 2 and false otherwise */
-static int powof2(size_t x) {
-  while (((x & 1) == 0) && x > 1) /* while x is even and > 1 */
-    x >>= 1;
-  return (x == 1);
-}
-#endif
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_rtl.c b/src/plugins/e-acsl/share/e-acsl/e_acsl_rtl.c
index eb405faf53b4bbdc6b21e4a9c3743b1c685ce5fb..7e74611ac5ee19b82530640f0ffa594151660c7b 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_rtl.c
+++ b/src/plugins/e-acsl/share/e-acsl/e_acsl_rtl.c
@@ -20,122 +20,33 @@
 /*                                                                        */
 /**************************************************************************/
 
-/*! ***********************************************************************
- * \file  e_acsl_rtl.c
- * \brief RTL configuration and assembly
-***************************************************************************/
-
 /* Get default definitions and macros e.g., PATH_MAX */
 #ifndef _DEFAULT_SOURCE
 # define _DEFAULT_SOURCE 1
 #endif
 
-#include "e_acsl_alias.h"
-#include "e_acsl_malloc.h"
-#include "e_acsl_string.h"
-#include "e_acsl_bits.h"
-#include "e_acsl_printf.h"
-#include "e_acsl_debug.h"
-#include "e_acsl_shexec.h"
-#include "e_acsl_trace.h"
-#include "e_acsl_assert.h"
-#include "e_acsl_floating_point.h"
-#include "e_acsl_safe_locations.h"
-#include "e_acsl_temporal_timestamp.h"
-#include "e_acsl.h"
-
-/* Memory model settings
- *    Memory model:
- *      E_ACSL_BITTREE_MMODEL - use Patricia-trie (tree-based) memory model, or
- *      E_ACSL_SEGMENT_MMODEL - use segment-based (shadow) memory model
- *    Verbosity level:
- *      E_ACSL_VERBOSE - put an executable in verbose mode that
- *        prints extra messages (unset by default)
- *    Debug Features:
- *      E_ACSL_DEBUG - enable debug features in RTL (unset by default)
- *      E_ACSL_DEBUG_VERBOSE - verbose debug output (via DVLOG macro)
- *      E_ACSL_DEBUG_LOG - name of the log file where debug messages are
- *        output. The file name should be unquoted string with '-'
- *        (set by default) indicating a standard stream
- *    Validity:
- *      E_ACSL_WEAK_VALIDITY - use notion of weak validity
- *        Given an expression `(p+i)`, where `p` is a pointer and `i` is an
- *        integer offset weak validity indicates that `(p+i)` is valid if it
- *        belongs to memory allocation. In strong validity `(p+i)` is valid
- *        iff both `p` and `(p+i)` belong to memory allocation and to the same
- *        memory block.
- *    Temporal analysis:
- *      E_ACSL_TEMPORAL - enable temporal analysis in RTL
- *    Assertions:
- *      E_ACSL_NO_ASSERT_FAIL - do not issue abort signal of E-ACSL
- *        assertion failure
- *      E_ACSL_FAIL_EXITCODE - do not issue abort signal but exit with a
- *        given code
- *    Shadow spaces (only for segment model):
- *      E_ACSL_STACK_SIZE - size (in MB) of the tracked program stack
- *      E_ACSL_HEAP_SIZE - size (in MB) of the tracked program heap
- *    String functions:
- *      E_ACSL_NO_COMPILER_BUILTINS - if undefined (default) then use
- *      compiler builtin string functions (e.g., memset -> __builtin_memset)
- *    Behaviour of assert:
- *      E_ACSL_EXTERNAL_ASSERT - if this macro is defined then function
- *      `__e_acsl_assert` is excluded from compilation. This is to allow
- *      providing alternative definitions of assertions by users.
- *    Memory deallocation:
- *      E_ACSL_FREE_VALID_ADDRESS -- Clause 7.20.3.2 of C99 standard states
- *      that NULL is a valid input to free:
- *        "The free function causes the space pointed to by ptr [its argument]
- *         to be deallocated, that is, made available for further allocation.
- *         If ptr is a null pointer, no action occurs."
- *      Yet, some tools insist that it is a bug. For instance, there is a
- *      bunch of test cases in Toyota ITC Benchmarks. To make such tools
- *      happy the following option is introduced. By default it should be
- *      undefined (disabled) though.
-*/
-
-/* Functionality tracking leaks is shared between models */
-#include "e_acsl_leak.h"
-
-/* Print a header indicating current configuration of a run to STDIN. */
-static void describe_run();
-
-/* Select memory model, either segment-based or bittree-based model should
-   be defined */
-#if defined E_ACSL_SEGMENT_MMODEL
-# include "segment_model/e_acsl_segment_mmodel.c"
-#elif defined E_ACSL_BITTREE_MMODEL
-# include "bittree_model/e_acsl_bittree_mmodel.c"
-#else
-# error "No E-ACSL memory model defined. Aborting compilation"
-#endif
-
-/* Headers containing implementation of functions belonging to the E-ACSL
-   external API shared across different memory models */
-#include "e_acsl_libc_replacements.h" /* */
-#include "e_acsl_format.h" /* format functions with error checking */
-#include "e_acsl_temporal.h" /* temporal analysis */
-
-#ifdef E_ACSL_WEAK_VALIDITY
-# define E_ACSL_VALIDITY_DESC "weak"
-#else
-# define E_ACSL_VALIDITY_DESC "strong"
-#endif
-
-/* Print basic configuration before each run */
-static void describe_run() {
-#if defined(E_ACSL_VERBOSE)
-  rtl_printf("/* ========================================================= */\n");
-  rtl_printf(" * E-ACSL instrumented run\n" );
-  rtl_printf(" * Memory tracking: %s\n", E_ACSL_MMODEL_DESC);
-#ifdef E_ACSL_SEGMENT_MMODEL
-  rtl_printf(" *   Heap  %d MB\n", E_ACSL_HEAP_SIZE);
-  rtl_printf(" *   Stack %d MB\n", E_ACSL_STACK_SIZE);
-#endif
-  rtl_printf(" * Temporal checks: %s\n", E_ACSL_TEMPORAL_DESC);
-  rtl_printf(" * Execution mode:  %s\n", E_ACSL_DEBUG_DESC);
-  rtl_printf(" * Assertions mode: %s\n", E_ACSL_ASSERT_NO_FAIL_DESC);
-  rtl_printf(" * Validity notion: %s\n", E_ACSL_VALIDITY_DESC);
-  rtl_printf(" * Format Checks:   %s\n", E_ACSL_FORMAT_VALIDITY_DESC);
-  rtl_printf("/* ========================================================= */\n");
-#endif
-}
+// Internals
+#include "internals/e_acsl_bits.c"
+#include "internals/e_acsl_debug.c"
+#include "internals/e_acsl_malloc.c"
+#include "internals/e_acsl_private_assert.c"
+#include "internals/e_acsl_rtl_io.c"
+#include "internals/e_acsl_rtl_string.c"
+#include "internals/e_acsl_shexec.c"
+#include "internals/e_acsl_trace.c"
+
+// Instrumentation model
+#include "instrumentation_model/e_acsl_assert.c"
+#include "instrumentation_model/e_acsl_contract.c"
+#include "instrumentation_model/e_acsl_temporal.c"
+
+// Observation model
+#include "observation_model/e_acsl_heap.c"
+#include "observation_model/e_acsl_observation_model.c"
+
+// Numerical model
+#include "numerical_model/e_acsl_floating_point.c"
+
+// Libc replacements
+#include "libc_replacements/e_acsl_stdio.c"
+#include "libc_replacements/e_acsl_string.c"
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_assert.h b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_assert.c
similarity index 50%
rename from src/plugins/e-acsl/share/e-acsl/e_acsl_assert.h
rename to src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_assert.c
index baadfa947816c29c000fd8b89bcb1c076a6843f8..5ede932a5a801f658e905f25511bf45641e40e5e 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_assert.h
+++ b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_assert.c
@@ -21,86 +21,17 @@
 /**************************************************************************/
 
 /*! ***********************************************************************
- * \file  e_acsl_assert.h
- * \brief E-ACSL assertions and abort statements.
+ * \file
+ * \brief E-ACSL assertions and abort statements implementation.
 ***************************************************************************/
 
-#ifndef E_ACSL_ASSERT_H
-#define E_ACSL_ASSERT_H
+#include <stdlib.h>
 
-#include <sys/types.h>
-#include <signal.h>
-#include <limits.h>
-#include "e_acsl_alias.h"
-#include "e_acsl_printf.h"
-#include "e_acsl_string.h"
-#include "e_acsl_trace.h"
+#include "../internals/e_acsl_private_assert.h"
+#include "../internals/e_acsl_rtl_io.h"
 
-#define runtime_assert export_alias(assert)
-#define runtime_sound_verdict export_alias(sound_verdict)
+#include "e_acsl_assert.h"
 
-/*! \brief Drop-in replacement for abort function */
-#define runtime_abort() exec_abort(__LINE__, __FILE__)
-
-/*! \brief Output a message to error stream using printf-like format string
- * and abort the execution.
- *
- * This is a wrapper for \p eprintf combined with \p abort */
-static void vabort(char *fmt, ...);
-
-/*! \brief Assert with printf-like error message support */
-#define vassert(expr, fmt, ...) \
-  vassert_fail(expr, __LINE__, __FILE__, fmt, __VA_ARGS__)
-
-/* This ::exec_abort replaces `abort` via a macro at the top of this file */
-static void exec_abort(int line, const char *file) {
-#ifdef E_ACSL_DEBUG
-#ifndef E_ACSL_NO_TRACE
-  trace();
-#endif
-#endif
- raise(SIGABRT);
-}
-
-/*! \brief Print a message to stderr and abort the execution */
-static void vabort(char *fmt, ...) {
-  va_list va;
-  sigset_t defer_abrt;
-  sigemptyset(&defer_abrt);
-  sigaddset(&defer_abrt,SIGABRT);
-  sigprocmask(SIG_BLOCK,&defer_abrt,NULL);
-  va_start(va,fmt);
-  _format(NULL,_charc_stderr,fmt,va);
-  va_end(va);
-  sigprocmask(SIG_UNBLOCK,&defer_abrt,NULL);
-  runtime_abort();
-}
-
-static void vassert_fail(int expr, int line, char *file, char *fmt,  ...) {
-  if (!expr) {
-    char *afmt = "%s at %s:%d\n";
-    char buf [strlen(fmt) + strlen(afmt) + PATH_MAX +  11];
-    rtl_sprintf(buf, afmt, fmt, file, line);
-    fmt = buf;
-
-    va_list va;
-    va_start(va,fmt);
-    _format(NULL,_charc_stderr,fmt,va);
-    va_end(va);
-    runtime_abort();
-  }
-}
-
-#ifdef E_ACSL_NO_ASSERT_FAIL
-# define E_ACSL_ASSERT_NO_FAIL_DESC "pass through"
-#else
-# define E_ACSL_ASSERT_NO_FAIL_DESC "abort"
-#endif
-
-/*! E-ACSL instrumentation automatically sets this global to 0 if its verdict
-    becomes unsound.
-    TODO: may only happen for annotations containing memory-related properties.
-    For arithmetic properties, the verdict is always sound (?). */
 int runtime_sound_verdict = 1;
 
 #ifndef E_ACSL_EXTERNAL_ASSERT
@@ -118,7 +49,7 @@ void runtime_assert(int predicate, const char *kind, const char *fct,
 #ifdef E_ACSL_FAIL_EXITCODE /* Fail by exit with a given code */
       exit(E_ACSL_FAIL_EXITCODE);
 #else
-      runtime_abort(); /* Raise abort signal */
+      raise_abort(file, line); /* Raise abort signal */
 #endif
 #endif
     }
@@ -130,15 +61,3 @@ void runtime_assert(int predicate, const char *kind, const char *fct,
            file, fct, file, line, kind, predicate ? "ok": "FAIL", pred_txt);
 }
 #endif
-
-/* Instances of assertions shared accross different memory models */
-
-/*! \brief Abort the execution if the size of the pointer computed during
- * instrumentation (\p _ptr_sz) does not match the size of the pointer used
- * by a compiler (\p void*) */
-#define arch_assert(_ptr_sz) \
-  vassert(_ptr_sz == sizeof(void*), \
-    "Mismatch of instrumentation- and compile-time pointer sizes: " \
-    "%lu vs %lu\n", _ptr_sz, sizeof(void*))
-
-#endif
diff --git a/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_assert.h b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_assert.h
new file mode 100644
index 0000000000000000000000000000000000000000..9bdf8a8b12ec6468b07bbbeb0ad51975a2552cbd
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_assert.h
@@ -0,0 +1,55 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+/*! ***********************************************************************
+ * \file
+ * \brief E-ACSL assertions and abort statements.
+***************************************************************************/
+
+#ifndef E_ACSL_ASSERT_H
+#define E_ACSL_ASSERT_H
+
+#include "../internals/e_acsl_alias.h"
+
+#define runtime_sound_verdict export_alias(sound_verdict)
+#define runtime_assert        export_alias(assert)
+
+/*! E-ACSL instrumentation automatically sets this global to 0 if its verdict
+    becomes unsound.
+    TODO: may only happen for annotations containing memory-related properties.
+    For arithmetic properties, the verdict is always sound (?). */
+extern int runtime_sound_verdict;
+
+/*! \brief Runtime assertion verifying a given predicate
+ *  \param pred  integer code of a predicate
+ *  \param kind  C string representing a kind an annotation (e.g., "Assertion")
+ *  \param fct
+ *  \param pred_txt  stringified predicate
+ *  \param file un-instrumented file of predicate placement
+ *  \param line line of predicate placement in the un-instrumented file */
+/*@ requires pred != 0;
+  @ assigns \nothing; */
+void runtime_assert(int pred, const char *kind, const char *fct, const char *pred_txt,
+    const char * file, int line)
+  __attribute__((FC_BUILTIN));
+
+#endif // E_ACSL_ASSERT_H
\ No newline at end of file
diff --git a/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_contract.c b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_contract.c
new file mode 100644
index 0000000000000000000000000000000000000000..71143a43a2e598128daddfcb50e7cd421b641ec9
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_contract.c
@@ -0,0 +1,158 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+/*! ***********************************************************************
+ * \file
+ * \brief Implementation of E-ACSL API for contracts.
+***************************************************************************/
+
+#include <limits.h>
+#include <stdarg.h>
+
+#include "../internals/e_acsl_debug.h"
+
+#include "e_acsl_contract.h"
+
+/*! \brief Return the index of the `char` where the bit number
+    `global_bit_index` is located. */
+static inline size_t find_char_index(size_t global_bit_index) {
+    return global_bit_index / CHAR_BIT;
+}
+
+/*! \brief Return the index of the bit in the `char` given by
+    \ref find_char_index for the bit number `global_bit_index`. */
+static inline size_t find_bit_index(size_t global_bit_index) {
+    return global_bit_index % CHAR_BIT;
+}
+
+/*! \brief Return the number of `char` to allocate to store `bit_count` bits. */
+static inline size_t find_char_count(size_t bit_count) {
+    size_t char_count = bit_count / CHAR_BIT;
+    if (bit_count % CHAR_BIT > 0) {
+        ++char_count;
+    }
+    return char_count;
+}
+
+/*! \brief Normalize the boolean parameter `value` to 0 or 1 */
+static inline int normalize_to_boolean(int value) {
+    return value ? 1 : 0;
+}
+
+/* Documented in e_acsl.h */
+struct contract_t {
+    /*! \brief Number of cells in the char array used to store the results of
+     * the assumes clauses.
+     */
+    size_t char_count;
+
+    /*! \brief Char array to store the results of the assumes clauses. One bit
+     * per behavior.
+     *
+     * The functions \ref find_char_index() and \ref find_bit_index() can be
+     * used to find the location of the bit for a specific behavior. */
+    char * assumes;
+};
+
+/* Documented in e_acsl.h */
+contract_t * contract_init(size_t size) {
+    // Allocate memory for the structure
+    contract_t * c = malloc(sizeof(contract_t));
+    DVASSERT(c != NULL,
+        "Unable to allocate %d bytes of memory for contract_t",
+        sizeof(contract_t));
+
+    // Compute the number of char needed to store `size` behaviors, assuming
+    // that one behavior is stored in one bit.
+    c->char_count = find_char_count(size);
+
+    // Allocate an array of char of the computed count
+    if (c->char_count > 0) {
+        c->assumes = calloc(c->char_count, sizeof(char));
+        DVASSERT(c->assumes != NULL,
+            "Unable to allocate %d cells of %d bytes of memory for contract_t::assumes",
+            c->char_count, sizeof(char));
+    } else {
+        c->assumes = NULL;
+    }
+
+    return c;
+}
+
+/* Documented in e_acsl.h */
+void contract_clean(contract_t * c) {
+    // Free array of char
+    free(c->assumes);
+    // Free structure
+    free(c);
+}
+
+/* Documented in e_acsl.h */
+void contract_set_behavior_assumes(contract_t * c, size_t i, int assumes) {
+    size_t char_idx = find_char_index(i);
+    DVASSERT(char_idx < c->char_count,
+        "Out of bound char index %d (char_count: %d)",
+        char_idx, c->char_count);
+    size_t bit_idx = find_bit_index(i);
+    assumes = normalize_to_boolean(assumes);
+    c->assumes[char_idx] |= (assumes<<bit_idx);
+}
+
+/* Documented in e_acsl.h */
+int contract_get_behavior_assumes(const contract_t * c, size_t i) {
+    size_t char_idx = find_char_index(i);
+    DVASSERT(char_idx < c->char_count,
+        "Out of bound char index %d (char_count: %d)",
+        char_idx, c->char_count);
+    size_t bit_idx = find_bit_index(i);
+    int result = c->assumes[char_idx] & (1<<bit_idx);
+    return normalize_to_boolean(result);
+}
+
+/* Documented in e_acsl.h */
+int contract_partial_count_behaviors(const contract_t * c, size_t count, ...) {
+    va_list args;
+    va_start(args, count);
+
+    int result = 0;
+    for (size_t i = 0 ; i < 2 && i < count ; ++i) {
+        result += contract_get_behavior_assumes(c, va_arg(args, int));
+    }
+
+    va_end(args);
+    return result;
+}
+
+/* Documented in e_acsl.h */
+int contract_partial_count_all_behaviors(const contract_t * c) {
+    int result = 0;
+    for (int i = 0 ; i < c->char_count && result < 2 ; ++i) {
+        // Counting bits set with Kernighan's algorithm, but stopping at two
+        // bits set.
+        // cf. <https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan>
+        unsigned char assumes_cell = c->assumes[i];
+        for (; assumes_cell && result < 2 ; ++result) {
+            assumes_cell &= assumes_cell - 1;
+        }
+    }
+    return result;
+}
diff --git a/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_contract.h b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_contract.h
new file mode 100644
index 0000000000000000000000000000000000000000..b3349fdf027d604293f5b9c3ced6a0a01507a455
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_contract.h
@@ -0,0 +1,124 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+/*! ***********************************************************************
+ * \file
+ * \brief E-ACSL support of function and statement contracts.
+***************************************************************************/
+
+#ifndef E_ACSL_CONTRACT_H
+#define E_ACSL_CONTRACT_H
+
+#include <stddef.h>
+
+#include "../internals/e_acsl_alias.h"
+
+#ifdef __FC_STDLIB
+#include <__fc_alloc_axiomatic.h>
+#else
+/*@ ghost extern int __fc_heap_status __attribute__((FRAMA_C_MODEL)); */
+#endif
+
+#define contract_t                            export_alias(contract_t)
+#define contract_init                         export_alias(contract_init)
+#define contract_clean                        export_alias(contract_clean)
+#define contract_set_behavior_assumes         export_alias(contract_set_behavior_assumes)
+#define contract_get_behavior_assumes         export_alias(contract_get_behavior_assumes)
+#define contract_partial_count_behaviors      export_alias(contract_partial_count_behaviors)
+#define contract_partial_count_all_behaviors  export_alias(contract_partial_count_all_behaviors)
+
+/*! \brief Structure to hold pieces of information about function and statement
+ * contracts at runtime. */
+typedef struct contract_t __attribute__((__FC_BUILTIN__)) contract_t;
+
+/*! \brief Allocate and initialize a structure to hold pieces of information
+ * about `size` behaviors.
+ *
+ * \param size Number of behaviors that the structure should support.
+ * \return A structure to hold pieces of information about contracts at runtime.
+ */
+/*@ assigns \result \from indirect:__fc_heap_status, indirect:size;
+  @ ensures \valid(\result); */
+contract_t * contract_init(size_t size) __attribute__((FC_BUILTIN));
+
+/*! \brief Cleanup the structure `c` previously allocated by
+ * \ref contract_init.
+ *
+ * \param c The structure to deallocate.
+ */
+/*@ requires \valid(c);
+  @ assigns \nothing; */
+void contract_clean(contract_t * c) __attribute__((FC_BUILTIN));
+
+/*! \brief Set the result of the assumes clauses for the behavior `i` in the
+ * structure.
+ *
+ * \param c Valid pointer to the structure to update.
+ * \param i Index of the behavior. The index must be valid.
+ * \param assumes Boolean result of the assumes clauses for the behavior.
+ * \see \ref contract_get_behavior_assumes to retrieve the value.
+ */
+/*@ requires \valid(c);
+  @ assigns *c \from indirect:c, indirect:i, assumes; */
+void contract_set_behavior_assumes(contract_t * c, size_t i, int assumes)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Retrieve the result of the assumes clauses for the behavior `i` from
+ * the structure.
+ *
+ * \param c Valid pointer to the structure to read.
+ * \param i Index of the behavior. The index must be valid.
+ * \return The result of the assumes clauses for the behavior `i` (1 for true,
+ *         0 for false).
+ * \see \ref contract_set_behavior_assumes to set the value.
+ */
+/*@ requires \valid_read(c);
+  @ assigns \result \from indirect:c, indirect:i;
+  @ ensures \result == 0 || \result == 1; */
+int contract_get_behavior_assumes(const contract_t * c, size_t i)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Count the number of active behaviors among the `count` given
+ * behaviors.
+ *
+ * \param c Valid pointer to the structure to read.
+ * \param count Number of behaviors to test. There must be `count` values in
+ *              `indexes`.
+ * \param ... Indexes of the behaviors to test. The indexes must be valid
+ *                and there must be `count` indexes.
+ * \return 0 if no behaviors are active, 1 if exactly one behavior is active,
+ *         and 2 if more than one behavior is active.
+ */
+int contract_partial_count_behaviors(const contract_t * c, size_t count, ...)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Count the number of active behaviors among all the behaviors of the
+ * contract.
+ *
+ * \param c Valid pointer to the structure to read.
+ * \return 0 if no behaviors are active, 1 if exactly one behavior is active,
+ *         and 2 if more than one behavior is active.
+ */
+int contract_partial_count_all_behaviors(const contract_t * c)
+  __attribute__((FC_BUILTIN));
+
+#endif
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_temporal.h b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal.c
similarity index 81%
rename from src/plugins/e-acsl/share/e-acsl/e_acsl_temporal.h
rename to src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal.c
index a29dcd32ed0f85b37f4bff651c3e56511675581c..92f8f71d1646566f023ffb43250d9ab4c35e6cfd 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_temporal.h
+++ b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal.c
@@ -20,35 +20,16 @@
 /*                                                                        */
 /**************************************************************************/
 
-/*! ***********************************************************************
- * \file  e_acsl_temporal.h
- * \brief Implementation of the tenporal API shared by all models
-***************************************************************************/
-#ifndef E_ACSL_TEMPORAL_H
-#define E_ACSL_TEMPORAL_H
-
-#include "e_acsl_temporal_timestamp.h"
-
 #ifdef E_ACSL_TEMPORAL
-#define E_ACSL_TEMPORAL_DESC "enabled"
-
-/* Temporal timestamp retrieval [forward declarations] {{{ */
-/*! \brief Return origin time stamp associated with a memory block containing
- * address given by `ptr`. `0` indicates an invalid timestamp, i.e., timestamp
- * of a memory block which does not exist. */
-static uint32_t origin_timestamp(void *ptr);
 
-/*! \brief Return address of referent shadow */
-static uintptr_t temporal_referent_shadow(void *addr);
+#include <stddef.h>
 
-/*! \brief Return referent time stamp associated with a pointer which address
- * is given by `ptr`. This function expects that `ptr` is allocated and at
- * least `sizeof(uintptr_t)` bytes long */
-uint32_t referent_timestamp(void *ptr);
+#include "../internals/e_acsl_private_assert.h"
+#include "../observation_model/internals/e_acsl_omodel_debug.h"
+#include "../observation_model/internals/e_acsl_timestamp_retrieval.h"
+#include "e_acsl_temporal_timestamp.h"
 
-/*! \brief Store a referent number `ref` in the shadow of `ptr` */
-void store_temporal_referent(void *ptr, uint32_t ref);
-/* }}} */
+#include "e_acsl_temporal.h"
 
 /* Temporal store {{{ */
 void temporal_store_nblock(void *lhs, void *rhs) {
@@ -58,7 +39,6 @@ void temporal_store_nblock(void *lhs, void *rhs) {
 void temporal_store_nreferent(void *lhs, void *rhs) {
   store_temporal_referent(lhs, referent_timestamp(rhs));
 }
-
 /* }}} */
 
 /* Memcpy/memset {{{ */
@@ -110,7 +90,7 @@ void temporal_pull_parameter(void *ptr, unsigned int param, size_t size) {
       temporal_memcpy(ptr, tpar->ptr, size);
       break;
     default:
-      vassert(0, "Unreachable", NULL);
+      private_assert(0, "Unreachable", NULL);
   }
 }
 
@@ -157,7 +137,5 @@ int temporal_valid(void *ptr, void *addr_of_ptr) {
   return 1;
 }
 /* }}} */
-#else
-#  define E_ACSL_TEMPORAL_DESC "disabled"
-#endif
-#endif
+
+#endif // E_ACSL_TEMPORAL
\ No newline at end of file
diff --git a/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal.h b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal.h
new file mode 100644
index 0000000000000000000000000000000000000000..37ea0f3a6be1d351fa23b1b76b7eb6a99db103f6
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal.h
@@ -0,0 +1,137 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+/*! ***********************************************************************
+ * \file  e_acsl_temporal.h
+ * \brief Implementation of the tenporal API shared by all models
+***************************************************************************/
+#ifndef E_ACSL_TEMPORAL_H
+#define E_ACSL_TEMPORAL_H
+
+#include <stddef.h>
+
+#include "../internals/e_acsl_alias.h"
+
+/* No need to encapsulate via ifdef: using these extra definitions does
+   not hurt, otherwise need to pass additional parameters to frama-c */
+#define temporal_store_nblock             export_alias(temporal_store_nblock)
+#define temporal_store_nreferent          export_alias(temporal_store_nreferent)
+#define temporal_save_nblock_parameter    export_alias(temporal_save_nblock_parameter)
+#define temporal_save_nreferent_parameter export_alias(temporal_save_nreferent_parameter)
+#define temporal_save_copy_parameter      export_alias(temporal_save_copy_parameter)
+#define temporal_pull_parameter           export_alias(temporal_pull_parameter)
+#define temporal_save_return              export_alias(temporal_save_return)
+#define temporal_reset_parameters         export_alias(temporal_reset_parameters)
+#define temporal_pull_return              export_alias(temporal_pull_return)
+#define temporal_reset_return             export_alias(temporal_reset_return)
+#define temporal_memcpy                   export_alias(temporal_memcpy)
+#define temporal_memset                   export_alias(temporal_memset)
+
+/* Temporal store {{{ */
+
+/*! \brief Take origin number of a memory block containing `block_addr` and
+ * store it as a referent number of a pointer given by `ptr_addr`. */
+/*@ assigns \nothing; */
+void temporal_store_nblock(void *lhs, void *rhs)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Same as `temporal_store_nblock` but take a referent
+ * number of `block_addr` instead */
+/*@ assigns \nothing; */
+void temporal_store_nreferent(void *lhs, void *rhs)
+  __attribute__((FC_BUILTIN));
+
+/* }}} */
+
+/* Memcpy/memset {{{ */
+
+/*! \brief Copy temporal shadow data from [src, src + size] to
+ * [dest, dest + size]. Counterpart of the memcpy function */
+/*@ assigns \nothing; */
+void temporal_memcpy(void *dest, void *src, size_t size)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Set temporal shadow data from [src, src + size] to 0.
+ * Counterpart of memset the function */
+/*@ assigns \nothing; */
+void temporal_memset(void *dest, int c, size_t size)
+  __attribute__((FC_BUILTIN));
+/* }}} */
+
+/* Function parameters {{{ */
+
+/*! \brief store struct { .ptr = ptr, .temporal_flow = TBlockN }
+ *  in the global parameter array. */
+/*@ assigns \nothing; */
+void temporal_save_nblock_parameter(void *ptr, unsigned int param)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief store struct { .ptr = ptr, .temporal_flow = TReferentN }
+ *  in the global parameter array. */
+/*@ assigns \nothing; */
+void temporal_save_nreferent_parameter(void *ptr, unsigned int param)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief store struct { .ptr = ptr, .temporal_flow = TCopy } in the global
+ *  parameter array. */
+/*@ assigns \nothing; */
+void temporal_save_copy_parameter(void *ptr, unsigned int param)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Assign a referent number of `ptr` based on the record in the global
+ * parameter array at index `param`. */
+/*@ assigns \nothing; */
+void temporal_pull_parameter(void *ptr, unsigned int param, size_t size)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Nullify global parameter array  */
+/*@ assigns \nothing; */
+void temporal_reset_parameters()
+  __attribute__((FC_BUILTIN));
+/* }}} */
+
+/* Return values {{{ */
+
+/*! \brief Save temporal referent number of `ptr` in a placeholder variable
+ * tracking the referent number of a function's return. */
+/*@ assigns \nothing; */
+void temporal_save_return(void *ptr)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Take a temporal referent stored in the placeholder tracking return
+ * values  as a temporal referent number of `ptr`. */
+/*@ assigns \nothing; */
+void temporal_pull_return(void *ptr)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Nullify a placeholder variable tracking the referent number of a
+ * function's return. */
+/*@ assigns \nothing; */
+void temporal_reset_return()
+  __attribute__((FC_BUILTIN));
+/* }}} */
+
+/* Temporal valid {{{ */
+int temporal_valid(void *ptr, void *addr_of_ptr);
+/* }}} */
+
+#endif // E_ACSL_TEMPORAL_H
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_temporal_timestamp.h b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal_timestamp.h
similarity index 98%
rename from src/plugins/e-acsl/share/e-acsl/e_acsl_temporal_timestamp.h
rename to src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal_timestamp.h
index 7fb60f307fd388c2457bdbe7af7d828020de182c..9a5275bfc1564736099591d89a560db5c02d6d02 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_temporal_timestamp.h
+++ b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal_timestamp.h
@@ -28,9 +28,11 @@
 #ifndef E_ACSL_TEMPORAL_TIMESTAMP_H /*{{{*/
 #define E_ACSL_TEMPORAL_TIMESTAMP_H
 
+#ifdef E_ACSL_TEMPORAL /*{{{*/
+
+#include "../internals/e_acsl_rtl_string.h"
 #include <stdint.h>
 
-#ifdef E_ACSL_TEMPORAL /*{{{*/
 /*! Temporal time stamp generator variable
  * Time stamp is generated by incrementing `temporal_timestamp` variable.
  * Value distribution is as follows:
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_alias.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_alias.h
similarity index 98%
rename from src/plugins/e-acsl/share/e-acsl/e_acsl_alias.h
rename to src/plugins/e-acsl/share/e-acsl/internals/e_acsl_alias.h
index 481fbc8ece8d382b5311a51d2625721764e90716..b462be35082e0dc850fb5512cc6672f23c57ee87 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_alias.h
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_alias.h
@@ -21,8 +21,7 @@
 /**************************************************************************/
 
 /*! ***********************************************************************
- * \file  e_acsl_alias.h
- *
+ * \file
  * \brief Function aliasing
 ***************************************************************************/
 
diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_bits.c b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_bits.c
new file mode 100644
index 0000000000000000000000000000000000000000..2799c505d4af5a98c0fce063c2a3a066c026e3fd
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_bits.c
@@ -0,0 +1,32 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+#include "e_acsl_bits.h"
+
+/* Check if we have little-endian and abort the execution otherwise. */
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+#  error "Big-endian byte order is unsupported"
+#elif __BYTE_ORDER__ == __ORDER_PDP_ENDIAN__
+#  error "PDP-endian byte order is unsupported"
+#elif __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
+#  error "Unknown byte order"
+#endif
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_bits.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_bits.h
similarity index 78%
rename from src/plugins/e-acsl/share/e-acsl/e_acsl_bits.h
rename to src/plugins/e-acsl/share/e-acsl/internals/e_acsl_bits.h
index bb35a3cda560733be3c852f30e43259f74723a4b..84a2238ffb05617a8c0aa0ecf2c14b4e6becd347 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_bits.h
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_bits.h
@@ -24,7 +24,7 @@
  * \file  e_acsl_bits.h
  * \brief Bit-level manipulations and endianness checks.
  *
- * Should be included after e_acsl_printf.h and e_acsl_string.h headers.
+ * Should be included after e_acsl_rtl_io.h and e_acsl_rtl_string.h headers.
  *
  * FIXME: Present implementation is built for little-endian byte order.  That
  * is, the implementation assumes that least significant bytes are stored at
@@ -41,58 +41,49 @@
 #include <stdint.h>
 #include <stddef.h>
 
-/* Check if we have little-endian and abort the execution otherwise. */
-#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
-#  error "Big-endian byte order is unsupported"
-#elif __BYTE_ORDER__ == __ORDER_PDP_ENDIAN__
-#  error "PDP-endian byte order is unsupported"
-#elif __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
-#  error "Unknown byte order"
-#endif
-
 /* Bit-level manipulations {{{ */
 
-/* 64-bit type with all bits set to ones */
+/** 64-bit type with all bits set to ones */
 #define ONE UINT64_MAX
 
-/* 64-bit type with all bits set to zeroes */
+/** 64-bit type with all bits set to zeroes */
 #define ZERO (~ONE)
 
-/* Set a given bit in a number to '1' (least-significant bit is at index zero).
+/** Set a given bit in a number to '1' (least-significant bit is at index zero).
  * Example:
  *  int x = 0;    // x => 0000 0000 ...
  *  bitset(0, x)  // x => 1000 0000 ...
  *  bitset(7, x)  // x => 1000 0001 ... */
 #define setbit(_bit,_number) (_number |= 1 << _bit)
 
-/* Same as bitset but the `_bit` bit is cleared (i.e., set of zero) */
+/** Same as bitset but the `_bit` bit is cleared (i.e., set of zero) */
 #define clearbit(_bit, _number) (_number &= ~(1 << _bit))
 
-/* Evaluate to a non-zero value if a given bit in a number is set to 1.
+/** Evaluate to a non-zero value if a given bit in a number is set to 1.
  *  int x = 1;     // x => 1000 0000 ...
  *  checkbit(0, x) // 1
  *  checkbit(1, x) // 0 */
 #define checkbit(_bit, _number) ((_number >> _bit) & 1)
 
-/* Toggle a given bit.
+/** Toggle a given bit.
  * Example:
  *  int x = 4;        // x => 0010 0000 ...
  *  togglebit(3, x);  // x => 0000 0000 ...
  *  togglebit(3, x);  // x => 0010 0000 ... */
 #define togglebit(_bit, _number) (_number ^= 1 << _bit)
 
-/* Set a given bit to a specified value (e.g., 0 or 1). */
+/** Set a given bit to a specified value (e.g., 0 or 1). */
 #define changebit(_bit, _val, _number) \
   (_number ^= (-_val ^ _number) & (1 << _bit))
 
-/* Set up to 64 bits from left to right to ones.
+/** Set up to 64 bits from left to right to ones.
  * Example:
  *  int x = 0;        // x => 00000000 00000000 ...
  *  setbits64(11, x)  //   => 11111111 11100000 ...
  *  setbits64(64, x)  //   => behaviour undefined */
 #define setbits64(_bits, _number)   (_number |= ~(ONE << _bits))
 
-/* Set up to 64 bits from left to right to ones skiping `_skip` leftmost bits
+/** Set up to 64 bits from left to right to ones skiping `_skip` leftmost bits
  * Example:
  *  int x = 0;          // x => 00000000 00000000 ...
  *  setbits64(11, x, 2) //   => 00111111 11111000 ...
@@ -100,7 +91,7 @@
 #define setbits64_skip(_bits, _number, _skip) \
   (_number |= ~(ONE << _bits) << _skip)
 
-/* Evaluate to 1 if up to 64 bits from left to right in `_number` are set:
+/** Evaluate to 1 if up to 64 bits from left to right in `_number` are set:
  * Example:
  *  int x = 31;         // x => 11111000 00000000 ...
  *  checkbits64(4, x)   //   => 1
@@ -110,7 +101,7 @@
 #define checkbits64(_bits, _number) \
   ((_number & ~(ONE << _bits)) ==  (~(ONE << _bits)))
 
-/* Same as checkbits64 but with skipping `_skip` leftmost bits
+/** Same as checkbits64 but with skipping `_skip` leftmost bits
  * Example:
  *  int x = 124;               // x => 00111100 00000000 ...
  *  checkbits64_skip(3,  x, 2) // => 1
@@ -121,19 +112,19 @@
 #define checkbits64_skip(_bits, _number, _skip) \
   ((_number & ~(ONE << _bits) << _skip) == (~(ONE << _bits) << _skip))
 
-/* Same as `setbits64' but clear the bits (set to zeroes). */
+/** Same as `setbits64' but clear the bits (set to zeroes). */
 #define clearbits64(_bits, _number) (_number &= ONE << _bits)
 
-/* Set `_bits' bits from right to the left starting from a 64-bit boundary.
+/** Set `_bits' bits from right to the left starting from a 64-bit boundary.
  * Example:
  *  long x = 0;            // x => ... 00000000 00000000 00000000 00000000
  *  setbits64_right(10, x) // x => ... 00000000 00000000 00000011 11111111 */
 #define setbits64_right(_bits, _number)   (_number |= ~(ONE >> _bits))
 
-/* Same as setbits64_right but clears bits (sets to zeroes) */
+/** Same as setbits64_right but clears bits (sets to zeroes) */
 #define clearbits64_right(_bits, _number) (_number &= ONE >> _bits)
 
-/* Set `size' bits starting from an address given by `ptr' to ones.
+/** Set `size' bits starting from an address given by `ptr' to ones.
  * Example:
  *  char a[4];
  *  memset(a,0,4);    // => 00000000 00000000 00000000 00000000
@@ -146,7 +137,7 @@ static inline void setbits(size_t size, void *ptr) {
   setbits64(size%64, *(lp+i));
 }
 
-/* Same as `setbits' but clear the bits (set to zeroes). */
+/** Same as `setbits' but clear the bits (set to zeroes). */
 static inline void clearbits(size_t size, void *ptr) {
   size_t i;
   int64_t *lp = (int64_t*)ptr;
@@ -155,7 +146,7 @@ static inline void clearbits(size_t size, void *ptr) {
   clearbits64(size%64, *(lp+i));
 }
 
-/* Same as `setbits' but clear the bits (set to zeroes). */
+/** Same as `setbits' but clear the bits (set to zeroes). */
 static inline int checkbits(size_t size, void *ptr) {
   size_t i;
   int64_t *lp = (int64_t*)ptr;
@@ -166,7 +157,7 @@ static inline int checkbits(size_t size, void *ptr) {
   return checkbits64(size%64, *(lp+i));
 }
 
-/* Same as `setbits' but set the bits from right to left
+/** Same as `setbits' but set the bits from right to left
  * Example:
  *  char a[4];
  *  memset(a,0,4);         // => 00000000 00000000 00000000 00000000
@@ -179,7 +170,7 @@ static inline void setbits_right(size_t size, void *ptr) {
   setbits64_right(size%64, *(lp-i));
 }
 
-/* Same as `setbits_right' but clear the bits (set to zeroes). */
+/** Same as `setbits_right' but clear the bits (set to zeroes). */
 static inline void clearbits_right(size_t size, void *ptr) {
   size_t i = 0;
   int64_t *lp = (int64_t*)ptr - 1;
@@ -187,5 +178,5 @@ static inline void clearbits_right(size_t size, void *ptr) {
     *(lp-i) &= ZERO;
   clearbits64_right(size%64, *(lp-i));
 }
-/* }}} */
-#endif
+
+#endif // E_ACSL_BITS_H
\ No newline at end of file
diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_debug.c b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_debug.c
new file mode 100644
index 0000000000000000000000000000000000000000..0c42873864c1d7b89465dcc26403ac252afb3de3
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_debug.c
@@ -0,0 +1,94 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "../observation_model/internals/e_acsl_omodel_debug.h"
+#include "e_acsl_private_assert.h"
+#include "e_acsl_rtl_io.h"
+
+#include "e_acsl_debug.h"
+
+/** Debugging support {{{
+ * Enabled in the presence of the E_ACSL_DEBUG macro */
+#ifdef E_ACSL_DEBUG
+
+/*! \brief Name of the debug log file */
+static const char *dlog_name = TOSTRING(E_ACSL_DEBUG_LOG);
+
+// Global vars initialization
+int dlog_fd = -1;
+int debug_stop_number = 0;
+
+void initialize_report_file(int *argc, char ***argv) {
+  /* Redirect the log to stderr is just set to be defined or set to '-' */
+  if (!strcmp(dlog_name, "-") || !strcmp(dlog_name, "1")) {
+    dlog_fd = 2;
+  } else {
+    dlog_fd = open(dlog_name, O_WRONLY | O_CREAT | O_TRUNC  |O_NONBLOCK
+      | O_NOCTTY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
+  }
+  if (dlog_fd == -1)
+    private_abort("Cannot open file descriptor for %s\n", dlog_name);
+}
+
+#endif // E_ACSL_DEBUG
+// }}}
+
+#ifdef E_ACSL_WEAK_VALIDITY
+# define E_ACSL_VALIDITY_DESC "weak"
+#else
+# define E_ACSL_VALIDITY_DESC "strong"
+#endif
+
+#ifdef E_ACSL_NO_ASSERT_FAIL
+# define E_ACSL_ASSERT_NO_FAIL_DESC "pass through"
+#else
+# define E_ACSL_ASSERT_NO_FAIL_DESC "abort"
+#endif
+
+#ifdef E_ACSL_TEMPORAL
+#define E_ACSL_TEMPORAL_DESC "enabled"
+#else
+# define E_ACSL_TEMPORAL_DESC "disabled"
+#endif // E_ACSL_TEMPORAL
+
+#ifndef E_ACSL_VALIDATE_FORMAT_STRINGS
+# define E_ACSL_FORMAT_VALIDITY_DESC "disabled"
+#else
+# define E_ACSL_FORMAT_VALIDITY_DESC "enabled"
+#endif // E_ACSL_VALIDATE_FORMAT_STRINGS
+
+void describe_run() {
+#if defined(E_ACSL_VERBOSE)
+  rtl_printf("/* ========================================================= */\n");
+  rtl_printf(" * E-ACSL instrumented run\n" );
+  rtl_printf(" * Execution mode:  %s\n", E_ACSL_DEBUG_DESC);
+  describe_observation_model();
+  rtl_printf(" * Assertions mode: %s\n", E_ACSL_ASSERT_NO_FAIL_DESC);
+  rtl_printf(" * Validity notion: %s\n", E_ACSL_VALIDITY_DESC);
+  rtl_printf(" * Temporal checks: %s\n", E_ACSL_TEMPORAL_DESC);
+  rtl_printf(" * Format Checks:   %s\n", E_ACSL_FORMAT_VALIDITY_DESC);
+  rtl_printf("/* ========================================================= */\n");
+#endif
+}
\ No newline at end of file
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_debug.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_debug.h
similarity index 76%
rename from src/plugins/e-acsl/share/e-acsl/e_acsl_debug.h
rename to src/plugins/e-acsl/share/e-acsl/internals/e_acsl_debug.h
index 0a047997ee727b9d147c2b64f21432c5771cd640..3a7612806f1daeac4631d81f9081c76e995614d1 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_debug.h
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_debug.h
@@ -21,14 +21,13 @@
 /**************************************************************************/
 
 /*! ***********************************************************************
- * \file   e_acsl_debug.h
+ * \file
  * \brief  Debug-level functions and macros
 ***************************************************************************/
+
 #ifndef E_ACSL_DEBUG_H
 #define E_ACSL_DEBUG_H
 
-static void vabort(char *fmt, ...);
-
 /* Stringification macros {{{ */
 #ifndef E_ACSL_STRINGIFICATION
 #define E_ACSL_STRINGIFICATION
@@ -42,26 +41,20 @@ static void vabort(char *fmt, ...);
  * Enabled in the presence of the E_ACSL_DEBUG macro */
 #ifdef E_ACSL_DEBUG
 
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include "e_acsl_printf.h"
-#include "e_acsl_string.h"
-#include "e_acsl_trace.h"
-#include "e_acsl_assert.h"
-
 #define E_ACSL_DEBUG_DESC "debug"
 
+#include "e_acsl_private_assert.h"
+#include "e_acsl_rtl_io.h"
+
+#include <stdio.h>
+
 /* Default location of the E_ACSL log file */
 #ifndef E_ACSL_DEBUG_LOG
 #  define E_ACSL_DEBUG_LOG -
 #endif
 
-/*! \brief Name of the debug log file */
-static const char *dlog_name = TOSTRING(E_ACSL_DEBUG_LOG);
-
 /*! \brief File descriptor associated with the debug log file */
-static int dlog_fd = -1;
+int dlog_fd;
 
 /*! \brief Output a message to a log file */
 #define DLOG(...) rtl_dprintf(dlog_fd, __VA_ARGS__)
@@ -73,29 +66,17 @@ static int dlog_fd = -1;
 #endif
 
 /*! \brief Debug-time assertion based on assert (see e_acsl_assert.h) */
-#define DASSERT(_e) vassert(_e,TOSTRING(_e),NULL)
+#define DASSERT(_e) private_assert(_e,TOSTRING(_e),NULL)
 
 /*! \brief Debug-time assertion based on vassert (see e_acsl_assert.h) */
-#define DVASSERT(_expr, _fmt, ...) vassert(_expr, _fmt, __VA_ARGS__)
+#define DVASSERT(_expr, _fmt, ...) private_assert(_expr, _fmt, __VA_ARGS__)
 
 /*! \brief Initialize debug report file:
  *  - open file descriptor
  *  - add program arguments to the log */
-static void initialize_report_file(int *argc, char ***argv) {
-  /* Redirect the log to stderr is just set to be defined or set to '-' */
-  if (!strcmp(dlog_name, "-") || !strcmp(dlog_name, "1")) {
-    dlog_fd = 2;
-  } else {
-    dlog_fd = open(dlog_name, O_WRONLY | O_CREAT | O_TRUNC  |O_NONBLOCK
-      | O_NOCTTY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
-  }
-  if (dlog_fd == -1)
-    vabort("Cannot open file descriptor for %s\n", dlog_name);
-}
-
-static int debug_stop_number = 0;
-int getchar(void);
+void initialize_report_file(int *argc, char ***argv);
 
+int debug_stop_number;
 #define DSTOP { \
   DLOG(" << ***** " "Debug Stop %d in '%s' at %s:%d" " ***** >> ", \
     ++debug_stop_number, __func__, __FILE__, __LINE__); \
@@ -110,6 +91,10 @@ int getchar(void);
 #  define DVLOG(...)
 #  define DASSERT(_e)
 #  define DVASSERT(_expr, _fmt, ...)
-#endif
-#endif
+#endif // E_ACSL_DEBUG
 // }}}
+
+/*! Print a header indicating current configuration of a run to STDIN. */
+void describe_run();
+
+#endif // E_ACSL_DEBUG_H
diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_malloc.c b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_malloc.c
new file mode 100644
index 0000000000000000000000000000000000000000..da258a76512aa19d44d40332586bbad8db800821
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_malloc.c
@@ -0,0 +1,57 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+#include "e_acsl_malloc.h"
+
+struct memory_spaces mem_spaces = {
+  .rtl_mspace = NULL,
+  .heap_mspace = NULL,
+  .heap_start = 0,
+  .heap_end = 0,
+  .heap_mspace_least = 0,
+};
+
+/* \brief Create two memory spaces, one for RTL and the other for application
+   memory. This function *SHOULD* be called before any allocations are made
+   otherwise execution fails */
+void make_memory_spaces(size_t rtl_size, size_t heap_size) {
+  mem_spaces.rtl_mspace = create_mspace(rtl_size, 0);
+  mem_spaces.heap_mspace = create_mspace(heap_size, 0);
+  /* Do not use `mspace_least_addr` here, as it returns the address of the
+     mspace header. */
+  mem_spaces.heap_start = (uintptr_t)mspace_malloc(mem_spaces.heap_mspace,1);
+  mem_spaces.heap_end = mem_spaces.heap_start + heap_size;
+  /* Save initial least address of heap memspace. This address is used later
+     to check whether memspace has been moved. */
+  mem_spaces.heap_mspace_least = (uintptr_t)mspace_least_addr(mem_spaces.heap_mspace);
+}
+
+void destroy_memory_spaces() {
+  destroy_mspace(mem_spaces.rtl_mspace);
+  destroy_mspace(mem_spaces.heap_mspace);
+}
+
+int is_pow_of_2(size_t x) {
+  while (((x & 1) == 0) && x > 1) /* while x is even and > 1 */
+    x >>= 1;
+  return (x == 1);
+}
diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_malloc.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_malloc.h
new file mode 100644
index 0000000000000000000000000000000000000000..46eab5f161adccb15bebb03fc296b864dd18f5f7
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_malloc.h
@@ -0,0 +1,142 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+/*! ***********************************************************************
+ * \file
+ * \brief E-ACSL memory allocation bindings.
+ *
+ * Memory allocated for internal use of RTL and for the use by the application
+ * is split into two mspaces (memory spaces). Memory allocation itself is
+ * delegated to a slightly customised version of dlmalloc shipped with the
+ * RTL. The overall pattern is as follows:
+ *    mspace space = create_mspace(capacity, locks);
+ *    char *p = mspace_malloc(space, size);
+***************************************************************************/
+
+#ifndef E_ACSL_MALLOC_H
+#define E_ACSL_MALLOC_H
+
+#include <stdint.h>
+#include <stddef.h>
+
+#include "e_acsl_alias.h"
+
+/* Block size units in bytes */
+#define KB (1024)         //!< Bytes in a kilobyte
+#define MB (1024*KB)      //!< Bytes in a megabyte
+#define GB (1024*MB)      //!< Bytes in a gigabyte
+#define KB_SZ(_s) (_s/KB) //!< Convert bytes to kilobytes
+#define MB_SZ(_s) (_s/MB) //!< Convert bytes to megabytes
+#define GB_SZ(_s) (_s/GB) //!< Convert bytes to gigabytes
+
+/************************************************************************/
+/*** Mspace initialization {{{ ***/
+/************************************************************************/
+
+#define make_memory_spaces    export_alias(make_memory_spaces)
+#define destroy_memory_spaces export_alias(destroy_memory_spaces)
+
+/*! \brief Create two memory spaces, one for RTL and the other for application
+    memory. This function *SHOULD* be called before any allocations are made
+    otherwise execution fails */
+void make_memory_spaces(size_t rtl_size, size_t heap_size);
+
+/*! \brief Destroy the memory spaces created with `make_memory_spaces()`. */
+void destroy_memory_spaces();
+
+/* }}} */
+
+
+/************************************************************************/
+/*** Mspace allocators (from dlmalloc) {{{ ***/
+/************************************************************************/
+
+#define create_mspace         export_alias(create_mspace)
+#define destroy_mspace        export_alias(destroy_mspace)
+#define mspace_least_addr     export_alias(mspace_least_addr)
+#define mspace_malloc         export_alias(mspace_malloc)
+#define mspace_free           export_alias(mspace_free)
+#define mspace_calloc         export_alias(mspace_calloc)
+#define mspace_realloc        export_alias(mspace_realloc)
+#define mspace_posix_memalign export_alias(mspace_posix_memalign)
+#define mspace_aligned_alloc  export_alias(mspace_aligned_alloc)
+
+typedef void* mspace;
+
+struct memory_spaces {
+  mspace rtl_mspace; /* `private` (RTL) mspace */
+  mspace heap_mspace;  /* `public` (application) mspace */
+  uintptr_t heap_start; /* least address in application mspace */
+  uintptr_t heap_end; /* greatest address in application mspace */
+  uintptr_t heap_mspace_least; /* Initial least address in heap mspace */
+};
+extern struct memory_spaces mem_spaces;
+
+extern mspace create_mspace(size_t, int);
+extern size_t destroy_mspace(mspace);
+extern void*  mspace_malloc(mspace, size_t);
+extern void   mspace_free(mspace, void*);
+extern void*  mspace_calloc(mspace msp, size_t, size_t);
+extern void*  mspace_realloc(mspace msp, void*, size_t);
+extern void*  mspace_aligned_alloc(mspace, size_t, size_t);
+extern int    mspace_posix_memalign(mspace, void **, size_t, size_t);
+extern void*  mspace_least_addr(mspace);
+
+/* }}} */
+
+/************************************************************************/
+/*** Public allocators {{{ ***/
+/************************************************************************/
+
+/* Used within RTL to override standard allocation */
+/* Shortcuts for public allocation functions */
+
+#define public_malloc(...)         mspace_malloc(mem_spaces.heap_mspace, __VA_ARGS__)
+#define public_realloc(...)        mspace_realloc(mem_spaces.heap_mspace, __VA_ARGS__)
+#define public_calloc(...)         mspace_calloc(mem_spaces.heap_mspace, __VA_ARGS__)
+#define public_free(...)           mspace_free(mem_spaces.heap_mspace, __VA_ARGS__)
+#define public_aligned_alloc(...)  mspace_aligned_alloc(mem_spaces.heap_mspace, __VA_ARGS__)
+#define public_posix_memalign(...) mspace_posix_memalign(mem_spaces.heap_mspace, __VA_ARGS__)
+
+/* }}} */
+
+/************************************************************************/
+/*** Private allocators usable within RTL and GMP {{{ ***/
+/************************************************************************/
+
+#define private_malloc(...)  mspace_malloc(mem_spaces.rtl_mspace, __VA_ARGS__)
+#define private_calloc(...)  mspace_calloc(mem_spaces.rtl_mspace, __VA_ARGS__)
+#define private_realloc(...) mspace_realloc(mem_spaces.rtl_mspace, __VA_ARGS__)
+#define private_free(...)    mspace_free(mem_spaces.rtl_mspace, __VA_ARGS__)
+
+/* }}} */
+
+/************************************************************************/
+/*** Useful functions {{{ ***/
+/************************************************************************/
+
+/* \return a true value if x is a power of 2 and false otherwise */
+int is_pow_of_2(size_t x);
+
+/* }}} */
+
+#endif // E_ACSL_MALLOC_H
\ No newline at end of file
diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_private_assert.c b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_private_assert.c
new file mode 100644
index 0000000000000000000000000000000000000000..94516feab171db3523c2e71ce28f0fefd575cfb6
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_private_assert.c
@@ -0,0 +1,81 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+/* Get default definitions and macros e.g., PATH_MAX */
+// #ifndef _DEFAULT_SOURCE
+// # define _DEFAULT_SOURCE 1
+// #endif
+
+#include <limits.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stddef.h>
+
+#include "e_acsl_rtl_io.h"
+#include "e_acsl_trace.h"
+
+#include "e_acsl_private_assert.h"
+
+#define prepend_file_line(file, line, fmt) \
+  do { \
+    char * afmt = "%s:%d: %s\n"; \
+    char buf[strlen(fmt) + strlen(afmt) + PATH_MAX + 11]; \
+    rtl_sprintf(buf, afmt, file, line, fmt); \
+    fmt = buf; \
+  } while (0)
+
+void raise_abort(const char *file, int line) {
+#ifdef E_ACSL_DEBUG
+#ifndef E_ACSL_NO_TRACE
+  trace();
+#endif
+#endif
+  raise(SIGABRT);
+}
+
+void private_abort_fail(const char * file, int line, char *fmt, ...) {
+  va_list va;
+  sigset_t defer_abrt;
+  sigemptyset(&defer_abrt);
+  sigaddset(&defer_abrt,SIGABRT);
+  sigprocmask(SIG_BLOCK,&defer_abrt,NULL);
+  va_start(va,fmt);
+  rtl_veprintf(fmt, va);
+  va_end(va);
+  sigprocmask(SIG_UNBLOCK,&defer_abrt,NULL);
+  raise_abort(file, line);
+}
+
+void private_assert_fail(int expr, const char *file, int line, char *fmt,  ...) {
+  if (!expr) {
+    char * afmt = "%s:%d: %s";
+    char buf[strlen(fmt) + strlen(afmt) + PATH_MAX + 11];
+    rtl_sprintf(buf, afmt, file, line, fmt);
+    fmt = buf;
+
+    va_list va;
+    va_start(va,fmt);
+    rtl_veprintf(fmt, va);
+    va_end(va);
+    raise_abort(file, line);
+  }
+}
diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_private_assert.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_private_assert.h
new file mode 100644
index 0000000000000000000000000000000000000000..b4d9b1ef28d00ba7a0e390c956a60a18d0af0594
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_private_assert.h
@@ -0,0 +1,57 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+/*! ***********************************************************************
+ * \file
+ * \brief E-ACSL assertions and abort statements implementation.
+***************************************************************************/
+
+#ifndef E_ACSL_PRIVATE_ASSERT
+#define E_ACSL_PRIVATE_ASSERT
+
+/*! \brief Assert with printf-like error message support */
+#define private_assert(expr, fmt_and_args...) \
+  private_assert_fail(expr, __FILE__, __LINE__, fmt_and_args)
+
+/*! \brief Output a message to error stream using printf-like format string
+ * and abort the execution.
+ *
+ * This is a wrapper for \p eprintf combined with \p abort */
+#define private_abort(fmt_and_args...) \
+  private_abort_fail(__FILE__, __LINE__, fmt_and_args)
+
+
+void private_assert_fail(int expr, const char *file, int line, char *fmt,  ...);
+void private_abort_fail(const char * file, int line, char *fmt, ...);
+void raise_abort(const char * file, int line);
+
+/* Instances of assertions shared accross different memory models */
+
+/*! \brief Abort the execution if the size of the pointer computed during
+ * instrumentation (\p _ptr_sz) does not match the size of the pointer used
+ * by a compiler (\p void*) */
+#define arch_assert(_ptr_sz) \
+  private_assert(_ptr_sz == sizeof(void*), \
+    "Mismatch of instrumentation- and compile-time pointer sizes: " \
+    "%lu vs %lu\n", _ptr_sz, sizeof(void*))
+
+#endif // E_ACSL_PRIVATE_ASSERT
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_printf.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.c
similarity index 82%
rename from src/plugins/e-acsl/share/e-acsl/e_acsl_printf.h
rename to src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.c
index c54588f7f65659daa264272137922ab22868e015..5453030b537bb3bce02c11d39873e5682b598a20 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_printf.h
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.c
@@ -37,65 +37,15 @@
 /****************************************************************************/
 
 /*! ***********************************************************************
- * \file   e_acsl_printf.h
+ * \file
  * \brief Malloc and stdio free implementation printf.
- *
- * Supported format strings:
- * - Flag characters:
- *     - 0       - the following value will be is zero-padded.
- *
- * - Field width:
- *     - Optional positive decimal integer following flag characters.
- *
- * - Length modifier:
- *     - l       - the following integer conversion corresponds to a long int or
- *                  unsigned long int argument.
- *
- * - Standard conversion specifiers:
- *    - d       - signed integers.
- *    - u       - unsigned integers.
- *    - f       - floating point numbers. Floating point numbers do not support
- *    -             precision specification.
- *    - x,X     - hexadecimal numbers.
- *    - p       - void pointers.
- *
- * - Non-standard conversion specifiers:
- *     - a       - memory-address.
- *     - b, B    - print field width bits of a number left-to-right (b) or
- *      right-to-left (B). Unless specified field-width of 8 is used. Bits
- *      over a 64-bit boundary are ignored.
- *     - v, V    - print first field width bits of a memory region given by a
- *      void pointer left-to-right (v) or right-to-left (V). Unless specified
- *      field-width of 8 is used.
 ***************************************************************************/
 
-#ifndef E_ACSL_PRINTF_H
-#define E_ACSL_PRINTF_H
-
-#include <unistd.h>
-#include <stdint.h>
 #include <stdarg.h>
-#include "e_acsl_alias.h"
-
-/* ****************** */
-/* Public API         */
-/* ****************** */
-
-/* Replacement for printf with support for the above specifiers */
-static int rtl_printf(char *fmt, ...);
-
-/* Same as printf but write to a string buffer */
-static int rtl_sprintf(char* s, char *fmt, ...);
-
-/* Same as printf but write to the error stream. */
-static int rtl_eprintf(char *fmt, ...);
-
-/* Same as printf but write to a file descriptor. */
-static int rtl_dprintf(int fd, char *fmt, ...);
+#include <stdint.h>
+#include <unistd.h>
 
-/* ****************** */
-/* Implementation     */
-/* ****************** */
+#include "e_acsl_rtl_io.h"
 
 typedef void (*putcf) (void*,char);
 
@@ -402,41 +352,56 @@ static void _charc_literal  (void* p, char c) {
   }
 }
 
-static int rtl_printf(char *fmt, ...) {
+int rtl_printf(char *fmt, ...) {
   va_list va;
   va_start(va,fmt);
-  _format(NULL,_charc_stdout,fmt,va);
+  int result = rtl_vprintf(fmt, va);
   va_end(va);
+  return result;
+}
+
+int rtl_vprintf(char *fmt, va_list vlist) {
+  _format(NULL, _charc_stdout, fmt, vlist);
   return 1;
 }
 
-static int rtl_eprintf(char *fmt, ...) {
+int rtl_eprintf(char *fmt, ...) {
   va_list va;
   va_start(va,fmt);
-  _format(NULL,_charc_stderr,fmt,va);
+  int result = rtl_veprintf(fmt, va);
   va_end(va);
+  return result;
+}
+
+int rtl_veprintf(char *fmt, va_list vlist) {
+  _format(NULL, _charc_stderr, fmt, vlist);
   return 1;
 }
 
-static int rtl_dprintf(int fd, char *fmt, ...) {
+int rtl_dprintf(int fd, char *fmt, ...) {
   va_list va;
   va_start(va,fmt);
-  intptr_t fd_long = fd;
-  _format((void*)fd_long,_charc_file,fmt,va);
+  int result = rtl_vdprintf(fd, fmt, va);
   va_end(va);
+  return result;
+}
+
+int rtl_vdprintf(int fd, char *fmt, va_list vlist) {
+  intptr_t fd_long = fd;
+  _format((void*)fd_long, _charc_file, fmt, vlist);
   return 1;
 }
 
-static int rtl_sprintf(char* s, char *fmt, ...) {
+int rtl_sprintf(char* s, char *fmt, ...) {
   va_list va;
   va_start(va,fmt);
-  _format(&s,putcp,fmt,va);
-  putcp(&s,0);
+  int result = rtl_vsprintf(s, fmt, va);
   va_end(va);
-  return 1;
+  return result;
 }
 
-#define STDOUT(...) rtl_printf(__VA_ARGS__)
-#define STDERR(...) rtl_eprintf(__VA_ARGS__)
-
-#endif
+int rtl_vsprintf(char *s, char *fmt, va_list vlist) {
+  _format(&s, putcp, fmt, vlist);
+  putcp(&s,0);
+  return 1;
+}
\ No newline at end of file
diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.h
new file mode 100644
index 0000000000000000000000000000000000000000..839bfe24fb366099648c9b28fc6b3aac0058372e
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.h
@@ -0,0 +1,98 @@
+/****************************************************************************/
+/*                                                                          */
+/*  Copyright (c) 2004,2012 Kustaa Nyholm / SpareTimeLabs                   */
+/*                                                                          */
+/*  All rights reserved.                                                    */
+/*                                                                          */
+/*  Redistribution and use in source and binary forms, with or without      */
+/*  modification, are permitted provided that the following conditions      */
+/*  are met:                                                                */
+/*                                                                          */
+/*  Redistributions of source code must retain the above copyright          */
+/*  notice, this list of conditions and the following disclaimer.           */
+/*                                                                          */
+/*  Redistributions in binary form must reproduce the above copyright       */
+/*  notice, this list of conditions and the following disclaimer in the     */
+/*  documentation and/or other materials provided with the distribution.    */
+/*                                                                          */
+/*  Neither the name of the Kustaa Nyholm or SpareTimeLabs nor the names    */
+/*  of its contributors may be used to endorse or promote products derived  */
+/*  from this software without specific prior written permission.           */
+/*                                                                          */
+/*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS     */
+/*  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT       */
+/*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR   */
+/*  A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT   */
+/*  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,  */
+/*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT        */
+/*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,   */
+/*  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY   */
+/*  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT     */
+/*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE   */
+/*  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.    */
+/*                                                                          */
+/*  File modified by CEA (Commissariat à l'énergie atomique et aux          */
+/*                        énergies alternatives).                           */
+/*                                                                          */
+/****************************************************************************/
+
+/*! ***********************************************************************
+ * \file
+ * \brief Malloc and stdio free implementation printf.
+ *
+ * Supported format strings:
+ * - Flag characters:
+ *     - 0       - the following value will be is zero-padded.
+ *
+ * - Field width:
+ *     - Optional positive decimal integer following flag characters.
+ *
+ * - Length modifier:
+ *     - l       - the following integer conversion corresponds to a long int or
+ *                  unsigned long int argument.
+ *
+ * - Standard conversion specifiers:
+ *    - d       - signed integers.
+ *    - u       - unsigned integers.
+ *    - f       - floating point numbers. Floating point numbers do not support
+ *    -             precision specification.
+ *    - x,X     - hexadecimal numbers.
+ *    - p       - void pointers.
+ *
+ * - Non-standard conversion specifiers:
+ *     - a       - memory-address.
+ *     - b, B    - print field width bits of a number left-to-right (b) or
+ *      right-to-left (B). Unless specified field-width of 8 is used. Bits
+ *      over a 64-bit boundary are ignored.
+ *     - v, V    - print first field width bits of a memory region given by a
+ *      void pointer left-to-right (v) or right-to-left (V). Unless specified
+ *      field-width of 8 is used.
+***************************************************************************/
+
+#ifndef E_ACSL_RTL_IO_H
+#define E_ACSL_RTL_IO_H
+
+#include <stdarg.h>
+
+#define STDOUT(...) rtl_printf(__VA_ARGS__)
+#define STDERR(...) rtl_eprintf(__VA_ARGS__)
+
+/* Replacement for printf with support for the above specifiers */
+int rtl_printf(char *fmt, ...);
+int rtl_vprintf(char *fmt, va_list vlist);
+
+/* Same as printf but write to a string buffer */
+int rtl_sprintf(char* s, char *fmt, ...);
+int rtl_vsprintf(char *s, char *fmt, va_list vlist);
+
+/* Same as printf but write to the error stream. */
+int rtl_eprintf(char *fmt, ...);
+int rtl_veprintf(char *fmt, va_list vlist);
+
+/* Same as printf but write to a file descriptor. */
+int rtl_dprintf(int fd, char *fmt, ...);
+int rtl_vdprintf(int fd, char *fmt, va_list vlist);
+
+int rtl_vformat_stderr();
+
+#endif // E_ACSL_RTL_IO_H
\ No newline at end of file
diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_string.c b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_string.c
new file mode 100644
index 0000000000000000000000000000000000000000..d908c0f23b8d9a22faa5e8c09fa11786318d5b7d
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_string.c
@@ -0,0 +1,93 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+#include "e_acsl_malloc.h"
+
+#include "e_acsl_rtl_string.h"
+
+char *nstrcat(char *dest, const char *src) {
+  memcpy(dest + strlen(dest), src, strlen(src) + 1);
+  return dest;
+}
+
+char *nstrdup(const char *s) {
+  if (s) {
+    size_t len = strlen(s) + 1;
+    void *n = private_malloc(len);
+    return (n == NULL) ? NULL : (char*)memcpy(n, s, len);
+  }
+  return NULL;
+}
+
+char *sappend(char *dest, const char *src, const char *delim) {
+  if (!dest && src)
+    dest = nstrdup(src);
+  else if (src && dest) {
+    size_t ldelim = delim ? strlen(delim) : 0;
+    size_t len = strlen(src) + strlen(dest) + 1;
+    if (ldelim)
+      len += ldelim;
+    dest = private_realloc(dest, len);
+    if (ldelim)
+      dest = nstrcat(dest, delim);
+    dest = nstrcat(dest, src);
+  }
+  return dest;
+}
+
+int endswith(char *str, char *pat) {
+  if (str && pat) {
+    size_t slen = strlen(str);
+    size_t plen = strlen(pat);
+    if (slen >= plen) {
+      str += slen - plen;
+      return strncmp(str, pat, plen);
+    }
+  }
+  return 1;
+}
+
+#define ZERO_BLOCK_SIZE 1024
+static unsigned char zeroblock [ZERO_BLOCK_SIZE];
+
+int zeroed_out(const void *p, size_t size) {
+  size_t lim = size/ZERO_BLOCK_SIZE,
+         rem = size%ZERO_BLOCK_SIZE;
+  unsigned char *pc = (unsigned char *)p;
+
+  size_t i;
+  for (i = 0; i < lim; i++) {
+    if (memcmp(pc, &zeroblock, ZERO_BLOCK_SIZE))
+      return 0;
+    pc += ZERO_BLOCK_SIZE;
+  }
+  return !memcmp(pc, &zeroblock, rem);
+}
+
+int charcount(const char *s, char c) {
+  int count = 0;
+  while ((s = strchr(s,c)) != NULL) {
+    count++;
+    s++;
+  }
+  return count;
+}
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_string.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_string.h
similarity index 69%
rename from src/plugins/e-acsl/share/e-acsl/e_acsl_string.h
rename to src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_string.h
index 5dcc1d087745b3825619c3a1bfc8db7ea665077f..392b53cdbbbd0dcc3b60674d42d97c43934de6e0 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_string.h
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_string.h
@@ -21,7 +21,7 @@
 /**************************************************************************/
 
 /*! ***********************************************************************
- * \file   e_acsl_string.h
+ * \file
  * \brief Replacement of system-wide \p <string.h> header for use with E-ACSL
  * runtime library.
  *
@@ -36,8 +36,8 @@
  *    of string.h functions use GLIBC-based implementations.
 ***************************************************************************/
 
-#ifndef E_ACSL_STD_STRING_H
-#define E_ACSL_STD_STRING_H
+#ifndef E_ACSL_RTL_STRING_H
+#define E_ACSL_RTL_STRING_H
 
 #ifndef E_ACSL_NO_COMPILER_BUILTINS
 # define memset   __builtin_memset
@@ -57,23 +57,12 @@
 #endif
 
 #include <stddef.h>
-#include "e_acsl_malloc.h"
 
 /* \brief Local version of `strcat` */
-static char *nstrcat(char *dest, const char *src) {
-  memcpy(dest + strlen(dest), src, strlen(src) + 1);
-  return dest;
-}
+char *nstrcat(char *dest, const char *src);
 
 /* \brief Local version of `strdup` */
-static char *nstrdup(const char *s) {
-  if (s) {
-    size_t len = strlen(s) + 1;
-    void *n = private_malloc(len);
-    return (n == NULL) ? NULL : (char*)memcpy(n, s, len);
-  }
-  return NULL;
-}
+char *nstrdup(const char *s);
 
 /* \brief Append `src` to `dest` by re-allocating `dest`.
  *
@@ -83,64 +72,19 @@ static char *nstrdup(const char *s) {
  * `delim` is appended to `dest` before `src`
  *
  * \return Result of concatenation of `dest` and `src` */
-static char *sappend(char *dest, const char *src, const char *delim) {
-  if (!dest && src)
-    dest = nstrdup(src);
-  else if (src && dest) {
-    size_t ldelim = delim ? strlen(delim) : 0;
-    size_t len = strlen(src) + strlen(dest) + 1;
-    if (ldelim)
-      len += ldelim;
-    dest = private_realloc(dest, len);
-    if (ldelim)
-      dest = nstrcat(dest, delim);
-    dest = nstrcat(dest, src);
-  }
-  return dest;
-}
+char *sappend(char *dest, const char *src, const char *delim);
 
 /** \brief Return 0 if C string `str` ends with string `pat` and a non-zero
  * value otherwise. The function assumes that both, `str` and `path` are valid,
  * NUL-terminated C strings. If any of the input strings are NULLs, a non-zero
  * value is returned. */
-static int endswith(char *str, char *pat) {
-  if (str && pat) {
-    size_t slen = strlen(str);
-    size_t plen = strlen(pat);
-    if (slen >= plen) {
-      str += slen - plen;
-      return strncmp(str, pat, plen);
-    }
-  }
-  return 1;
-}
-
-#define ZERO_BLOCK_SIZE 1024
-static unsigned char zeroblock [ZERO_BLOCK_SIZE];
+int endswith(char *str, char *pat);
 
 /** \brief Return a non-zero value if `size` bytes past address `p` are
  * nullified and zero otherwise. */
-static int zeroed_out(const void *p, size_t size) {
-  size_t lim = size/ZERO_BLOCK_SIZE,
-         rem = size%ZERO_BLOCK_SIZE;
-  unsigned char *pc = (unsigned char *)p;
-
-  size_t i;
-  for (i = 0; i < lim; i++) {
-    if (memcmp(pc, &zeroblock, ZERO_BLOCK_SIZE))
-      return 0;
-    pc += ZERO_BLOCK_SIZE;
-  }
-  return !memcmp(pc, &zeroblock, rem);
-}
+int zeroed_out(const void *p, size_t size);
 
 /** \brief Count the number of occurrences of char `c` in a string `s` */
-static int charcount(const char *s, char c) {
-  int count = 0;
-  while ((s = strchr(s,c)) != NULL) {
-    count++;
-    s++;
-  }
-  return count;
-}
-#endif
+int charcount(const char *s, char c);
+
+#endif // E_ACSL_RTL_STRING_H
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_shexec.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_shexec.c
similarity index 86%
rename from src/plugins/e-acsl/share/e-acsl/e_acsl_shexec.h
rename to src/plugins/e-acsl/share/e-acsl/internals/e_acsl_shexec.c
index b2a297d5a98af286f9a8414bace165d556de2d9e..e13e8dfdaa1972564d400fdb2d673294841a18cf 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_shexec.h
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_shexec.c
@@ -21,44 +21,20 @@
 /**************************************************************************/
 
 /*! ***********************************************************************
- * \file  e_acsl_shexec.h
- * \brief Interface for running shell commands
+ * \file
+ * \brief Implementation for running shell commands
 ***************************************************************************/
 
-#ifndef E_ACSL_SHEXEC_H
-#define E_ACSL_SHEXEC_H
-
+#include <errno.h>
 #include <stddef.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <unistd.h>
-#include <errno.h>
-#include "e_acsl_string.h"
-
-/*! \class ipr_t
- *  \brief Result struct for `shexec` function -- execute a command in the
- *  shell via fork/exec and return results */
-typedef struct {
-  /** \brief resulting STDERR stream as \p const \p char* */
-  char *stderrs;
-  /** \brief Supplied STDIN stream as \p const \p char* */
-  char *stdins;
-  /** \brief resulting STDOUT stream as \p const \p char* */
-  char *stdouts;
-  /** \brief Exit status of a program */
-  int   exit_status;
-  /** \brief ID of a child process this command has been executed in */
-  pid_t pid;
-  /** \brief Set to non-zero if child process is interrupted via a signal */
-  int   signaled;
-  /** \brief If \p signalled is set, \p signo is set to the number of signal
-   * that interrupted execution of a child process */
-  int   signo;
-  /** \brief A command to execute. Needs to be NULL terminated  */
-  char  **argv; /** \brief ARGV */
-  /** \brief Message if the command has failed to run  */
-  char *error;
-} ipr_t;
+
+#include "e_acsl_malloc.h"
+#include "e_acsl_rtl_string.h"
+
+#include "e_acsl_shexec.h"
 
 /* \brief Read characters from a buffer associated with a file descriptor into
  * a C string
@@ -211,7 +187,7 @@ static void free_ipr (ipr_t* ipr) {
  * \return - heap-allocated struct `ipr_t` which describes the output of the
  *  executed command. Deallocation of this struct must be performed via the
  *  `free_ipr` function. */
-static ipr_t* shexec (char **data, const char *sin) {
+ipr_t* shexec (char **data, const char *sin) {
   /* Allocate and initialise the `ipr_t` struct to store the results
    * of the command execution */
   ipr_t  *ipr = (ipr_t*)private_malloc(sizeof(ipr_t));
@@ -225,4 +201,3 @@ static ipr_t* shexec (char **data, const char *sin) {
   /* Run the command returning a pointer to `ipr_t` */
   return __shexec(ipr);
 }
-#endif
diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_shexec.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_shexec.h
new file mode 100644
index 0000000000000000000000000000000000000000..16cb2d9a1d3a0161bc39ca0159d03962d07a8a00
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_shexec.h
@@ -0,0 +1,71 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+/*! ***********************************************************************
+ * \file
+ * \brief Interface for running shell commands
+***************************************************************************/
+
+#ifndef E_ACSL_SHEXEC_H
+#define E_ACSL_SHEXEC_H
+
+#include <sys/types.h>
+
+/*! \class ipr_t
+ *  \brief Result struct for `shexec` function -- execute a command in the
+ *  shell via fork/exec and return results */
+typedef struct {
+  /** \brief resulting STDERR stream as \p const \p char* */
+  char *stderrs;
+  /** \brief Supplied STDIN stream as \p const \p char* */
+  char *stdins;
+  /** \brief resulting STDOUT stream as \p const \p char* */
+  char *stdouts;
+  /** \brief Exit status of a program */
+  int   exit_status;
+  /** \brief ID of a child process this command has been executed in */
+  pid_t pid;
+  /** \brief Set to non-zero if child process is interrupted via a signal */
+  int   signaled;
+  /** \brief If \p signalled is set, \p signo is set to the number of signal
+   * that interrupted execution of a child process */
+  int   signo;
+  /** \brief A command to execute. Needs to be NULL terminated  */
+  char  **argv; /** \brief ARGV */
+  /** \brief Message if the command has failed to run  */
+  char *error;
+} ipr_t;
+
+/* \brief Execute a command given via parameter `data` in the current shell
+ *  and return the dynamically allocated struct `ipr_t` which captures the
+ *  results of the command's execution.
+ *
+ * \param data - command to execute. `data` is expected to be a NULL-terminated
+ *  array of C strings.
+ * \param sin - if not NULL, a C string given via `sin` is supplied as standard
+ *  input to the executed command.
+ * \return - heap-allocated struct `ipr_t` which describes the output of the
+ *  executed command. Deallocation of this struct must be performed via the
+ *  `free_ipr` function. */
+ipr_t* shexec (char **data, const char *sin);
+
+#endif // E_ACSL_SHEXEC_H
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_trace.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_trace.c
similarity index 91%
rename from src/plugins/e-acsl/share/e-acsl/e_acsl_trace.h
rename to src/plugins/e-acsl/share/e-acsl/internals/e_acsl_trace.c
index e74e612a604316c7e7332dbf3ea774893b184ec0..892f53f5c204ed69fda30a7f89bd4452384825b3 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_trace.h
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_trace.c
@@ -20,19 +20,21 @@
 /*                                                                        */
 /**************************************************************************/
 
-/*! ***********************************************************************
- * \file  e_acsl_trace.h
- * \brief Interface for producing backtrace. Requires GLIBC.
-***************************************************************************/
+/* Get default definitions and macros e.g., PATH_MAX */
+// #ifndef _DEFAULT_SOURCE
+// # define _DEFAULT_SOURCE 1
+// #endif
 
-#ifndef E_ACSL_TRACE_H
-#define E_ACSL_TRACE_H
-
-#include <stddef.h>
 #include <limits.h>
-#include "e_acsl_printf.h"
+#include <stddef.h>
+
+#include "e_acsl_malloc.h"
+#include "e_acsl_rtl_io.h"
+#include "e_acsl_rtl_string.h"
 #include "e_acsl_shexec.h"
 
+#include "e_acsl_trace.h"
+
 extern void  *__libc_stack_end;
 
 struct frame_layout {
@@ -68,7 +70,7 @@ static int native_backtrace (void **array, int size) {
   return cnt;
 }
 
-static void trace() {
+void trace() {
 # ifdef __linux__
 
   int size = 24;
@@ -107,4 +109,3 @@ static void trace() {
   STDOUT("/***************************************/\n");
 # endif /* __linux__ */
 }
-#endif
diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_trace.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_trace.h
new file mode 100644
index 0000000000000000000000000000000000000000..415efece25cef6565e1b42b56785fc06448ec87a
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_trace.h
@@ -0,0 +1,34 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+/*! ***********************************************************************
+ * \file
+ * \brief Interface for producing backtrace. Requires GLIBC.
+***************************************************************************/
+
+#ifndef E_ACSL_TRACE_H
+#define E_ACSL_TRACE_H
+
+/*! Print the backtrace to stdout */
+void trace();
+
+#endif // E_ACSL_TRACE_H
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_format.h b/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_stdio.c
similarity index 86%
rename from src/plugins/e-acsl/share/e-acsl/e_acsl_format.h
rename to src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_stdio.c
index 01235311270ac06ff17ded017f986a44ae0da1ff..d2df8a78b73a465082875b9533c81177a3e0224f 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_format.h
+++ b/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_stdio.c
@@ -20,72 +20,20 @@
 /*                                                                        */
 /**************************************************************************/
 
-/*! ***********************************************************************
- * \file  e_acsl_format.h
- * \brief Validating format strings with respect to arguments and their types
- *
- * Detection of format string vulnerabilities and other violations
- * related to improper use of formats in printf-like functions are addressed
- * as follows. Each call to a format function `f` (e.g. printf)
- * is replaced by a call to an analysis function `f'`. The signature of `f'` is
- * similar to that of `f'` except it has an additional argument. This argument
- * is a literal string where each character describes the type of a variadic
- * argument in the original call to `f`.
- *
- * For instance:
- *  `printf("Str=%s, Int=%d ", str, num);`
- * is replaced by
- *  `__e_acsl_builtin_printf("sd", "Str=%s, Int=%d", str, num);`
- * Note the first argument "sd". It indicates that `printf` was invoked
- * with two variadic arguments of types `char*` (specified via 's')
- * and `int` (`d`). Such single-character types are further called
- * |abbreviated| types. See ::abbr2str function for details.
- *
- * Execution of __e_acsl_builtin_printf checks that
- *  - format string is a NUL-terminated C string
- *  - all directives in the format string are well-formed (as per C99 standard)
- *  - each formatting directive has a corresponding variadic argument.
- *    Excessive arguments (for which there are no directives) are allowed
- *    but otherwise ignored.
- *  - the types of variadic arguments provided via a call match the types
- *    expected by the respective format directives. This check includes checking
- *    for signedness. For instance,
- *      __e_acsl_builtin_printf("d", "%u", n);
- *    will abort because the formatting directive expects its argument to be an
- *    unsigned integer, whereas `n` is a signed integer (indicated by "d") in
- *    the first argument to `__e_acsl_builtin_printf`. Bear in mind though that
- *    char, short, and float types are the subjects to default promotions. That
- *    is, `char` and `short` are promoted to `int` and `float` is promoted to
- *    double. Frama-C enforces such promotions by adding explicit casts.
- *  - variadic arguments corresponding to `%s` conversion specifiers describe
- *    valid C strings (NUL-terminated arrays of characters belonging to program
- *    allocation)
- *  - variadic arguments corresponding to `%n` conversion specifiers describe
- *    valid integer pointers
- * Execution of __e_acsl_builtin_dprintf additionally checks that
- *  - the file descriptor designated for writing is open
- * Execution of __e_acsl_builtin_fprintf additionally checks that
- *  - the stream designated for writing is valid
- * Execution of __e_acsl_builtin_sprintf and  __e_acsl_builtin_sprintf
- * additionally check that
- *  - memory buffers designated for writing are allocated, writable and provide
- *    sufficient space for storing the results
-***************************************************************************/
-
-#ifndef E_ACSL_FORMAT_H
-#define E_ACSL_FORMAT_H
-
-#ifndef E_ACSL_VALIDATE_FORMAT_STRINGS
-# define E_ACSL_FORMAT_VALIDITY_DESC "disabled"
-#else
-# define E_ACSL_FORMAT_VALIDITY_DESC "enabled"
-
-#include <stdlib.h>
-#include <features.h>
+#ifdef E_ACSL_VALIDATE_FORMAT_STRINGS
+
+#include <fcntl.h>
+#include <limits.h>
 #include <stdint.h>
-#include <stdio.h>
 #include <wctype.h>
-#include <fcntl.h>
+
+#include "../internals/e_acsl_malloc.h"
+#include "../internals/e_acsl_private_assert.h"
+#include "../internals/e_acsl_rtl_io.h"
+#include "../internals/e_acsl_rtl_string.h"
+#include "e_acsl_string.h"
+
+#include "e_acsl_stdio.h"
 
 #define FMT_ERROR "Format error: "
 #define INT_ERROR "Internal error: "
@@ -179,7 +127,7 @@ static abbrev_t size2abbri(int size, int sign) {
     return sign ? ILong : IULong;
   else if (size == sizeof(long long int))
     return sign ? ILongLong : IULongLong;
-  vabort(INT_ERROR "integral type corresponding to size %d unknown\n", size);
+  private_abort(INT_ERROR "integral type corresponding to size %d unknown\n", size);
   return '\0';
 }
 
@@ -207,7 +155,7 @@ static char abbr2ptr(char c) {
     case ILongLong: return PLongLong;
     case IULongLong: return PULongLong;
     default:
-      vabort(INT_ERROR "Unexpected abbreviated type %c\n", c);
+      private_abort(INT_ERROR "Unexpected abbreviated type %c\n", c);
   }
   return '\0';
 }
@@ -355,7 +303,7 @@ static char *fetch_format_argno(char *fmt, format_directive *dir,
 
   /* make sure that numbered and non-numbered directives are not mixed */
   if (prev && prev->arg.expl != dir->arg.expl)
-    vabort(FMT_ERROR
+    private_abort(FMT_ERROR
       "\"%s\":  numbered and non-numbered directives cannot be mixed\n",
       dir->format);
 
@@ -370,7 +318,7 @@ static char *fetch_format_flags(char *fmt, format_directive *dir) {
   if (!dir->flags._f) \
     { dir->flags._f = 1; } \
   else  \
-    { vabort(FMT_ERROR "flag %s has already been set\n", #_f); }
+    { private_abort(FMT_ERROR "flag %s has already been set\n", #_f); }
 
   while (is_flag_char(*fmt)) {
     dir->flags.specified = 1;
@@ -413,7 +361,7 @@ static char *fetch_format_field_width(char *fmt, format_directive *dir) {
   } else { /* ... or a positive decimal integer */
     if (isdigit(*fmt)) {
       if (*fmt == '0') {
-        vabort(FMT_ERROR
+        private_abort(FMT_ERROR
           "field width in format cannot start with zero (%s)\n", dir->format);
       };
       while (isdigit(*fmt)) {
@@ -491,7 +439,7 @@ static char *fetch_format_length(char *fmt, format_directive *dir) {
 
   /* Make sure that the length modifier (if there is one) belongs
      to a right character class */
-  vassert(dir->length.mod == '\0' || is_length_char(dir->length.mod),
+  private_assert(dir->length.mod == '\0' || is_length_char(dir->length.mod),
     INT_ERROR "Bad length modifier: '%c'\n", dir->length.mod);
 
   if (dir->length.bytes) {
@@ -510,11 +458,11 @@ static char *fetch_format_length(char *fmt, format_directive *dir) {
   /* which has been fetched at the start matches the one we have arrived at */
   if (!is_specifier_char(dir->specifier)) {
     if (dir->specifier == '%')
-      vabort(FMT_ERROR "in directive '%s'."
+      private_abort(FMT_ERROR "in directive '%s'."
           "the complete conversion specification for '%%' is '%%%%'\n",
           dir->format);
     else
-      vabort(FMT_ERROR "illegal format specifier '%c'\n", dir->specifier);
+      private_abort(FMT_ERROR "illegal format specifier '%c'\n", dir->specifier);
   }
   return ++fmt;
 } /* }}} */
@@ -590,7 +538,7 @@ static void release_directives(const char *fmt, format_directive ** dirs) {
 /* Format string validation (well-formedness) {{{ */
 static inline void validate_application(format_directive *dir, char *allowed,
   char* kind, char *desc) {
-  vassert(strchr(allowed, dir->specifier) != NULL, FMT_ERROR
+  private_assert(strchr(allowed, dir->specifier) != NULL, FMT_ERROR
     "wrong application of %s [%s] to format specifier [%c]\n",
     desc, kind, dir->specifier);
 }
@@ -619,7 +567,7 @@ static void validate_applications(format_directive *dir) {
 
   /* No flags should be used if 'n' specifier is given */
   if (dir->flags.specified && dir->specifier == 'n')
-    vabort(FMT_ERROR "one of more flags with [n] specifier\n", NULL);
+    private_abort(FMT_ERROR "one of more flags with [n] specifier\n", NULL);
 
   /* ==== Precision ==== */
   desc = "precision";
@@ -637,7 +585,7 @@ static void validate_applications(format_directive *dir) {
   desc = "field width";
 
   if (dir->specifier == 'n' && dir->field_width != INT_MIN)
-    vabort(FMT_ERROR "field width used with [n] specifier\n", NULL);
+    private_abort(FMT_ERROR "field width used with [n] specifier\n", NULL);
 
   /* ==== Length modifiers ==== */
   desc = "length modifier";
@@ -646,7 +594,7 @@ static void validate_applications(format_directive *dir) {
      conversion specifiers. 'L' applies to a, A, e, E, f, F, g, or G. */
   if (dir->length.mod != '\0') {
     /* Make sure the length specifier is one of the allowed ones */
-    vassert(is_length_char(dir->length.mod),
+    private_assert(is_length_char(dir->length.mod),
       FMT_ERROR "bad length specifier [%c]\n", dir->length.mod);
 
     /* Conver length modifier to a string */
@@ -675,7 +623,7 @@ static void validate_applications(format_directive *dir) {
         validate_application(dir, "aAeEfFgG", lm_kind, desc);
         break;
       default:
-        vabort(INT_ERROR "unexpected length modifier %c\n", lm_kind);
+        private_abort(INT_ERROR "unexpected length modifier %c\n", lm_kind);
     }
   }
 }
@@ -704,7 +652,7 @@ static abbrev_t infer_integral_abbr(format_directive *dir, int sgn) {
     case '\0':
       return (sgn ? IInt : IUInt);
   }
-  vabort(INT_ERROR "unexpected length modifier: '%c'\n", dir->length.mod);
+  private_abort(INT_ERROR "unexpected length modifier: '%c'\n", dir->length.mod);
   return '\0';
 }
 
@@ -728,7 +676,7 @@ static abbrev_t infer_n_abbr(format_directive *dir) {
     case '\0':
       return PInt;
     default:
-      vabort(INT_ERROR "unexpected length modifier '%c'\n", dir->length.mod);
+      private_abort(INT_ERROR "unexpected length modifier '%c'\n", dir->length.mod);
   }
   return '\0';
 }
@@ -746,7 +694,7 @@ static void validate_format_type
 {
   abbrev_t actual_t = fmtdesc[dir->arg.index];
   if (actual_t != expected_t) {
-    vabort("%s: directive %d ('%s') expects argument of type '%s'"
+    private_abort("%s: directive %d ('%s') expects argument of type '%s'"
       " but the corresponding argument has type '%s'\n",
       func, dir->arg.index + 1, dir->directive,
       abbr2str(expected_t), abbr2str(actual_t));
@@ -769,19 +717,19 @@ static long validate_format_string_argument
     (wide) ? valid_nwstring((wchar_t*)s, limit, 0) : valid_nstring(s, limit, 0);
   switch(size) {
     case -1:
-      vabort
+      private_abort
         ("%s: attempt to access unallocated memory via directive %d ('%s')\n",
         func, dir->arg.index + 1, dir->directive);
     case -2:
-      vabort(INT_ERROR
+      private_abort(INT_ERROR
         "%s: writeable check unexpectedly failed in directive %d ('%s')\n",
         func, dir->arg.index + 1, dir->directive);
     case -3:
-      vabort("%s: attempt to access partially unallocated memory "
+      private_abort("%s: attempt to access partially unallocated memory "
         "via directive %d ('%s')\n",
         func, dir->arg.index + 1, dir->directive);
     case -4:
-      vabort("%s: unterminated string in directive %d ('%s')\n",
+      private_abort("%s: unterminated string in directive %d ('%s')\n",
         func, dir->arg.index + 1, dir->directive);
   }
   return size;
@@ -793,7 +741,7 @@ static void validate_overlapping_buffer(char *buffer, size_t buf_sz, void *arg,
     size_t arg_sz, const char *func, format_directive *dir) {
   if (buffer) {
     if (!disjoint_spaces((uintptr_t)buffer, buf_sz, (uintptr_t)arg, arg_sz))
-      vabort("%s: output buffer overlaps with argument %d (%s)\n",
+      private_abort("%s: output buffer overlaps with argument %d (%s)\n",
           func, dir->arg.index + 1, dir->directive);
   }
 }
@@ -817,7 +765,7 @@ static void validate_format
 
   /* Check that format string is valid first */
   if (valid_string((char*)fmt, 0) < 0)
-    vabort("%s: invalid format string (unallocated or unterminated)\n", func);
+    private_abort("%s: invalid format string (unallocated or unterminated)\n", func);
 
   /* Parse format string and generate format directives */
   format_directive ** dirs = get_format_directives((char*)fmt);
@@ -841,7 +789,7 @@ static void validate_format
        format directive in the format string there should be a corresponding
        argument except for literal directive `%%` */
     if (argno >= arglen)
-      vabort("%s: directive %d (%s) in format \"%s\" has no argument\n",
+      private_abort("%s: directive %d (%s) in format \"%s\" has no argument\n",
         func, dir->arg.index + 1, dir->directive, dir->format);
 
 /* Shortcut for `validate_format_type` function */
@@ -906,7 +854,7 @@ static void validate_format
       case 'p':
         validate_type(PVoid);
         if (!allocated(addr, 1, addr))
-          vabort("%s: argument %d of directive %s not allocated\n", func,
+          private_abort("%s: argument %d of directive %s not allocated\n", func,
             argno + 1, dir->directive);
         validate_overlapping_buffer
           (buffer, buf_size, (void*)addr, 1, func, dir);
@@ -919,14 +867,14 @@ static void validate_format
            sure that the provided pointer corresponds to writeable memory. */
         int size = dir->length.bytes == 0 ?  sizeof(int) : dir->length.bytes;
         if (!writeable(addr, size, addr))
-          vabort("%s: argument %d of directive %s not allocated or writeable\n",
+          private_abort("%s: argument %d of directive %s not allocated or writeable\n",
             func, argno, dir->directive);
         validate_overlapping_buffer
           (buffer, buf_size, (void*)addr, size, func, dir);
         break;
       }
       default:
-        vabort(INT_ERROR "Unexpected format specifier '%c'\n", dir->specifier);
+        private_abort(INT_ERROR "Unexpected format specifier '%c'\n", dir->specifier);
     }
     dirs++;
 #undef validate_type
@@ -949,18 +897,18 @@ int builtin_fprintf(const char *fmtdesc, FILE *stream, const char *fmt, ...) {
   va_start(ap, fmt);
   /* First check that stream belongs to allocated space */
   if (!allocated((uintptr_t)stream, 1, (uintptr_t)stream))
-    vabort("fprintf: attempt to write to an invalid stream\n", NULL);
+    private_abort("fprintf: attempt to write to an invalid stream\n", NULL);
   /* Check if stream is a valid stream and that is open */
   int fd = fileno(stream);
   if (fd == -1)
-    vabort("fprintf: attempt to write to an invalid stream\n", NULL);
+    private_abort("fprintf: attempt to write to an invalid stream\n", NULL);
   /* Since we have a file descriptor check if it is open.
      This may not be really necessary since `fileno` should be able to tell us
      that. Does not hurt though. That's a fast check.
      It should be noted that `fileno` is a POSIX function and not in the C99
      standard. */
   if (fcntl(fd, F_GETFD) == -1)
-    vabort("fprintf: attempt to write to a closed stream\n", NULL);
+    private_abort("fprintf: attempt to write to a closed stream\n", NULL);
 
   validate_format(fmtdesc, fmt, ap, "fprintf", NULL, 0);
   va_start(ap, fmt);
@@ -972,7 +920,7 @@ int builtin_dprintf(const char *fmtdesc, int fd, const char *fmt, ...) {
   va_start(ap, fmt);
   /* Make sure that the designated file descriptor is open */
   if (fcntl(fd, F_GETFD) == -1)
-    vabort("dprintf: attempt to write to a closed file descriptor %d\n", fd);
+    private_abort("dprintf: attempt to write to a closed file descriptor %d\n", fd);
   validate_format(fmtdesc, fmt, ap, "dprintf", NULL, 0);
   va_start(ap, fmt);
   return vdprintf(fd, fmt, ap);
@@ -989,7 +937,7 @@ int builtin_sprintf(const char *fmtdesc, char *buffer, const char *fmt, ...) {
   va_start(ap, fmt);
   int len = vsnprintf(NULL, 0, fmt, ap);
   if (!writeable((uintptr_t)buffer, len + 1, (uintptr_t)buffer))
-    vabort("sprintf: output buffer is unallocated or has insufficient length "
+    private_abort("sprintf: output buffer is unallocated or has insufficient length "
       "to store %d characters or not writeable\n", len + 1);
   va_start(ap, fmt);
   validate_format(fmtdesc, fmt, ap, "sprintf", buffer, len + 1);
@@ -1005,7 +953,7 @@ int builtin_snprintf(const char *fmtdesc, char *buffer, size_t size,
   /* Check that the input buffer is large enough. However, if there are zero
      characters to write, it does not matter */
   if (size > 0 && !writeable((uintptr_t)buffer, size, (uintptr_t)buffer))
-    vabort("sprintf: output buffer is unallocated or has insufficient length "
+    private_abort("sprintf: output buffer is unallocated or has insufficient length "
       "to store %d characters and \\0 terminator or not writeable\n", size);
   va_start(ap, fmt);
   return vsnprintf(buffer, size, fmt, ap);
@@ -1020,5 +968,4 @@ int builtin_syslog(const char *fmtdesc, int priority, const char *fmt, ...) {
 }
 
 /* }}} */
-#endif /* E_ACSL_VALIDATE_FORMAT_STRINGS */
-#endif /* E_ACSL_FORMAT_H */
+#endif // E_ACSL_VALIDATE_FORMAT_STRINGS
diff --git a/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_stdio.h b/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_stdio.h
new file mode 100644
index 0000000000000000000000000000000000000000..00906c5fd2b6a68271c89a304d52b9d263ee8c0d
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_stdio.h
@@ -0,0 +1,121 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+/*! ***********************************************************************
+ * \file
+ * \brief Validating format strings with respect to arguments and their types
+ *
+ * Detection of format string vulnerabilities and other violations
+ * related to improper use of formats in printf-like functions are addressed
+ * as follows. Each call to a format function `f` (e.g. printf)
+ * is replaced by a call to an analysis function `f'`. The signature of `f'` is
+ * similar to that of `f'` except it has an additional argument. This argument
+ * is a literal string where each character describes the type of a variadic
+ * argument in the original call to `f`.
+ *
+ * For instance:
+ *  `printf("Str=%s, Int=%d ", str, num);`
+ * is replaced by
+ *  `__e_acsl_builtin_printf("sd", "Str=%s, Int=%d", str, num);`
+ * Note the first argument "sd". It indicates that `printf` was invoked
+ * with two variadic arguments of types `char*` (specified via 's')
+ * and `int` (`d`). Such single-character types are further called
+ * |abbreviated| types. See ::abbr2str function for details.
+ *
+ * Execution of __e_acsl_builtin_printf checks that
+ *  - format string is a NUL-terminated C string
+ *  - all directives in the format string are well-formed (as per C99 standard)
+ *  - each formatting directive has a corresponding variadic argument.
+ *    Excessive arguments (for which there are no directives) are allowed
+ *    but otherwise ignored.
+ *  - the types of variadic arguments provided via a call match the types
+ *    expected by the respective format directives. This check includes checking
+ *    for signedness. For instance,
+ *      __e_acsl_builtin_printf("d", "%u", n);
+ *    will abort because the formatting directive expects its argument to be an
+ *    unsigned integer, whereas `n` is a signed integer (indicated by "d") in
+ *    the first argument to `__e_acsl_builtin_printf`. Bear in mind though that
+ *    char, short, and float types are the subjects to default promotions. That
+ *    is, `char` and `short` are promoted to `int` and `float` is promoted to
+ *    double. Frama-C enforces such promotions by adding explicit casts.
+ *  - variadic arguments corresponding to `%s` conversion specifiers describe
+ *    valid C strings (NUL-terminated arrays of characters belonging to program
+ *    allocation)
+ *  - variadic arguments corresponding to `%n` conversion specifiers describe
+ *    valid integer pointers
+ * Execution of __e_acsl_builtin_dprintf additionally checks that
+ *  - the file descriptor designated for writing is open
+ * Execution of __e_acsl_builtin_fprintf additionally checks that
+ *  - the stream designated for writing is valid
+ * Execution of __e_acsl_builtin_sprintf and  __e_acsl_builtin_sprintf
+ * additionally check that
+ *  - memory buffers designated for writing are allocated, writable and provide
+ *    sufficient space for storing the results
+***************************************************************************/
+
+#ifndef E_ACSL_STDIO_H
+#define E_ACSL_STDIO_H
+
+#include <stddef.h>
+#include <stdio.h>
+
+#include "../internals/e_acsl_alias.h"
+
+/* No need to encapsulate via ifdef: using these extra definitions does
+   not hurt, otherwise need to pass additional parameters to frama-c */
+#define builtin_printf   export_alias(builtin_printf)
+#define builtin_fprintf  export_alias(builtin_fprintf)
+#define builtin_dprintf  export_alias(builtin_dprintf)
+#define builtin_sprintf  export_alias(builtin_sprintf)
+#define builtin_snprintf export_alias(builtin_snprintf)
+#define builtin_syslog   export_alias(builtin_syslog)
+
+/* Printf and friends {{{ */
+
+/** \brief `printf` with error checking. */
+int builtin_printf(const char *fmtdesc, const char *fmt, ...)
+  __attribute__((FC_BUILTIN));
+
+/** \brief `fprintf` with error checking. */
+int builtin_fprintf(const char *fmtdesc, FILE *stream, const char *fmt, ...)
+  __attribute__((FC_BUILTIN));
+
+/** \brief `dprintf` with error checking. */
+int builtin_dprintf(const char *fmtdesc, int fd, const char *fmt, ...)
+  __attribute__((FC_BUILTIN));
+
+/** \brief `sprintf` with error checking. */
+int builtin_sprintf(const char *fmtdesc, char *buffer, const char *fmt, ...)
+  __attribute__((FC_BUILTIN));
+
+/** \brief `snprintf` with error checking. */
+int builtin_snprintf(const char *fmtdesc, char *buffer, size_t size,
+    const char *fmt, ...)
+  __attribute__((FC_BUILTIN));
+
+/** \brief `syslog` with error checking. */
+int builtin_syslog(const char *fmtdesc, int priority, const char *fmt, ...)
+  __attribute__((FC_BUILTIN));
+
+/* }}} */
+
+#endif // E_ACSL_STDIO_H
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_libc_replacements.h b/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_string.c
similarity index 70%
rename from src/plugins/e-acsl/share/e-acsl/e_acsl_libc_replacements.h
rename to src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_string.c
index d48693d0c5fa66dc6b2288b97d65168f4454e697..05d54981e641aaae839afa3d429751e43cfed2c6 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_libc_replacements.h
+++ b/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_string.c
@@ -20,37 +20,15 @@
 /*                                                                        */
 /**************************************************************************/
 
-/*! ***********************************************************************
- * \file   e_acsl_libc_replacements.h
- * \brief  Drop-in replacements for C library functions
-***************************************************************************/
+#include "../internals/e_acsl_private_assert.h"
+#include "../internals/e_acsl_rtl_string.h"
+#include "../observation_model/e_acsl_observation_model.h"
 
-#ifndef E_ACSL_LIBC_REPLACEMENTS_H
-#define E_ACSL_LIBC_REPLACEMENTS_H
-
-/************************************************************************/
-/*** Support functionality {{{ ***/
-/************************************************************************/
+#include "e_acsl_string.h"
 
 /* *** String validation {{{ */
 
-/*! \brief Determine if `s` describes a C string up to length `n`.
-
-   @return the index of `\0` character (i.e., the length of the string)
-     if `s` is a valid pointer of byte-size `len`, and
-       - `n` is negative and there is `\0` between `s` and the end of
-       the block `s` points to.
-       - `n` is positive and there is `\0` at index `i` (`i` < `n`)
-       and `s+i` belongs to the same block as `s`.
-    @return `n` if there is no `\0` between `s` and `s+n-1` but both
-       `s` and `s+n-1` belong to the same block.
-
-   @return -1 if `s` does not belong to tracked allocation
-   @return -2 if `wrtbl` is set to a non-zero value and `s` is read-only
-   @return -3 if there is no `\0` between `s` and the end of its block and
-    `s+n-1` is unallocated or belongs to a different block.
-   @return -4 if `n` is negative and `s` is not NUL-terminated */
-static long valid_nstring(char *s, long n, int wrtbl) {
+long valid_nstring(char *s, long n, int wrtbl) {
   if (n == 0)
     return n;
 
@@ -73,12 +51,7 @@ static long valid_nstring(char *s, long n, int wrtbl) {
   return -1 /* Not allocated */;
 }
 
-/*!\brief Same as ::valid_nstring but for wide characters.
-
-   This function is very similar to ::valid_nstring. It is possible make it
-   more concise (say define it as a macro with types provided explicitly) yet
-   it is left this way for readibility reasons. */
-static long valid_nwstring(wchar_t *s, long n, int wrtbl) {
+long valid_nwstring(wchar_t *s, long n, int wrtbl) {
   if (n == 0)
     return n;
 
@@ -101,16 +74,6 @@ static long valid_nwstring(wchar_t *s, long n, int wrtbl) {
   return -1 /* Not allocated */;
 }
 
-/*! \brief Same as ::valid_nstring but check a NUL-terminated string */
-static long inline valid_string(char *s, int wrtbl) {
-  return valid_nstring(s, -1, wrtbl);
-}
-
-/*! \brief same as ::valid_string but for wide characters */
-static long inline valid_wstring(wchar_t *s, int wrtbl) {
-  return valid_nwstring(s, -1, wrtbl);
-}
-
 static long validate_string
   (char *s, long n, int wrtbl, const char *fun, const char *desc)
 {
@@ -118,16 +81,16 @@ static long validate_string
 
   switch(size) {
     case -1:
-      vabort("%s: %sstring unallocated\n", fun, desc);
+      private_abort("%s: %sstring unallocated\n", fun, desc);
     case -2:
-      vabort("%s: %sstring is not writable\n", fun, desc);
+      private_abort("%s: %sstring is not writable\n", fun, desc);
     case -3:
-      vabort("%s: %sstring has insufficient length\n", fun, desc);
+      private_abort("%s: %sstring has insufficient length\n", fun, desc);
     case -4:
-      vabort("%s: %sstring not NUL-terminated\n", fun, desc);
+      private_abort("%s: %sstring not NUL-terminated\n", fun, desc);
   }
   /* at this point negative return values should have been handled */
-  vassert(size >= 0, "unexpected return value of %d\n", size);
+  private_assert(size >= 0, "unexpected return value of %d\n", size);
   return size;
 }
 
@@ -145,10 +108,7 @@ static inline long validate_allocated_string
 /* }}} */
 
 /* *** Memory spaces {{{ */
-/** \brief Return a true value if memory spaces given by intervals
-    [s1, s1 + s1_sz] and [s2, s2 + s2_sz] are disjoint */
-static inline int disjoint_spaces
-  (uintptr_t s1, size_t s1_sz, uintptr_t s2, size_t s2_sz)
+int disjoint_spaces(uintptr_t s1, size_t s1_sz, uintptr_t s2, size_t s2_sz)
 {
   return s1 + s1_sz <= s2 || s2 + s2_sz <= s1;
 }
@@ -157,7 +117,7 @@ static inline void validate_allocated_space
   (void *p, size_t sz, const char *func, const char *space)
 {
   if (!allocated((uintptr_t)p, sz, (uintptr_t)p)) {
-    vabort("%s: unallocated (or insufficient) space in %s\n", func, space);
+    private_abort("%s: unallocated (or insufficient) space in %s\n", func, space);
   }
 }
 
@@ -165,10 +125,10 @@ static inline void validate_writeable_space(void *p, size_t sz,
     const char *func, const char *space) {
   if (!writeable((uintptr_t)p, sz, (uintptr_t)p)) {
     if (writeable((uintptr_t)p, 1, (uintptr_t)p)) {
-      vabort("%s: insufficient space in %s, "
+      private_abort("%s: insufficient space in %s, "
           "at least %lu bytes required\n", func, space, sz);
     } else {
-      vabort("%s: %s space unallocated or cannot be written\n", func, space);
+      private_abort("%s: %s space unallocated or cannot be written\n", func, space);
     }
   }
 }
@@ -177,7 +137,7 @@ static inline void validate_overlapping_spaces
   (uintptr_t s1, size_t s1_sz, uintptr_t s2, size_t s2_sz, const char *func)
 {
   if (!disjoint_spaces(s1, s1_sz, s2, s2_sz))
-    vabort("%s: overlapping memory areas\n", func);
+    private_abort("%s: overlapping memory areas\n", func);
 }
 /* }}} */
 /* }}} */
@@ -186,12 +146,10 @@ static inline void validate_overlapping_spaces
 /*** strlen/strcpy/strcat/strcmp {{{ ***/
 /************************************************************************/
 
-/* drop-in replacement for `strlen` */
 size_t builtin_strlen(const char *s) {
   return validate_allocated_string((char*)s, -1, "strlen", "input ");
 }
 
-/* drop-in replacement for `strcpy` */
 char *builtin_strcpy(char *dest, const char *src) {
   // `src` string should be a valid NUL-terminated C string
   size_t size =
@@ -205,7 +163,6 @@ char *builtin_strcpy(char *dest, const char *src) {
   return strcpy(dest, src);
 }
 
-/* drop-in replacement for `strncpy` */
 char *builtin_strncpy(char *dest, const char *src, size_t n) {
   /* `src` should be a valid string up to `nth` character */
   validate_allocated_string((char*)src, n, "strncpy", "source string ");
@@ -216,7 +173,6 @@ char *builtin_strncpy(char *dest, const char *src, size_t n) {
   return strncpy(dest, src, n);
 }
 
-/* drop-in replacement for `strcmp` */
 int builtin_strcmp(const char *s1, const char *s2) {
   /* both strings should be valid NUL-terminated strings */
   validate_allocated_string((char*)s1, -1, "strcmp", "string 1 ");
@@ -224,7 +180,6 @@ int builtin_strcmp(const char *s1, const char *s2) {
   return strcmp(s1, s2);
 }
 
-/* drop-in replacement for `strcmp` */
 int builtin_strncmp(const char *s1, const char *s2, size_t n) {
   /* both strings should be valid up to nth character */
   validate_allocated_string((char*)s1, n, "strncmp", "string 1 ");
@@ -232,7 +187,6 @@ int builtin_strncmp(const char *s1, const char *s2, size_t n) {
   return strncmp(s1, s2, n);
 }
 
-/* drop-in replacement for `strcat` */
 char *builtin_strcat(char *dest, const char *src) {
   long src_sz =
     validate_allocated_string((char*)src, -1, "strcat", "source string ");
@@ -240,7 +194,7 @@ char *builtin_strcat(char *dest, const char *src) {
     validate_writeable_string((char*)dest, -1, "strcat", "destination string ");
   size_t avail_sz = block_length(dest) - offset(dest);
   if (!(avail_sz >= src_sz + dest_sz + 1)) {
-    vabort("strcat: insufficient space in destination string, "
+    private_abort("strcat: insufficient space in destination string, "
       "available: %lu bytes, requires at least %lu bytes\n",
       avail_sz, src_sz + dest_sz + 1);
   }
@@ -249,14 +203,13 @@ char *builtin_strcat(char *dest, const char *src) {
   return strcat(dest, src);
 }
 
-/* drop-in replacement for `strncat` */
 char *builtin_strncat(char *dest, const char *src, size_t n) {
   validate_allocated_string((char*)src, n, "strncat", "source string ");
   long dest_sz =
     validate_writeable_string((char*)dest, -1, "strcat", "destination string ");
   size_t avail_sz = block_length(dest) - offset(dest);
   if (!(avail_sz >= n + dest_sz + 1)) {
-    vabort("strncat: insufficient space in destination string, "
+    private_abort("strncat: insufficient space in destination string, "
       "available: %lu bytes, requires at least %lu bytes\n",
       avail_sz, n + dest_sz + 1);
   }
@@ -270,7 +223,6 @@ char *builtin_strncat(char *dest, const char *src, size_t n) {
 /*** memcpy/memcmp/memset/memmove {{{ ***/
 /************************************************************************/
 
-/* drop-in replacement for `memcpy` */
 void *builtin_memcpy(void *dest, const void *src, size_t n) {
   validate_allocated_space((void*)src, n, "memcpy", "source space ");
   validate_writeable_space((void*)dest, n, "memcpy", "destination space ");
@@ -278,13 +230,11 @@ void *builtin_memcpy(void *dest, const void *src, size_t n) {
   return memcpy(dest, src, n);
 }
 
-/* drop-in replacement for `memset` */
 void *builtin_memset(void *s, int c, size_t n) {
   validate_writeable_space((void*)s, n, "memset", "space ");
   return memset(s, c, n);
 }
 
-/* drop-in replacement for `memcmp` */
 int builtin_memcmp(const void *s1, const void *s2, size_t n) {
   validate_allocated_space((void*)s1, n, "memcmp", "space 1 ");
   validate_allocated_space((void*)s2, n, "memcmp", "space 1 ");
@@ -292,7 +242,6 @@ int builtin_memcmp(const void *s1, const void *s2, size_t n) {
   return memcmp(s1, s2, n);
 }
 
-/* drop-in replacement for `memmove` */
 void *builtin_memmove(void *dest, const void *src, size_t n) {
   validate_allocated_space((void*)src, n, "memcmp", "source space ");
   validate_writeable_space((void*)dest, n, "memcmp", "destination space ");
@@ -300,4 +249,4 @@ void *builtin_memmove(void *dest, const void *src, size_t n) {
 }
 
 /* }}} */
-#endif
+
diff --git a/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_string.h b/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_string.h
new file mode 100644
index 0000000000000000000000000000000000000000..e1bb8fdb9a177dde5add7dbfa90f9f5aef661243
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_string.h
@@ -0,0 +1,178 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+/*! ***********************************************************************
+ * \file
+ * \brief  Drop-in replacements for C library functions from string.h
+***************************************************************************/
+
+#ifndef E_ACSL_STRING_H
+#define E_ACSL_STRING_H
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "../internals/e_acsl_alias.h"
+
+#define builtin_strlen   export_alias(builtin_strlen)
+#define builtin_strcpy   export_alias(builtin_strcpy)
+#define builtin_strncpy  export_alias(builtin_strncpy)
+#define builtin_strcat   export_alias(builtin_strcat)
+#define builtin_strncat  export_alias(builtin_strncat)
+#define builtin_strncat  export_alias(builtin_strncat)
+#define builtin_strcmp   export_alias(builtin_strcmp)
+#define builtin_strncmp  export_alias(builtin_strncmp)
+#define builtin_memcpy   export_alias(builtin_memcpy)
+#define builtin_memset   export_alias(builtin_memset)
+#define builtin_memcmp   export_alias(builtin_memcmp)
+#define builtin_memmove  export_alias(builtin_memmove)
+
+/************************************************************************/
+/*** Support functionality {{{ ***/
+/************************************************************************/
+
+/* *** String validation {{{ */
+
+/*! \brief Determine if `s` describes a C string up to length `n`.
+
+   @return the index of `\0` character (i.e., the length of the string)
+     if `s` is a valid pointer of byte-size `len`, and
+       - `n` is negative and there is `\0` between `s` and the end of
+       the block `s` points to.
+       - `n` is positive and there is `\0` at index `i` (`i` < `n`)
+       and `s+i` belongs to the same block as `s`.
+    @return `n` if there is no `\0` between `s` and `s+n-1` but both
+       `s` and `s+n-1` belong to the same block.
+
+   @return -1 if `s` does not belong to tracked allocation
+   @return -2 if `wrtbl` is set to a non-zero value and `s` is read-only
+   @return -3 if there is no `\0` between `s` and the end of its block and
+    `s+n-1` is unallocated or belongs to a different block.
+   @return -4 if `n` is negative and `s` is not NUL-terminated */
+long valid_nstring(char *s, long n, int wrtbl);
+
+/*!\brief Same as ::valid_nstring but for wide characters.
+
+   This function is very similar to ::valid_nstring. It is possible make it
+   more concise (say define it as a macro with types provided explicitly) yet
+   it is left this way for readibility reasons. */
+long valid_nwstring(wchar_t *s, long n, int wrtbl);
+
+/*! \brief Same as ::valid_nstring but check a NUL-terminated string */
+long inline valid_string(char *s, int wrtbl) {
+  return valid_nstring(s, -1, wrtbl);
+}
+
+/*! \brief same as ::valid_string but for wide characters */
+long inline valid_wstring(wchar_t *s, int wrtbl) {
+  return valid_nwstring(s, -1, wrtbl);
+}
+/* }}} */
+
+/* *** Memory spaces {{{ */
+/** \brief Return a true value if memory spaces given by intervals
+    [s1, s1 + s1_sz] and [s2, s2 + s2_sz] are disjoint */
+int disjoint_spaces(uintptr_t s1, size_t s1_sz, uintptr_t s2, size_t s2_sz);
+/* }}} */
+/* }}} */
+
+/************************************************************************/
+/*** strlen/strcpy/strcat/strcmp {{{ ***/
+/************************************************************************/
+
+/* drop-in replacement for `strlen` */
+/*@ assigns \result \from s[0..]; */
+size_t builtin_strlen(const char *s)
+  __attribute__((FC_BUILTIN));
+
+/* drop-in replacement for `strcpy` */
+/*@ assigns dest[0..] \from src[0..];
+  @ assigns \result \from dest;
+  @ ensures \result == dest; */
+char *builtin_strcpy(char *dest, const char *src)
+  __attribute__((FC_BUILTIN));
+
+/* drop-in replacement for `strncpy` */
+/*@ assigns dest[0..n - 1] \from src[0..n-1];
+  @ assigns \result \from dest;
+  @ ensures \result == dest; */
+char *builtin_strncpy(char *dest, const char *src, size_t n)
+  __attribute__((FC_BUILTIN));
+
+/* drop-in replacement for `strcmp` */
+/*@ assigns \result \from s1[0..], s2[0..]; */
+int builtin_strcmp(const char *s1, const char *s2)
+  __attribute__((FC_BUILTIN));
+
+/* drop-in replacement for `strncmp` */
+/*@ assigns \result \from s1[0..n-1], s2[0..n-1]; */
+int builtin_strncmp(const char *s1, const char *s2, size_t n)
+  __attribute__((FC_BUILTIN));
+
+/* drop-in replacement for `strcat` */
+/*@ assigns dest[..] \from src[0..];
+  @ assigns \result \from dest;
+  @ ensures \result == dest; */
+char *builtin_strcat(char *dest, const char *src)
+  __attribute__((FC_BUILTIN));
+
+/* drop-in replacement for `strncat` */
+/*@ assigns dest[..] \from src[0..n];
+  @ assigns \result \from dest;
+  @ ensures \result == dest; */
+char *builtin_strncat(char *dest, const char *src, size_t n)
+  __attribute__((FC_BUILTIN));
+/* }}} */
+
+/************************************************************************/
+/*** memcpy/memcmp/memset/memmove {{{ ***/
+/************************************************************************/
+
+/* drop-in replacement for `memcpy` */
+/*@ assigns ((char*)dest)[0..n-1] \from ((char*)src)[0..n-1];
+  @ assigns \result \from dest;
+  @ ensures \result == dest; */
+void *builtin_memcpy(void *dest, const void *src, size_t n)
+  __attribute__((FC_BUILTIN));
+
+/* drop-in replacement for `memset` */
+/*@ assigns ((char*)s)[0..n-1] \from c;
+  @ assigns \result \from s;
+  @ ensures \result == s; */
+void *builtin_memset(void *s, int c, size_t n)
+  __attribute__((FC_BUILTIN));
+
+/* drop-in replacement for `memcmp` */
+/*@ assigns \result \from ((char*)s1)[0..n-1], ((char*)s2)[0..n-1]; */
+int builtin_memcmp(const void *s1, const void *s2, size_t n)
+  __attribute__((FC_BUILTIN));
+
+/* drop-in replacement for `memmove` */
+/*@ assigns ((char*)dest)[0..n-1] \from ((char*)src)[0..n-1];
+  @ assigns \result \from dest;
+  @ ensures \result == dest; */
+void *builtin_memmove(void *dest, const void *src, size_t n)
+  __attribute__((FC_BUILTIN));
+
+/* }}} */
+
+#endif // E_ACSL_STRING_H
diff --git a/src/plugins/e-acsl/share/e-acsl/numerical_model/e_acsl_floating_point.c b/src/plugins/e-acsl/share/e-acsl/numerical_model/e_acsl_floating_point.c
new file mode 100644
index 0000000000000000000000000000000000000000..5f36c078a23f2dec07afb4ff193f787abd723164
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/numerical_model/e_acsl_floating_point.c
@@ -0,0 +1,65 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+#include <fenv.h>
+#include <math.h>
+#include <stddef.h>
+
+#include "../internals/e_acsl_rtl_io.h"
+
+#include "e_acsl_floating_point.h"
+
+// Initialization
+double math_HUGE_VAL = 0.0;
+float  math_HUGE_VALF = 0.0;
+double math_INFINITY = 0.0;
+
+void init_infinity_values() {
+  /* Initialize E-ACSL infinity values */
+  math_HUGE_VAL  = HUGE_VAL;
+  math_HUGE_VALF = HUGE_VALF;
+  math_INFINITY  = INFINITY;
+  /* Clear exceptions buffers */
+  feclearexcept(FE_ALL_EXCEPT);
+}
+
+void floating_point_exception(const char *exp) {
+  int except = fetestexcept(FE_ALL_EXCEPT);
+  char *resp = NULL;
+  if (except) {
+    if (fetestexcept(FE_DIVBYZERO))
+      resp = "Division by zero";
+    else if (fetestexcept(FE_INEXACT))
+      resp = "Rounded result of an operation is not equal to the infinite precision result";
+    else if (fetestexcept(FE_INVALID))
+      resp = "Result of a floating-point operation is not well-defined";
+    else if (fetestexcept(FE_OVERFLOW))
+      resp = "Floating-point overflow";
+    else if (fetestexcept(FE_UNDERFLOW))
+      resp = "Floating-point underflow";
+  }
+  if (resp) {
+    rtl_printf("Execution of the statement `%s` leads to a floating point exception\n", exp);
+    rtl_printf("Exception:  %s\n", resp);
+  }
+  feclearexcept(FE_ALL_EXCEPT);
+}
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_floating_point.h b/src/plugins/e-acsl/share/e-acsl/numerical_model/e_acsl_floating_point.h
similarity index 70%
rename from src/plugins/e-acsl/share/e-acsl/e_acsl_floating_point.h
rename to src/plugins/e-acsl/share/e-acsl/numerical_model/e_acsl_floating_point.h
index 569a82459656958a5c8022d64c7506bb39d6aaf6..f9023747544c465f8b9376a3ee06949e5adeba05 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_floating_point.h
+++ b/src/plugins/e-acsl/share/e-acsl/numerical_model/e_acsl_floating_point.h
@@ -21,17 +21,19 @@
 /**************************************************************************/
 
 /*! ***********************************************************************
- * \file   e_acsl_floating_point.h
+ * \file
  * \brief  Functionality related to processing of floating point values
 ***************************************************************************/
 
 #ifndef E_ACSL_FLOATING_POINT_H
 #define E_ACSL_FLOATING_POINT_H
 
-#include "e_acsl.h"
-#include <math.h>
-#include <float.h>
-#include <fenv.h>
+#include "../internals/e_acsl_alias.h"
+
+#define math_HUGE_VAL             export_alias(math_HUGE_VAL)
+#define math_HUGE_VALF            export_alias(math_HUGE_VALF)
+#define math_INFINITY             export_alias(math_INFINITY)
+#define floating_point_exception  export_alias(floating_point_exception)
 
 /* Below variables hold infinity values for floating points defined in math.h.
    Most of them are defined as macros that expand to built-in function calls.
@@ -48,11 +50,14 @@
 */
 
 /** \brief Positive infinity for doubles: same as HUGE_VAL */
-double math_HUGE_VAL = 0.0;
+extern double math_HUGE_VAL
+  __attribute__((FC_BUILTIN));
 /** \brief Positive infinity for floats: same as HUGE_VALF */
-float  math_HUGE_VALF = 0.0;
+extern float  math_HUGE_VALF
+  __attribute__((FC_BUILTIN));
 /** \brief Representation of infinity value for doubles: same as INFINITY */
-double math_INFINITY = 0.0;
+extern double math_INFINITY
+  __attribute__((FC_BUILTIN));
 
 /* FIXME: An additional variable that should be added to this list is
      long double math_HUGE_VALL;
@@ -60,35 +65,9 @@ double math_INFINITY = 0.0;
    are unsupported Value plug-in analysis who start throwing errors once
    test suite is ran. */
 
-static void init_infinity_values() {
-  /* Initialize E-ACSL infinity values */
-  math_HUGE_VAL  = HUGE_VAL;
-  math_HUGE_VALF = HUGE_VALF;
-  math_INFINITY  = INFINITY;
-  /* Clear exceptions buffers */
-  feclearexcept(FE_ALL_EXCEPT);
-}
+void init_infinity_values();
 
-void floating_point_exception(const char *exp) {
-  int except = fetestexcept(FE_ALL_EXCEPT);
-  char *resp = NULL;
-  if (except) {
-    if (fetestexcept(FE_DIVBYZERO))
-      resp = "Division by zero";
-    else if (fetestexcept(FE_INEXACT))
-      resp = "Rounded result of an operation is not equal to the infinite precision result";
-    else if (fetestexcept(FE_INVALID))
-      resp = "Result of a floating-point operation is not well-defined";
-    else if (fetestexcept(FE_OVERFLOW))
-      resp = "Floating-point overflow";
-    else if (fetestexcept(FE_UNDERFLOW))
-      resp = "Floating-point underflow";
-  }
-  if (resp) {
-    rtl_printf("Execution of the statement `%s` leads to a floating point exception\n", exp);
-    rtl_printf("Exception:  %s\n", resp);
-  }
-  feclearexcept(FE_ALL_EXCEPT);
-}
+void floating_point_exception(const char *exp)
+  __attribute__((FC_BUILTIN));
 
-#endif
+#endif // E_ACSL_FLOATING_POINT_H
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_gmp_api.h b/src/plugins/e-acsl/share/e-acsl/numerical_model/e_acsl_gmp_api.h
similarity index 99%
rename from src/plugins/e-acsl/share/e-acsl/e_acsl_gmp_api.h
rename to src/plugins/e-acsl/share/e-acsl/numerical_model/e_acsl_gmp_api.h
index 38c3716db07567bfd3555ea9b4bff940d2fa23b0..f7df545a7bf57cbfc7ba77eca599016918cc8c1e 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_gmp_api.h
+++ b/src/plugins/e-acsl/share/e-acsl/numerical_model/e_acsl_gmp_api.h
@@ -21,7 +21,7 @@
 /**************************************************************************/
 
 /*! ***********************************************************************
- * \file  e_acsl_gmp.h
+ * \file
  * \brief Prototypes of functions belonging to GNU Multiple
  * Precision Arithmetic Library (GMP) used within E-ACSL
 ***************************************************************************/
@@ -33,8 +33,8 @@
 #ifndef E_ACSL_GMP_API_H
 #define E_ACSL_GMP_API_H
 
-#include "stdlib.h"
-#include "e_acsl_alias.h"
+#include <stddef.h>
+#include "../internals/e_acsl_alias.h"
 
 #define mpz_struct  export_alias(mpz_struct)
 #define mpz_t       export_alias(mpz_t)
diff --git a/src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree.h b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.c
similarity index 99%
rename from src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree.h
rename to src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.c
index 4d6e5b87353f7f1cd7686dba6dfe63ffea859cae..5492782fdd0fa6ac958750d89d85241021f4b4a7 100644
--- a/src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree.h
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.c
@@ -21,12 +21,13 @@
 /**************************************************************************/
 
 /*! ***********************************************************************
- * \file e_acsl_bittree.h
+ * \file
  * \brief Patricia Trie API Implementation
 ***************************************************************************/
 
-#ifndef E_ACSL_BITTREE
-#define E_ACSL_BITTREE
+#include "../../internals/e_acsl_malloc.h"
+
+#include "e_acsl_bittree.h"
 
 #define WORDBITS __WORDSIZE
 
@@ -466,4 +467,3 @@ static void bt_print_tree() {
   DLOG("-----------------\n");
 }
 #endif
-#endif
diff --git a/src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree_api.h b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.h
similarity index 97%
rename from src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree_api.h
rename to src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.h
index 55cb8c25d24fb2afae0b8e6cf1529445ee05b727..ed2c18bc0c41d06799482623c611e9033a05c702 100644
--- a/src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree_api.h
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.h
@@ -21,12 +21,15 @@
 /**************************************************************************/
 
 /*! ***********************************************************************
- * \file  e_acsl_bittree_api.h
+ * \file
  * \brief Patricia Trie API
 ***************************************************************************/
 
-#ifndef E_ACSL_BITTREE_API
-#define E_ACSL_BITTREE_API
+#ifndef E_ACSL_BITTREE
+#define E_ACSL_BITTREE
+
+#include <stddef.h>
+#include <stdint.h>
 
 /*! \brief Structure representing an allocated memory block */
 struct bt_block {
@@ -98,4 +101,4 @@ static void bt_print_node(bt_node * ptr, int depth);
 static void bt_print();
 #endif
 
-#endif
+#endif // E_ACSL_BITTREE
diff --git a/src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree_mmodel.c b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_observation_model.c
similarity index 82%
rename from src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree_mmodel.c
rename to src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_observation_model.c
index de92f7da1d8b771d83da85e97cd1e5a3bc9673a1..7e856ef6c22fe954171ad9befc133d239c017f41 100644
--- a/src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree_mmodel.c
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_observation_model.c
@@ -21,16 +21,20 @@
 /**************************************************************************/
 
 /*! ***********************************************************************
- * \file e_acsl_bittree_mmodel.c
+ * \file
  * \brief Implementation of E-ACSL public API using a memory model based
  * on Patricia Trie. See e_acsl.h for details.
 ***************************************************************************/
 
-# include "e_acsl_bittree_api.h"
-# include "e_acsl_bittree.h"
+#include "../../internals/e_acsl_debug.h"
+#include "../../internals/e_acsl_malloc.h"
+#include "../../internals/e_acsl_private_assert.h"
+#include "../../instrumentation_model/e_acsl_temporal.h"
+#include "../../numerical_model/e_acsl_floating_point.h"
+#include "../internals/e_acsl_safe_locations.h""
+#include "e_acsl_bittree.h"
 
-static inline int allocated(uintptr_t addr, long size, uintptr_t base_ptr);
-static inline int writeable(uintptr_t addr, long size, uintptr_t base_ptr);
+#include "../e_acsl_observation_model.h"
 
 /* Public API {{{ */
 /* Debug */
@@ -43,27 +47,6 @@ static inline int writeable(uintptr_t addr, long size, uintptr_t base_ptr);
 #endif
 /* }}} */
 
-#define E_ACSL_MMODEL_DESC "patricia trie"
-
-/* Assertions in debug mode */
-#ifdef E_ACSL_DEBUG
-/* Assert that memory block [_addr, _addr + _size] is allocated */
-# define DVALIDATE_ALLOCATED(_addr, _size, _base) \
-  vassert(allocated((uintptr_t)_addr, _size, (uintptr_t)_base), \
-    "Operation on unallocated block [%a + %lu] with base %a\n", \
-    _addr, _size, _base);
-
-/* Assert that memory block [_addr, _addr + _size] is allocated
- * and can be written to */
-# define DVALIDATE_WRITEABLE(_addr, _size, _base) \
-  vassert(writeable((uintptr_t)_addr, _size, (uintptr_t)_base), \
-    "Operation on unallocated block [%a + %lu] with base %a\n", \
-    _addr, _size, _base);
-#else
-#define DVALIDATE_ALLOCATED(_ptr, _size, _base)
-#define DVALIDATE_WRITEABLE(_ptr, _size, _base)
-#endif
-
 /**************************/
 /* SUPPORT            {{{ */
 /**************************/
@@ -223,7 +206,7 @@ int initialized(void * ptr, size_t size) {
 size_t block_length(void* ptr) {
   bt_block * blk = bt_find(ptr);
   /* Hard failure when un-allocated memory is used */
-  vassert(blk != NULL, "\\block_length of unallocated memory", NULL);
+  private_assert(blk != NULL, "\\block_length of unallocated memory", NULL);
   return blk->size;
 }
 
@@ -243,27 +226,6 @@ static bt_block* lookup_allocated(void* ptr, size_t size, void *ptr_base) {
   return (blk->size - ((size_t)ptr - blk->ptr) >= size) ? blk : NULL;
 }
 
-/** \brief same as ::lookup_allocated but return either `1` or `0` depending
-    on whether the memory block described by this function's arguments is
-    allocated or not.
-    NOTE: Should have same signature in all models. */
-static inline int allocated(uintptr_t addr, long size, uintptr_t base) {
-  return lookup_allocated((void*)addr, size, (void*)base) == NULL ? 0 : 1;
-}
-
-/** \brief Return 1 if a given memory location is read-only and 0 otherwise */
-static int readonly (void *ptr) {
-  bt_block * blk = bt_find(ptr);
-  vassert(blk != NULL, "Readonly on unallocated memory", NULL);
-  return blk->is_readonly;
-}
-
-/** \brief same as ::allocated but returns `0` if the memory block described
-     by the arguments cannot be written to */
-static inline int writeable(uintptr_t addr, long size, uintptr_t base_ptr) {
-  return allocated(addr, size, base_ptr) && !readonly((void*)addr);
-}
-
 /* return whether the size bytes of ptr are readable/writable */
 int valid(void* ptr, size_t size, void *ptr_base, void *addrof_base) {
   bt_block * blk = lookup_allocated(ptr, size, ptr_base);
@@ -287,14 +249,14 @@ int valid_read(void* ptr, size_t size, void *ptr_base, void *addrof_base) {
 /* return the base address of the block containing ptr */
 void* base_addr(void* ptr) {
   bt_block * tmp = bt_find(ptr);
-  vassert(tmp != NULL, "\\base_addr of unallocated memory", NULL);
+  private_assert(tmp != NULL, "\\base_addr of unallocated memory", NULL);
   return (void*)tmp->ptr;
 }
 
 /* return the offset of `ptr` within its block */
 size_t offset(void* ptr) {
   bt_block * tmp = bt_find(ptr);
-  vassert(tmp != NULL, "\\offset of unallocated memory", NULL);
+  private_assert(tmp != NULL, "\\offset of unallocated memory", NULL);
   return ((uintptr_t)ptr - tmp->ptr);
 }
 /* }}} */
@@ -309,12 +271,12 @@ size_t offset(void* ptr) {
 void* store_block(void *ptr, size_t size) {
 #ifdef E_ACSL_DEBUG
   if (ptr == NULL)
-    vabort("Attempt to record NULL block");
+    private_abort("Attempt to record NULL block");
   else {
     char *check = (char*)ptr;
     bt_block *exitsing_block = bt_find(ptr);
     if (exitsing_block) {
-      vabort("\nRecording %a [%lu] at %s:%d failed."
+      private_abort("\nRecording %a [%lu] at %s:%d failed."
         " Overlapping block %a [%lu] found at %s:%d\n",
         ptr, size, cloc.file, cloc.line, base_addr(check),
         block_length(check), exitsing_block->file, exitsing_block->line);
@@ -322,7 +284,7 @@ void* store_block(void *ptr, size_t size) {
     check += size - 1;
     exitsing_block = bt_find(check);
     if (exitsing_block) {
-      vabort("\nRecording %a [%lu] at %d failed."
+      private_abort("\nRecording %a [%lu] at %d failed."
         " Overlapping block %a [%lu] found at %s:%d\n",
         ptr, size, cloc.file, cloc.line, base_addr(check),
         block_length(check), exitsing_block->file, exitsing_block->line);
@@ -372,14 +334,14 @@ void delete_block(void *ptr) {
 #ifdef E_ACSL_DEBUG
   /* Make sure the recorded block is not NULL */
   if (!ptr)
-    vabort("Attempt to delete NULL block");
+    private_abort("Attempt to delete NULL block");
 #endif
   if (ptr != NULL) {
     bt_block *tmp = bt_lookup(ptr);
 #ifdef E_ACSL_DEBUG
     /* Make sure the removed block exists in the tracked allocation */
     if (!tmp)
-      vabort("Attempt to delete untracked block");
+      private_abort("Attempt to delete untracked block");
 #endif
     if (tmp) {
       bt_clean_block_init(tmp);
@@ -400,7 +362,7 @@ void* store_block_duplicate(void* ptr, size_t size) {
 #ifdef E_ACSL_DEBUG
     /* Make sure that duplicate block, if so is of the same length */
     if (tmp->size != size)
-      vabort("Attempt to store duplicate block of different length");
+      private_abort("Attempt to store duplicate block of different length");
 #endif
       delete_block(ptr);
     }
@@ -440,7 +402,7 @@ void *aligned_alloc(size_t alignment, size_t size) {
      - size and alignment are greater than zero
      - alignment is a power of 2
      - size is a multiple of alignment */
-  if (!size || !alignment || !powof2(alignment) || (size%alignment))
+  if (!size || !alignment || !is_pow_of_2(alignment) || (size%alignment))
     return NULL;
 
   void *res = public_aligned_alloc(alignment, size);
@@ -453,7 +415,7 @@ int posix_memalign(void **memptr, size_t alignment, size_t size) {
  /* Check if:
    *  - size and alignment are greater than zero
    *  - alignment is a power of 2 and a multiple of sizeof(void*) */
-  if (!size || !alignment || !powof2(alignment) || alignment%sizeof(void*))
+  if (!size || !alignment || !is_pow_of_2(alignment) || alignment%sizeof(void*))
     return -1;
 
   /* Make sure that the first argument to posix memalign is indeed allocated */
@@ -538,13 +500,13 @@ void free(void *ptr) {
   if (ptr == NULL) {
 /* Fail if instructed to treat NULL input to free as invalid. */
 #ifdef E_ACSL_FREE_VALID_ADDRESS
-    vabort("NULL pointer in free\n");
+    private_abort("NULL pointer in free\n");
 #endif
     return;
   }
   bt_block *res = bt_lookup(ptr);
   if (!res) {
-    vabort("Not a start of block (%a) in free\n", ptr);
+    private_abort("Not a start of block (%a) in free\n", ptr);
   } else {
     update_heap_allocation(-res->size);
     public_free(ptr);
@@ -617,11 +579,12 @@ void memory_init(int *argc_ref, char ***argv_ref, size_t ptr_size) {
   /* Tracking safe locations */
   collect_safe_locations();
   int i;
-  for (i = 0; i < safe_location_counter; i++) {
-    void *addr = (void*)safe_locations[i].address;
-    uintptr_t len = safe_locations[i].length;
+  for (i = 0; i < get_safe_location_count(); i++) {
+    memory_location * loc = get_safe_location(i);
+    void *addr = (void*)loc->address;
+    uintptr_t len = loc->length;
     store_block(addr, len);
-    if (safe_locations[i].is_initialized)
+    if (loc->is_initialized)
       initialize(addr, len);
   }
   init_infinity_values();
@@ -658,7 +621,8 @@ void delete_block_debug(char *file, int line, void* ptr) {
   update_cloc(file, line);
   bt_block * tmp = bt_lookup(ptr);
   if (!tmp) {
-    vabort("Block with base address %a not found in the memory model at %s:%d",
+    private_abort(
+        "Block with base address %a not found in the memory model at %s:%d",
         ptr, file, line);
   }
   delete_block(ptr);
@@ -676,35 +640,3 @@ void block_info(char *p) {
 }
 #endif
 /* }}} */
-
-/* Local operations on temporal timestamps {{{ */
-/* Remaining functionality (shared between all models) is located in e_acsl_temporal.h */
-#ifdef E_ACSL_TEMPORAL
-static uint32_t origin_timestamp(void *ptr) {
-  bt_block * blk = bt_find(ptr);
-  return blk != NULL ? blk->timestamp : INVALID_TEMPORAL_TIMESTAMP;
-}
-
-static uintptr_t temporal_referent_shadow(void *ptr) {
-  bt_block *blk = bt_find(ptr);
-  vassert(blk != NULL,
-    "referent timestamp on unallocated memory address %a", (uintptr_t)ptr);
-  vassert(blk->temporal_shadow != NULL,
-    "no temporal shadow of block with base address", (uintptr_t)blk->ptr);
-  return (uintptr_t)blk->temporal_shadow + offset(ptr);
-}
-
-static uint32_t referent_timestamp(void *ptr) {
-  bt_block * blk = bt_find(ptr);
-  if (blk != NULL)
-    return *((uint32_t*)temporal_referent_shadow(ptr));
-  else
-    return INVALID_TEMPORAL_TIMESTAMP;
-}
-
-static void store_temporal_referent(void *ptr, uint32_t ref) {
-  uint32_t *shadow = (uint32_t*)temporal_referent_shadow(ptr);
-  *shadow = ref;
-}
-#endif
-/* }}} */
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_omodel_debug.c b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_omodel_debug.c
new file mode 100644
index 0000000000000000000000000000000000000000..75a3feca780f5a2a72fec437dff74625f9651cf8
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_omodel_debug.c
@@ -0,0 +1,50 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+#include "../../internals/e_acsl_private_assert.h"
+#include "e_acsl_bittree.h"
+
+#include "../internals/e_acsl_omodel_debug.h"
+
+#define E_ACSL_MMODEL_DESC "patricia trie"
+
+void describe_observation_model() {
+  rtl_printf(" * Memory tracking: %s\n", E_ACSL_MMODEL_DESC);
+}
+
+/** \brief same as ::lookup_allocated but return either `1` or `0` depending
+    on whether the memory block described by this function's arguments is
+    allocated or not.
+    NOTE: Should have same signature in all models. */
+int allocated(uintptr_t addr, long size, uintptr_t base) {
+  return lookup_allocated((void*)addr, size, (void*)base) == NULL ? 0 : 1;
+}
+
+int readonly (void *ptr) {
+  bt_block * blk = bt_find(ptr);
+  private_assert(blk != NULL, "Readonly on unallocated memory", NULL);
+  return blk->is_readonly;
+}
+
+int writeable(uintptr_t addr, long size, uintptr_t base_ptr) {
+  return allocated(addr, size, base_ptr) && !readonly((void*)addr);
+}
\ No newline at end of file
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_timestamp_retrieval.c b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_timestamp_retrieval.c
new file mode 100644
index 0000000000000000000000000000000000000000..12d3a4c02bc902fb27971b7692b0d04edfbba2bc
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_timestamp_retrieval.c
@@ -0,0 +1,61 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+#include "../../internals/e_acsl_private_assert.h"
+#include "e_acsl_bittree.h"
+#ifdef E_ACSL_TEMPORAL
+# include "../../instrumentation_model/e_acsl_temporal_timestamp.h"
+#endif
+
+#include "../internals/e_acsl_timestamp_retrieval.h"
+
+/* Local operations on temporal timestamps {{{ */
+/* Remaining functionality (shared between all models) is located in e_acsl_temporal.h */
+#ifdef E_ACSL_TEMPORAL
+uint32_t origin_timestamp(void *ptr) {
+  bt_block * blk = bt_find(ptr);
+  return blk != NULL ? blk->timestamp : INVALID_TEMPORAL_TIMESTAMP;
+}
+
+uintptr_t temporal_referent_shadow(void *ptr) {
+  bt_block *blk = bt_find(ptr);
+  private_assert(blk != NULL,
+    "referent timestamp on unallocated memory address %a", (uintptr_t)ptr);
+  private_assert(blk->temporal_shadow != NULL,
+    "no temporal shadow of block with base address", (uintptr_t)blk->ptr);
+  return (uintptr_t)blk->temporal_shadow + offset(ptr);
+}
+
+uint32_t referent_timestamp(void *ptr) {
+  bt_block * blk = bt_find(ptr);
+  if (blk != NULL)
+    return *((uint32_t*)temporal_referent_shadow(ptr));
+  else
+    return INVALID_TEMPORAL_TIMESTAMP;
+}
+
+void store_temporal_referent(void *ptr, uint32_t ref) {
+  uint32_t *shadow = (uint32_t*)temporal_referent_shadow(ptr);
+  *shadow = ref;
+}
+#endif
+/* }}} */
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_heap.c b/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_heap.c
new file mode 100644
index 0000000000000000000000000000000000000000..1737cc9b97057a80fb8421925683c7248c984de1
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_heap.c
@@ -0,0 +1,33 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+#include "internals/e_acsl_heap_tracking.h"
+
+#include "e_acsl_heap.h"
+
+size_t get_heap_allocation_size(void) {
+  return get_heap_internal_allocation_size();
+}
+
+size_t get_heap_allocated_blocks(void) {
+  return get_heap_internal_allocated_blocks();
+}
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_heap.h b/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_heap.h
new file mode 100644
index 0000000000000000000000000000000000000000..b3e521c20464e4a35c69316ffe8fa24b777992b8
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_heap.h
@@ -0,0 +1,52 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+/*! ***********************************************************************
+ * \file
+ * \brief  User API to query E-ACSL about the state of heap allocation.
+***************************************************************************/
+
+#ifndef E_ACSL_HEAP
+#define E_ACSL_HEAP
+
+#include <stddef.h>
+#include "../internals/e_acsl_alias.h"
+
+#define heap_allocation_size      export_alias(heap_allocation_size)
+#define heap_allocated_blocks     export_alias(heap_allocated_blocks)
+#define get_heap_allocation_size  export_alias(get_heap_allocation_size)
+#define get_heap_allocated_blocks export_alias(get_heap_allocated_blocks)
+
+/*! \brief A variable holding the number of bytes in heap application allocation. */
+extern size_t heap_allocation_size;
+/*! \brief A variable holding the number of blocks in heap application allocation. */
+extern size_t heap_allocated_blocks;
+
+/*! Return the number of bytes in heap application allocation. */
+size_t get_heap_allocation_size()
+  __attribute__((FC_BUILTIN));
+
+/*! Return the number of blocks in heap application allocation. */
+size_t get_heap_allocated_blocks()
+  __attribute__((FC_BUILTIN));
+
+#endif // E_ACSL_HEAP
\ No newline at end of file
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_observation_model.c b/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_observation_model.c
new file mode 100644
index 0000000000000000000000000000000000000000..b87a35417638a91f5136b113dffa264552607e46
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_observation_model.c
@@ -0,0 +1,41 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+#include "internals/e_acsl_heap_tracking.c"
+#include "internals/e_acsl_safe_locations.c"
+
+/* Select memory model, either segment-based or bittree-based model should
+   be defined */
+#if defined E_ACSL_SEGMENT_MMODEL
+# include "segment_model/e_acsl_segment_observation_model.c"
+# include "segment_model/e_acsl_segment_tracking.c"
+# include "segment_model/e_acsl_shadow_layout.c"
+# include "segment_model/e_acsl_segment_omodel_debug.c"
+# include "segment_model/e_acsl_segment_timestamp_retrieval.c"
+#elif defined E_ACSL_BITTREE_MMODEL
+# include "bittree_model/e_acsl_bittree_observation_model.c"
+# include "bittree_model/e_acsl_bittree.c"
+# include "bittree_model/e_acsl_bittree_omodel_debug.c"
+# include "bittree_model/e_acsl_bittree_timestamp_retrieval.c"
+#else
+# error "No E-ACSL memory model defined. Aborting compilation"
+#endif
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_observation_model.h b/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_observation_model.h
new file mode 100644
index 0000000000000000000000000000000000000000..d4b158004a2d718f40e87352c9e43fe08ae0bc97
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_observation_model.h
@@ -0,0 +1,330 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+/*! ***********************************************************************
+ * \file
+ * \brief  Observation model API
+ *
+ * Functions and variables with non-static linkage used for memory
+ * observation.
+***************************************************************************/
+
+#ifndef E_ACSL_OBSERVATION_MODEL_H
+#define E_ACSL_OBSERVATION_MODEL_H
+
+#include <stddef.h>
+#include <stdint.h>
+#include "../internals/e_acsl_alias.h"
+#include "e_acsl_heap.h"
+
+/************************************************************************/
+/*** API Prefixes {{{ ***/
+/************************************************************************/
+
+/* Memory state initialization */
+#define memory_init           export_alias(memory_init)
+#define memory_clean          export_alias(memory_clean)
+
+/* Tracking */
+#define store_block           export_alias(store_block)
+#define store_block_duplicate export_alias(store_block_duplicate)
+#define delete_block          export_alias(delete_block)
+
+/* Predicates */
+#define offset                export_alias(offset)
+#define base_addr             export_alias(base_addr)
+#define block_length          export_alias(block_length)
+#define valid_read            export_alias(valid_read)
+#define valid                 export_alias(valid)
+#define initialized           export_alias(initialized)
+#define freeable              export_alias(freeable)
+
+/* Block initialization  */
+#define mark_readonly         export_alias(mark_readonly)
+#define initialize            export_alias(initialize)
+#define full_init             export_alias(full_init)
+
+/* }}} */
+
+/************************************************************************/
+/*** Dynamic memory allocation {{{ ***/
+/************************************************************************/
+
+/*! \brief Drop-in replacement for \p malloc with memory tracking enabled.
+ * For further information, see \p malloc(3).
+ *
+ * NOTE: This malloc returns a `NULL` pointer if the requested size is `0`.
+ * Such behaviour is compliant with the C99 standard, however it differs from
+ * the behaviour of the GLIBC malloc, which returns a zero-size block instead.
+ * The standard indicates that a return value for a zero-sized allocation
+ * is implementation specific:
+ *    "If the size of the space requested is zero, the behaviour is
+ *    implementation-defined: either a null pointer is returned, or the
+ *    behaviour is as if the size were some non-zero value, except that the
+ *    returned pointer shall not be used to access an object." */
+/*@
+  assigns __e_acsl_heap_allocation_size \from size, __e_acsl_heap_allocation_size;
+  assigns __e_acsl_heap_allocated_blocks \from size, __e_acsl_heap_allocated_blocks;
+ */
+void * malloc(size_t size)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Drop-in replacement for \p calloc with memory tracking enabled.
+ * For further information, see \p calloc(3). */
+/*@
+  assigns __e_acsl_heap_allocation_size \from indirect:nbr_elt, indirect:size_elt, __e_acsl_heap_allocation_size;
+  assigns __e_acsl_heap_allocated_blocks \from indirect:nbr_elt, indirect:size_elt, __e_acsl_heap_allocated_blocks;
+ */
+void * calloc(size_t nbr_elt, size_t size_elt)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Drop-in replacement for \p realloc with memory tracking enabled.
+ * For further information, see realloc(3) */
+/*@
+  assigns __e_acsl_heap_allocation_size \from __e_acsl_heap_allocation_size;
+  assigns __e_acsl_heap_allocated_blocks \from __e_acsl_heap_allocated_blocks;
+ */
+void * realloc(void * ptr, size_t size)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Drop-in replacement for \p free with memory tracking enabled.
+ * For further information, see \p free(3). */
+/*@
+  assigns __e_acsl_heap_allocation_size \from __e_acsl_heap_allocation_size;
+  assigns __e_acsl_heap_allocated_blocks \from __e_acsl_heap_allocated_blocks;
+ */
+void free(void * ptr)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Allocate `size` bytes of memory such that the allocation's base
+ * address is an even multiple of alignment.
+ *
+ * \param alignment - should be the power of two
+ * \param size - should be the multiple of alignment
+ * \return - pointer to the allocated memory if the restrictions placed on size
+ *   and alignment parameters hold. NULL is returned otherwise. */
+/*@
+  assigns __e_acsl_heap_allocation_size \from indirect:alignment, size, __e_acsl_heap_allocation_size;
+  assigns __e_acsl_heap_allocated_blocks \from indirect:alignment, size, __e_acsl_heap_allocated_blocks;
+ */
+void *aligned_alloc(size_t alignment, size_t size)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Allocate size bytes and place the address of the allocated memory in
+ * `*memptr`.  The address of the allocated memory will be a multiple of
+ * `alignment`, which must be a power of two and a multiple of `sizeof(void*)`.
+ * If size  is  0, then the value placed in *memptr is NULL. */
+/*@
+  assigns __e_acsl_heap_allocation_size \from indirect:alignment, size, __e_acsl_heap_allocation_size;
+  assigns __e_acsl_heap_allocated_blocks \from indirect:alignment, size, __e_acsl_heap_allocated_blocks;
+ */
+int posix_memalign(void **memptr, size_t alignment, size_t size)
+  __attribute__((FC_BUILTIN));
+/* }}} */
+
+/************************************************************************/
+/*** Memory tracking {{{ ***/
+/************************************************************************/
+
+/*! \brief Initialize memory tracking state.
+ * Called before any other statement in \p main */
+/*@ assigns \nothing; */
+void memory_init(int *argc_ref, char ***argv, size_t ptr_size)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Clean-up memory tracking state before a program's termination. */
+/*@ assigns \nothing; */
+void memory_clean(void)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Store stack or globally-allocated memory block
+ * starting at an address given by \p ptr.
+ *
+ * \param ptr base address of the tracked memory block
+ * \param size size of the tracked block in bytes */
+/*@ ensures \result == ptr;
+  @ assigns \result \from *(((char*)ptr)+(0..size-1)), ptr, size; */
+void * store_block(void * ptr, size_t size)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Same as `store_block`, but first check
+ * checks whether a block with a base address given by `ptr` exists in the
+ * tracked allocation and remove it before storing a new block.
+ *
+ * \param ptr base address of the tracked memory block
+ * \param size size of the tracked block in bytes */
+/*@ ensures \result == ptr;
+  @ assigns \result \from *(((char*)ptr)+(0..size-1)), ptr, size; */
+void * store_block_duplicate(void * ptr, size_t size)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Remove a memory block which base address is \p ptr from tracking. */
+/*@ assigns \nothing; */
+void delete_block(void * ptr)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Mark the \p size bytes starting at an address given by \p ptr as
+ * initialized. */
+/*@ assigns \nothing; */
+void initialize(void * ptr, size_t size)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Mark all bytes belonging to a memory block which start address is
+ * given by \p ptr as initialized. */
+/*@ assigns \nothing; */
+void full_init(void * ptr)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Mark a memory block which start address is given by \p ptr as
+ * read-only. */
+/*@ assigns \nothing; */
+void mark_readonly(void * ptr)
+  __attribute__((FC_BUILTIN));
+
+/* }}} */
+
+/************************************************************************/
+/*** E-ACSL predicates {{{ ***/
+/************************************************************************/
+
+/*!\brief Implementation of the \b \\freeable predicate of E-ACSL.
+ *
+ * Evaluate to a non-zero value if \p ptr points to a start address of
+ * a block allocated via \p malloc, \p calloc or \p realloc. */
+/*@ assigns \result \from ptr; */
+int freeable(void * ptr)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Implementation of the \b \\valid predicate of E-ACSL.
+ *
+ * \\valid evaluates an expression of the form `p+i`, where `p` is a pointer
+ * and `i` is an integer offset and returns `true` if both `p` and `p+i` belong
+ * to the same allocated memory block.
+ *
+ * @param ptr - memory address under question
+ * @param size - the byte-length (starting from `ptr`) of the memory area which
+ *  needs to be valid
+ * @param base - if `ptr` can be represented by the expression `p+i` then
+ *  `base` refers to `p`
+ * @param addrof_base - if `ptr` can be represented by the expression `p+i`
+ * then `addrof_base` refers to `&p`. For the cases when the address of `p`
+ * cannot be taken (e.g., address of a static array or a constant value
+ * casted to a pointer) then `addrof_base` is zero.
+ *
+ * @returns
+ *  `true` if regions `[ptr, ptr + size]` and `[base, base + size]` are
+ *  writable and lie within the same memory block and `false` otherwise.
+ *  If `weak validity` is used (see macro `E_ACSL_WEAK_VALIDITY`)
+ *  then only region `[ptr, ptr + size]` should lie within the same block
+ *  and be writable.
+ */
+/*@ assigns \result \from *(((char*)ptr)+(0..size-1)), ptr, size;
+  @ behavior valid:
+  @   assumes \valid(((char *)ptr)+(0..size-1));
+  @   assumes
+  @     size <= 0 ||
+  @     ! \separated(((char *)ptr)+(0..size-1),
+  @                  ((char *)\base_addr(base))+(0..\block_length(base)-1));
+  @   ensures \result == 1;
+  @ behavior invalid_ptr:
+  @   assumes ! \valid(((char *)ptr)+(0..size-1));
+  @   ensures \result == 0;
+  @ behavior separated_ptr:
+  @   assumes size > 0;
+  @   assumes \separated(((char *)ptr)+(0..size-1),
+  @                      ((char *)\base_addr(base))+(0..\block_length(base)-1));
+  @   ensures \result == 0;
+  @ complete behaviors;
+  @ disjoint behaviors;
+  @ */
+int valid(void * ptr, size_t size, void *base, void *addrof_base)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Implementation of the \b \\valid_read predicate of E-ACSL.
+ *
+ * Same as ::valid except the checked memory locations are only
+ * required to be allocated.  */
+/*@ assigns \result \from *(((char*)ptr)+(0..size-1)), ptr, size;
+  @ behavior valid:
+  @   assumes \valid_read(((char *)ptr)+(0..size-1));
+  @   assumes
+  @     size <= 0 ||
+  @     ! \separated(((char *)ptr)+(0..size-1),
+  @                  ((char *)\base_addr(base))+(0..\block_length(base)-1));
+  @   ensures \result == 1;
+  @ behavior invalid_ptr:
+  @   assumes ! \valid_read(((char *)ptr)+(0..size-1));
+  @   ensures \result == 0;
+  @ behavior separated_ptr:
+  @   assumes size > 0;
+  @   assumes \separated(((char *)ptr)+(0..size-1),
+  @                      ((char *)\base_addr(base))+(0..\block_length(base)-1));
+  @   ensures \result == 0;
+  @ complete behaviors;
+  @ disjoint behaviors;
+  @ */
+int valid_read(void * ptr, size_t size, void *base, void *addrof_base)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Implementation of the \b \\base_addr predicate of E-ACSL.
+ * Return the base address of the memory block containing an address given
+ * by \p ptr */
+/*@ ensures \result == \base_addr(ptr);
+  @ assigns \result \from ptr; */
+void * base_addr(void * ptr)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Implementation of the \b \\block_length predicate of E-ACSL.
+ * Return the byte length of the memory block of the block containing a memory
+ * address given by \p ptr */
+/*@ ensures \result == \block_length(ptr);
+  @ assigns \result \from ptr; */
+size_t block_length(void * ptr)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Implementation of the \b \\offset predicate of E-ACSL.
+ * Return the byte offset of address given by \p ptr within a memory blocks
+ * it belongs to */
+/*@ ensures \result == \offset(ptr);
+  @ assigns \result \from ptr; */
+size_t offset(void * ptr)
+  __attribute__((FC_BUILTIN));
+
+/*! \brief Implementation of the \b \\initialized predicate of E-ACSL.
+ * Return a non-zero value if \p size bytes starting from an address given by
+ * \p ptr are initialized and zero otherwise. */
+/*@ assigns \result \from *(((char*)ptr)+(0..size-1)), ptr, size;
+  @ behavior initialized:
+  @   assumes \initialized(((char *)ptr)+(0..size-1));
+  @   ensures \result == 1;
+  @ behavior uninitialized:
+  @   assumes ! \initialized(((char *)ptr)+(0..size-1));
+  @   ensures \result == 0;
+  @ complete behaviors;
+  @ disjoint behaviors;
+  @ */
+int initialized(void * ptr, size_t size)
+  __attribute__((FC_BUILTIN));
+
+/* }}} */
+
+#endif // E_ACSL_OBSERVATION_MODEL_H
\ No newline at end of file
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_heap_tracking.c b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_heap_tracking.c
new file mode 100644
index 0000000000000000000000000000000000000000..39a5efb21a3820deee5afde7e91aef4bba140945
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_heap_tracking.c
@@ -0,0 +1,67 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+#include "../../internals/e_acsl_rtl_io.h"
+#include "e_acsl_heap_tracking.h"
+
+/* Variable tracking byte-count of user-allocated heap memory. */
+static size_t heap_internal_allocation_size = 0;
+/* Read-only version of the variable above exposed to the user in
+ * `e_acsl_heap.h` */
+size_t __e_acsl_heap_allocation_size = 0;
+
+/* Variable tracking count of heap memory blocks */
+static size_t heap_internal_allocated_blocks = 0;
+/* Read-only version of the variable above exposed to the user in
+ * `e_acsl_heap.h` */
+size_t __e_acsl_heap_allocated_blocks = 0;
+
+size_t get_heap_internal_allocation_size(void) {
+  return heap_internal_allocation_size;
+}
+
+size_t get_heap_internal_allocated_blocks(void) {
+  return heap_internal_allocated_blocks;
+}
+
+void update_heap_allocation(long size) {
+  heap_internal_allocation_size += size;
+  if (size > 0)
+    ++heap_internal_allocated_blocks;
+  else if (size < 0)
+    --heap_internal_allocated_blocks;
+
+  // Update read-only versions of the variables
+  __e_acsl_heap_allocation_size = heap_internal_allocation_size;
+  __e_acsl_heap_allocated_blocks = heap_internal_allocated_blocks;
+}
+
+void report_heap_leaks() {
+#if defined(E_ACSL_VERBOSE) || defined(E_ACSL_DEBUG)
+  size_t size = get_heap_allocation_size();
+  size_t blocks = get_heap_allocated_blocks();
+  if (size) {
+    rtl_printf(" *** WARNING: Leaked %lu bytes of heap memory in %ld block%s\n",
+      size, blocks, (blocks == 1) ? "" : "s");
+  }
+#endif
+}
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_leak.h b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_heap_tracking.h
similarity index 66%
rename from src/plugins/e-acsl/share/e-acsl/e_acsl_leak.h
rename to src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_heap_tracking.h
index 5e1196630646c8505ea86c3d03a93fdf3bba8ad7..eb8610314f20e6899f7cd971d75f9db64b735f72 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_leak.h
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_heap_tracking.h
@@ -21,50 +21,26 @@
 /**************************************************************************/
 
 /*! ***********************************************************************
- * \file  e_acsl_leak.h
- *
+ * \file
  * \brief Functionality to report/track memory leaks. Shared between models
 ***************************************************************************/
 
-#ifndef E_ACSL_HEAP_LEAK_H
-#define E_ACSL_HEAP_LEAK_H
+#ifndef E_ACSL_HEAP_TRACKING
+#define E_ACSL_HEAP_TRACKING
 
-#include "e_acsl.h"
-
-/* Variable tracking byte-count of user-allocated heap memory.
-   Visible externally via __e_acsl_ prefix */
-size_t heap_allocation_size = 0;
-
-/* Variable tracking count of heap memory blocks */
-static size_t heap_allocated_blocks = 0;
+#include <stddef.h>
 
 /* Return the number of bytes in heap application allocation */
-size_t get_heap_allocation_size(void) {
-  return heap_allocation_size;
-}
+size_t get_heap_internal_allocation_size(void);
 
 /* Return the number of blocks in heap application allocation */
-static inline size_t get_heap_allocated_blocks(void) {
-  return heap_allocated_blocks;
-}
+size_t get_heap_internal_allocated_blocks(void);
 
 /* Update heap allocation stats */
-static void update_heap_allocation(long size) {
-  heap_allocation_size += size;
-  if (size > 0)
-    heap_allocated_blocks++;
-  else if (size < 0)
-    heap_allocated_blocks--;
-}
+void update_heap_allocation(long size);
+
+/* If E_ACSL_VERBOSE or E_ACSL_DEBUG are set, print a message if there is still
+ * some allocated memory on the heap. */
+void report_heap_leacks();
 
-static void report_heap_leaks() {
-#if defined(E_ACSL_VERBOSE) || defined(E_ACSL_DEBUG)
-  size_t size = get_heap_allocation_size();
-  size_t blocks = get_heap_allocated_blocks();
-  if (size) {
-    rtl_printf(" *** WARNING: Leaked %lu bytes of heap memory in %ld block%s\n",
-      size, blocks, (blocks == 1) ? "" : "s");
-  }
-#endif
-}
-#endif
+#endif // E_ACSL_HEAP_TRACKING
\ No newline at end of file
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_omodel_debug.h b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_omodel_debug.h
new file mode 100644
index 0000000000000000000000000000000000000000..19d8c34e4be3721bbd770c9021a4309299f41dc4
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_omodel_debug.h
@@ -0,0 +1,74 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+#ifndef E_ACSL_OMODEL_DEBUG_H
+#define E_ACSL_OMODEL_DEBUG_H
+
+#include <stdint.h>
+#include "../../internals/e_acsl_rtl_string.h"
+
+/* Assertions in debug mode */
+#ifdef E_ACSL_DEBUG
+
+/* Assert that a memory block [_addr, _addr + _size] is nullified */
+# define DVALIDATE_NULLIFIED(_addr, _size) \
+  DVASSERT(zeroed_out((void *)_addr, _size), \
+    "Block [%a, %a+%lu] not nullified", _addr, _addr, _size)
+
+/* Assert that memory block [_addr, _addr + _size] is allocated */
+# define DVALIDATE_ALLOCATED(_addr, _size, _base) \
+  private_assert(allocated((uintptr_t)_addr, _size, (uintptr_t)_base), \
+    "Operation on unallocated block [%a + %lu] with base %a\n", \
+    _addr, _size, _base);
+
+/* Assert that memory block [_addr, _addr + _size] is allocated
+ * and can be written to */
+# define DVALIDATE_WRITEABLE(_addr, _size, _base) \
+  private_assert(writeable((uintptr_t)_addr, _size, (uintptr_t)_base), \
+    "Operation on unallocated block [%a + %lu] with base %a\n", \
+    _addr, _size, _base);
+
+#else
+# define DVALIDATE_NULLIFIED(_addr, _size)
+# define DVALIDATE_ALLOCATED(_ptr, _size, _base)
+# define DVALIDATE_WRITEABLE(_ptr, _size, _base)
+#endif
+
+/*! Print to stdout the parameters of the model */
+void describe_observation_model();
+
+/*! \brief Return a non-zero value if a memory region of length `size`
+ * starting at address `addr` belongs to an allocated (tracked) memory
+ * block and a 0 otherwise.
+ *
+ * Note the third argument `base_ptr` that represents the base of a pointer,
+ * i.e., `addr` of the form `base_ptr + i`, where `i` is some integer index.
+ */
+int allocated(uintptr_t addr, long size, uintptr_t base_ptr);
+
+/** \brief Return 1 if a given memory location is read-only and 0 otherwise */
+int readonly (void *ptr);
+
+/** \brief Return 1 if a given memory location is writable and 0 otherwise */
+int writeable(uintptr_t addr, long size, uintptr_t base_ptr);
+
+#endif // E_ACSL_OMODEL_DEBUG_H
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_safe_locations.h b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.c
similarity index 69%
rename from src/plugins/e-acsl/share/e-acsl/e_acsl_safe_locations.h
rename to src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.c
index 250bef39e76389b1760eeb5de37e55780e06c49b..86d1ad4e0a63e4cc6c1b927e520a7f6877e2c4cd 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_safe_locations.h
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.c
@@ -20,31 +20,10 @@
 /*                                                                        */
 /**************************************************************************/
 
-/*! ***********************************************************************
- * \file  e_acsl_malloc.h
- *
- * \brief E-ACSL memory allocation bindings.
-***************************************************************************/
-
-/* Declaration of memory locations considered safe before a program starts.
- * Most of these should be declared somewhere in start procedures of c
- * and gcc libraries. One example of a safe location is errno. */
-
-#ifndef E_ACSL_SAFE_LOCATIONS_H
-#define E_ACSL_SAFE_LOCATIONS_H
-
 #include <stdio.h>
-#include <stdint.h>
 #include <errno.h>
 
-/* Simple representation of a safe location */
-struct memory_location {
-  uintptr_t address; /* Address */
-  uintptr_t length; /* Byte-length */
-  int is_initialized; /* Notion of initialization */
-};
-
-typedef struct memory_location memory_location;
+#include "e_acsl_safe_locations.h"
 
 /* An array storing safe locations up to `safe_location_counter` position.
  * This array should be initialized via a below function called
@@ -58,20 +37,18 @@ static int safe_location_counter = 0;
   safe_location_counter++; \
 }
 
-#ifdef errno
-#undef errno
-extern __thread int errno;
-#endif
-
-extern FILE *stdin;		  /* Standard input stream.  */
-extern FILE *stdout;		/* Standard output stream.  */
-extern FILE *stderr;		/* Standard error output stream. */
-
-static void collect_safe_locations() {
+void collect_safe_locations() {
   /* Tracking of errno and standard streams */
   add_safe_location((uintptr_t)&errno, sizeof(int), "errno");
   add_safe_location((uintptr_t)stdout, sizeof(FILE), "stdout");
   add_safe_location((uintptr_t)stderr, sizeof(FILE), "stderr");
   add_safe_location((uintptr_t)stdin, sizeof(FILE), "stdin");
 }
-#endif
+
+size_t get_safe_locations_count() {
+  return safe_location_counter;
+}
+
+memory_location * get_safe_location(size_t i) {
+  return &safe_locations[i];
+}
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.h b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.h
new file mode 100644
index 0000000000000000000000000000000000000000..fa24ba37f875a71bbdf3d110be9d8054f47d5741
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.h
@@ -0,0 +1,54 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+/*! ***********************************************************************
+ * \file
+ *
+ * Declaration of memory locations considered safe before a program starts.
+ * Most of these should be declared somewhere in start procedures of c
+ * and gcc libraries. One example of a safe location is errno.
+***************************************************************************/
+
+#ifndef E_ACSL_SAFE_LOCATIONS_H
+#define E_ACSL_SAFE_LOCATIONS_H
+
+#include <stdint.h>
+#include <stddef.h>
+
+/* Simple representation of a safe location */
+struct memory_location {
+  uintptr_t address; /* Address */
+  uintptr_t length; /* Byte-length */
+  int is_initialized; /* Notion of initialization */
+};
+typedef struct memory_location memory_location;
+
+/*! Initialize the array of safe locations */
+void collect_safe_locations();
+
+/*! \return the number of safe locations collected */
+size_t get_safe_locations_count();
+
+/*! \return The i-th safe location collected */
+memory_location * get_safe_location(size_t i);
+
+#endif // E_ACSL_SAFE_LOCATIONS_H
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_timestamp_retrieval.h b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_timestamp_retrieval.h
new file mode 100644
index 0000000000000000000000000000000000000000..209cd4952633a90ad4061cfedff8d974d30f0589
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_timestamp_retrieval.h
@@ -0,0 +1,53 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+/*! ***********************************************************************
+ * \file
+ * \brief Temporal timestamp retrieval
+***************************************************************************/
+
+#ifndef E_ACSL_TIMESTAMP_RETRIEVAL_H
+#define E_ACSL_TIMESTAMP_RETRIEVAL_H
+
+#ifdef E_ACSL_TEMPORAL
+
+#include <stdint.h>
+
+/*! \brief Return origin time stamp associated with a memory block containing
+ * address given by `ptr`. `0` indicates an invalid timestamp, i.e., timestamp
+ * of a memory block which does not exist. */
+uint32_t origin_timestamp(void *ptr);
+
+/*! \brief Return address of referent shadow */
+uintptr_t temporal_referent_shadow(void *addr);
+
+/*! \brief Return referent time stamp associated with a pointer which address
+ * is given by `ptr`. This function expects that `ptr` is allocated and at
+ * least `sizeof(uintptr_t)` bytes long */
+uint32_t referent_timestamp(void *ptr);
+
+/*! \brief Store a referent number `ref` in the shadow of `ptr` */
+void store_temporal_referent(void *ptr, uint32_t ref);
+
+#endif // E_ACSL_TEMPORAL
+
+#endif // E_ACSL_TIMESTAMP_RETRIEVAL_H
\ No newline at end of file
diff --git a/src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_segment_mmodel.c b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_observation_model.c
similarity index 87%
rename from src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_segment_mmodel.c
rename to src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_observation_model.c
index ee3a15532d6f8df38394d27fed4d7957f82ca2dd..b08cea658aaa76e0fe4d3e40c163fb830dc8569f 100644
--- a/src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_segment_mmodel.c
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_observation_model.c
@@ -21,17 +21,25 @@
 /**************************************************************************/
 
 /*! ***********************************************************************
- * \file   e_acsl_segment_mmodel.c
+ * \file
  * \brief  Implementation of E-ACSL public API for a segment (shadow) memory
  *   model. See e_acsl.h for details.
 ***************************************************************************/
 
-#include <sys/time.h>
-#include <sys/resource.h>
-#include "e_acsl_shadow_layout.h"
+#include <stddef.h>
+#include <stdint.h>
+
+#include "../../internals/e_acsl_debug.h"
+#include "../../internals/e_acsl_malloc.h"
+#include "../../internals/e_acsl_private_assert.h"
+#include "../../instrumentation_model/e_acsl_temporal.h"
+#include "../../numerical_model/e_acsl_floating_point.h"
+#include "../internals/e_acsl_safe_locations.h"
 #include "e_acsl_segment_tracking.h"
+#include "e_acsl_shadow_layout.h"
 
-#define E_ACSL_MMODEL_DESC "shadow memory"
+#include "../internals/e_acsl_timestamp_retrieval.h"
+#include "../e_acsl_observation_model.h"
 
 void * store_block(void *ptr, size_t size) {
   /* Only stack-global memory blocks are recorded explicitly via this function.
@@ -236,11 +244,12 @@ void memory_init(int *argc_ref, char *** argv_ref, size_t ptr_size) {
     /* Tracking safe locations */
     collect_safe_locations();
     int i;
-    for (i = 0; i < safe_location_counter; i++) {
-      void *addr = (void*)safe_locations[i].address;
-      uintptr_t len = safe_locations[i].length;
+    for (i = 0; i < get_safe_locations_count(); i++) {
+    memory_location * loc = get_safe_location(i);
+      void *addr = (void*)loc->address;
+      uintptr_t len = loc->length;
       shadow_alloca(addr, len);
-      if (safe_locations[i].is_initialized)
+      if (loc->is_initialized)
         initialize(addr, len);
     }
     init_infinity_values();
@@ -253,35 +262,3 @@ void memory_clean(void) {
   report_heap_leaks();
 }
 /* }}} */
-
-/* Local operations on temporal timestamps {{{ */
-/* Remaining functionality (shared between all models) is located in e_acsl_temporal.h */
-#ifdef E_ACSL_TEMPORAL
-static uintptr_t temporal_referent_shadow(void *addr) {
-  TRY_SEGMENT(addr,
-    return TEMPORAL_HEAP_SHADOW(addr),
-    return TEMPORAL_SECONDARY_STATIC_SHADOW(addr));
-  return 0;
-}
-
-static uint32_t origin_timestamp(void *ptr) {
-  TRY_SEGMENT_WEAK(ptr,
-    return heap_origin_timestamp((uintptr_t)ptr),
-    return static_origin_timestamp((uintptr_t)ptr));
-  return INVALID_TEMPORAL_TIMESTAMP;
-}
-
-static uint32_t referent_timestamp(void *ptr) {
-  TRY_SEGMENT(ptr,
-    return heap_referent_timestamp((uintptr_t)ptr),
-    return static_referent_timestamp((uintptr_t)ptr));
-  return INVALID_TEMPORAL_TIMESTAMP;
-}
-
-static void store_temporal_referent(void *ptr, uint32_t ref) {
-  TRY_SEGMENT(ptr,
-    heap_store_temporal_referent((uintptr_t)ptr, ref),
-    static_store_temporal_referent((uintptr_t)ptr,ref));
-}
-#endif
-/* }}} */
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_omodel_debug.c b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_omodel_debug.c
new file mode 100644
index 0000000000000000000000000000000000000000..9be75d5bb9e087c6eda750aed9e13e53c3fc02cd
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_omodel_debug.c
@@ -0,0 +1,53 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+#include "../../internals/e_acsl_rtl_io.h"
+#include "e_acsl_segment_tracking.h"
+#include "e_acsl_shadow_layout.h"
+
+#include "../internals/e_acsl_omodel_debug.h"
+
+#define E_ACSL_MMODEL_DESC "shadow memory"
+
+void describe_observation_model() {
+  rtl_printf(" * Memory tracking: %s\n", E_ACSL_MMODEL_DESC);
+  rtl_printf(" *   Heap  %d MB\n", E_ACSL_HEAP_SIZE);
+  rtl_printf(" *   Stack %d MB\n", E_ACSL_STACK_SIZE);
+}
+
+int allocated(uintptr_t addr, long size, uintptr_t base) {
+  TRY_SEGMENT_WEAK(addr,
+    return heap_allocated(addr, size, base),
+    return static_allocated(addr, size, base));
+  if (!IS_ON_VALID(addr))
+    return 0;
+  return 0;
+}
+
+int readonly (void *ptr) {
+  uintptr_t addr = (uintptr_t)ptr;
+  return IS_ON_GLOBAL(addr) && global_readonly(addr) ? 1 : 0;
+}
+
+int writeable(uintptr_t addr, long size, uintptr_t base_ptr) {
+  return allocated(addr, size, base_ptr) && !readonly((void*)addr);
+}
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_timestamp_retrieval.c b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_timestamp_retrieval.c
new file mode 100644
index 0000000000000000000000000000000000000000..6e4edc7b1eccee4299759ea6b636396b415255d3
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_timestamp_retrieval.c
@@ -0,0 +1,60 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+#include "e_acsl_segment_tracking.h"
+#ifdef E_ACSL_TEMPORAL
+# include "../../instrumentation_model/e_acsl_temporal_timestamp.h"
+#endif
+
+#include "../internals/e_acsl_timestamp_retrieval.h"
+
+/* Local operations on temporal timestamps {{{ */
+/* Remaining functionality (shared between all models) is located in e_acsl_temporal.h */
+#ifdef E_ACSL_TEMPORAL
+uintptr_t temporal_referent_shadow(void *addr) {
+  TRY_SEGMENT(addr,
+    return TEMPORAL_HEAP_SHADOW(addr),
+    return TEMPORAL_SECONDARY_STATIC_SHADOW(addr));
+  return 0;
+}
+
+uint32_t origin_timestamp(void *ptr) {
+  TRY_SEGMENT_WEAK(ptr,
+    return heap_origin_timestamp((uintptr_t)ptr),
+    return static_origin_timestamp((uintptr_t)ptr));
+  return INVALID_TEMPORAL_TIMESTAMP;
+}
+
+uint32_t referent_timestamp(void *ptr) {
+  TRY_SEGMENT(ptr,
+    return heap_referent_timestamp((uintptr_t)ptr),
+    return static_referent_timestamp((uintptr_t)ptr));
+  return INVALID_TEMPORAL_TIMESTAMP;
+}
+
+void store_temporal_referent(void *ptr, uint32_t ref) {
+  TRY_SEGMENT(ptr,
+    heap_store_temporal_referent((uintptr_t)ptr, ref),
+    static_store_temporal_referent((uintptr_t)ptr,ref));
+}
+#endif
+/* }}} */
diff --git a/src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_segment_tracking.h b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c
similarity index 60%
rename from src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_segment_tracking.h
rename to src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c
index d2400f592b324ad670de36b215512328d12434f9..657fc838530fa82de515404815c21805d0ba4e78 100644
--- a/src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_segment_tracking.h
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c
@@ -20,83 +20,18 @@
 /*                                                                        */
 /**************************************************************************/
 
-/*! ***********************************************************************
- * \file  e_acsl_segment_tracking.h
- * \brief Core functionality of the segment-based memory model
-***************************************************************************/
+#include <stddef.h>
+#include <stdint.h>
 
-/* Segment settings and shadow values interpretation {{{ */
+#include "../../internals/e_acsl_bits.h"
+#include "../../internals/e_acsl_rtl_string.h"
+#include "../../instrumentation_model/e_acsl_temporal_timestamp.h"
+#include "../internals/e_acsl_omodel_debug.h"
+#include "e_acsl_shadow_layout.h"
 
-/* This file implements segment-based and offset-based shadow memory models
- * (shadow encodings) (see draft of the PLDI'17 paper).
- *
- * IMPORTANT: While the implementation of the offset-based encoding mostly
- * follows the description given by the paper, there are differences in the
- * segment-based encoding for tracking heap memory. Some of these differences
- * are as follows:
- *  1) Size of a heap segment is increased to 32 bytes
- *  2) Heap meta-segments are no longer used, segment-based representation of
- *    a heap block considers only block segments, such that:
- *    - Lowest `intptr_t` bytes of each shadow segment tracking an application
- *      block store the base address of that block;
- *    - `intptr_t` bytes of the first segment following the initial `intptr_t`
- *      bytes store the length of the block. Note, the length is only stored
- *      by the first segment.
- *  3) Per-byte initialization of application bytes is tracked via a disjoint
- *    shadow region, which maps one bit of shadow memory to a byte of
- *    application memory. Comments within this file often refer to a shadow
- *    region tracking application blocks by segments as to `block shadow`,
- *    and to the region tracking initialization as to `init shadow`.
-*/
-
-/*! @brief Byte size of a heap segment.
- * This size is potentially used as an argument to `memalign`.
- * It SHOULD be a multiple of 2 and a multiple of a pointer size.
- *
- * \b FIXME: in the current implementation there might be issues with segment
- * size greater than 64 bytes. This is because presently some initialization
- * functionality relies on the fact that initialization per segment can be set
- * and/or evaluated using an 8-byte bitmask. */
-#define HEAP_SEGMENT 32
+#include "e_acsl_segment_tracking.h"
 
-/*! \brief Size (in bytes) of a long block on the stack. */
-#define LONG_BLOCK 8
-
-/*! \brief Bit offset in a primary shadow byte that represents initialization. */
-#define INIT_BIT 0
-
-/*! \brief Bit offset in a primary shadow byte that represents read-only or
- * read-write access.
- *
- * This is such that the value of 1 is read-only, and 0 is read/write */
-#define READONLY_BIT 1
-
-/*! \brief Evaluate to a non-zero value if the size of a memory
- * block indicates that it is a long one */
-#define IS_LONG_BLOCK(_size) (_size > LONG_BLOCK)
-
-/*! \brief Offset within a long block that identifies the portion of the block
- * that does not have a corresponding shadow and reuse the shadow of a previous
- * segment.
- * E.g., given a long block of 11 bytes the boundary is 8. Then, bytes [0,7] of
- * the block are shadowed (storing block offset and size) and bytes 8-10 are
- * not. This is because 3 bytes are not sufficient to store size and offset.
- * These remaining bytes reuse the shadow of [0,7]. */
-#define LONG_BLOCK_BOUNDARY(_size) (_size - _size%LONG_BLOCK)
-
-/*! \brief Primary shadow of a long block consists of a 8-byte segment + a
- * remainder. For instance, a 18-byte block is represented by two 8-byte
- * segments + 2 bytes.  Each byte of a segment stores an offset in the secondary
- * shadow. The offsets for each such segment can be expressed using the
- * following number obtained by compressing all eight bytes with offsets set
- * into a single block. */
-#define LONG_BLOCK_MASK 15913703276567643328UL
-
-/*! \brief 6 higher bytes of a memory cell on stack that belongs to a long
- * memory block store offsets relative to meta-data in the secondary shadow. The
- * offsets start with the below number. E.g., if the bits store 51, then the
- * offset at which to read meta-data is (51 - 48). */
-#define LONG_BLOCK_INDEX_START 48
+/* Segment settings and shadow values interpretation {{{ */
 
 /*! \brief  Decrease _n to be a multiple of _m */
 #define ALIGN_LEFT(_n, _m) (_n - _n%_m)
@@ -219,16 +154,7 @@ static const uint64_t static_readonly_masks [] = {
 
 /* Runtime assertions (debug mode) {{{ */
 #ifdef E_ACSL_DEBUG
-#define DVALIDATE_ALIGNMENT(_addr) \
-  DVASSERT(((uintptr_t)_addr) % HEAP_SEGMENT == 0,  \
-      "Heap base address %a is unaligned", _addr)
-
-#define DVALIDATE_MEMORY_INIT \
-  DVASSERT(mem_layout.is_initialized != 0, "Un-initialized shadow layout", NULL)
-
-/* Debug function making sure that the order of program segments is as expected
- * and that the program and the shadow segments used do not overlap. */
-static void validate_shadow_layout() {
+void validate_shadow_layout() {
   /* Check that the struct holding memory layout is marked as initialized. */
   DVALIDATE_MEMORY_INIT;
 
@@ -276,210 +202,17 @@ static void validate_shadow_layout() {
     }
   }
 }
-
-/* Assert that memory layout has been initialized and all segments appear
- * in the expected order */
-# define DVALIDATE_SHADOW_LAYOUT validate_shadow_layout()
-
-/* Assert that boundaries of a block [_addr, _addr+_size] are within a segment
- * given by `_s`. `_s` is either HEAP, STACK, TLS, GLOBAL or STATIC. */
-#define DVALIDATE_IS_ON(_addr, _size, _s) \
-  DVASSERT(IS_ON_##_s(_addr), "Address %a not on %s", _addr, #_s); \
-  DVASSERT(IS_ON_##_s(_addr+_size), "Address %a not on %s", _addr+_size, #_s)
-
-/* Assert that [_addr, _addr+_size] are within heap segment */
-#define DVALIDATE_IS_ON_HEAP(_addr, _size) \
-  DVALIDATE_IS_ON(_addr, _size, HEAP)
-/* Assert that [_addr, _addr+_size] are within stack segment */
-#define DVALIDATE_IS_ON_STACK(_addr, _size) \
-  DVALIDATE_IS_ON(_addr, _size, STACK)
-/* Assert that [_addr, _addr+_size] are within global segment */
-#define DVALIDATE_IS_ON_GLOBAL(_addr, _size) \
-  DVALIDATE_IS_ON(_addr, _size, GLOBAL)
-/* Assert that [_addr, _addr+_size] are within TLS segment */
-#define DVALIDATE_IS_ON_TLS(_addr, _size) \
-  DVALIDATE_IS_ON(_addr, _size, TLS)
-/* Assert that [_addr, _addr+_size] are within stack, global or TLS segments */
-#define DVALIDATE_IS_ON_STATIC(_addr, _size) \
-  DVALIDATE_IS_ON(_addr, _size, STATIC)
-
-/* Assert that `_addr` is on heap and it is the base address of an allocated
- * heap memory block */
-#define DVALIDATE_FREEABLE(_addr) \
-  DVASSERT(IS_ON_HEAP(_addr), "Expected heap location: %a\n", _addr); \
-  DVASSERT(_addr == _base_addr(_addr), \
-      "Expected base address, i.e., %a, not %a\n", _base_addr(_addr), _addr);
-
-/* Assert that a memory block [_addr, _addr + _size] is allocated on a
- * program's heap */
-# define DVALIDATE_HEAP_ACCESS(_addr, _size) \
-    DVASSERT(IS_ON_HEAP(_addr), "Expected heap location: %a\n", _addr); \
-    DVASSERT(heap_allocated((uintptr_t)_addr, _size, (uintptr_t)_addr), \
-       "Operation on unallocated heap block [%a + %lu]\n",  _addr, _size)
-
-/* Assert that every location belonging to the range [_addr, _addr + _size] is
- * - belongs to a tracked static region (i.e., stack, TLS or global)
- * - not allocated */
-# define DVALIDATE_HEAP_FREE(_addr, _size) { \
-  uintptr_t i, a = (uintptr_t)_addr; \
-  for (i = 0; i < _size; i++) { \
-    DVASSERT(IS_ON_HEAP(a + i), "Expected heap location: %a\n", a + i); \
-    DVASSERT(!heap_allocated(a + i, 1, a + i), \
-      "Expected heap unallocated location: [%a + %lu]\n", a, i); \
-  } \
-}
-
-/* Assert that memory block [_addr, _addr + _size] is allocated on stack, TLS
- * or globally */
-# define DVALIDATE_STATIC_ACCESS(_addr, _size) \
-    DVASSERT(IS_ON_STATIC(_addr), \
-        "Expected static location: [%a + %lu], \n", _addr, _size); \
-    DVASSERT(static_allocated((uintptr_t)_addr, _size,(uintptr_t)_addr), \
-       "Operation on unallocated static block [%a + %lu]\n", _addr, _size)
-
-/* Same as ::DVALIDATE_STATIC_LOCATION but for a single memory location */
-# define DVALIDATE_STATIC_LOCATION(_addr) \
-    DVASSERT(IS_ON_STATIC(_addr), \
-      "Expected static location: %a\n", _addr); \
-    DVASSERT(static_allocated_one((uintptr_t)_addr), \
-      "Operation on unallocated static block [%a]\n", _addr)
-
-/* Assert that every location belonging to the range [_addr, _addr + _size] is
- * - belongs to a tracked static region (i.e., stack, TLS or global)
- * - not allocated */
-# define DVALIDATE_STATIC_FREE(_addr, _size) { \
-  uintptr_t i, a = (uintptr_t)_addr; \
-  for (i = 0; i < _size; i++) { \
-    DVASSERT(IS_ON_STATIC(a + i), \
-      "Expected static location in freea: %a\n", a + i); \
-    DVASSERT(!static_allocated_one(a + i), \
-      "Expected static unallocated location in freea: [%a + %lu]\n", a, i); \
-  } \
-}
-
-/* Assert that neither of `_len - 1` addresses immediately preceding `_addr`
- * are base addresses of some other block and that `_len` addresses past
- * `_addr` are free */
-#define DVALIDATE_STATIC_SUFFICIENTLY_ALIGNED(_addr, _len) { \
-  int _i; \
-  for (_i = 0; _i < _len; _i++) { \
-    uintptr_t _prev = _addr - _i; \
-    if (static_allocated_one(_prev)) { \
-      vassert(_base_addr(_prev) != _prev, \
-        "Potential backward overlap of: \n  previous block [%a]\n" \
-        "  with allocated block [%a]\n", _prev, _addr); \
-    } \
-    uintptr_t _next = _addr + _i; \
-    vassert(!static_allocated_one(_next), \
-      "Potential forward overlap of:\n  following block location [%a]\n" \
-      "  with allocated block [%a]\n", _next, _addr); \
-  } \
-}
-
-/* Assert that a memory block [_addr, _addr + _size] is nullified */
-# define DVALIDATE_NULLIFIED(_addr, _size) \
-  DVASSERT(zeroed_out((void *)_addr, _size), \
-    "Block [%a, %a+%lu] not nullified", _addr, _addr, _size)
-
-/* Assert that memory block [_addr, _addr + _size] is allocated */
-# define DVALIDATE_ALLOCATED(_addr, _size, _base) \
-  vassert(allocated((uintptr_t)_addr, _size, (uintptr_t)_base), \
-    "Operation on unallocated block [%a + %lu] with base %a\n", \
-    _addr, _size, _base);
-
-/* Assert that memory block [_addr, _addr + _size] is allocated
- * and can be written to */
-# define DVALIDATE_WRITEABLE(_addr, _size, _base) \
-  vassert(writeable((uintptr_t)_addr, _size, (uintptr_t)_base), \
-    "Operation on unallocated block [%a + %lu] with base %a\n", \
-    _addr, _size, _base);
-#else
-/*! \cond exclude from doxygen */
-#  define DVALIDATE_MEMORY_INIT
-#  define DVALIDATE_SHADOW_LAYOUT
-#  define DVALIDATE_HEAP_ACCESS
-#  define DVALIDATE_STATIC_ACCESS
-#  define DVALIDATE_STATIC_LOCATION
-#  define DVALIDATE_ALIGNMENT
-#  define DVALIDATE_NULLIFIED
-#  define DVALIDATE_IS_ON
-#  define DVALIDATE_IS_ON_HEAP
-#  define DVALIDATE_IS_ON_STACK
-#  define DVALIDATE_IS_ON_GLOBAL
-#  define DVALIDATE_IS_ON_TLS
-#  define DVALIDATE_IS_ON_STATIC
-#  define DVALIDATE_FREEABLE
-#  define DVALIDATE_STATIC_FREE
-#  define DVALIDATE_HEAP_FREE
-#  define DVALIDATE_ALLOCATED
-#  define DVALIDATE_WRITEABLE
-#  define DVALIDATE_STATIC_SUFFICIENTLY_ALIGNED
-/*! \endcond */
 #endif
 /* }}} */
 
 /* E-ACSL predicates {{{ */
-/* See definitions for documentation */
-static void *shadow_copy(const void *ptr, size_t size, int init);
-static uintptr_t heap_info(uintptr_t addr, char type);
-static uintptr_t static_info(uintptr_t addr, char type);
-static int heap_allocated(uintptr_t addr, size_t size, uintptr_t base_ptr);
-static int static_allocated(uintptr_t addr, long size, uintptr_t base_ptr);
-static int allocated(uintptr_t addr, long size, uintptr_t base_ptr);
-static int writeable(uintptr_t addr, long size, uintptr_t base_ptr);
-static int readonly (void *ptr);
-
-/*! \brief Quick test to check if a static location belongs to allocation.
- * This macro really belongs where static_allocated is defined, but
- * since it is used across this whole file it needs to be defined here. */
-#define static_allocated_one(_addr) \
-  (*((unsigned char*)PRIMARY_SHADOW(_addr)))
-
-/*! \brief Shortcut for executing statements based on the segment a given
- * address belongs to.
- * \param intptr_t _addr - a memory address
- * \param code_block _heap_stmt - code executed if `_addr` is a heap address
- * \param code_block _static_stmt - code executed if `_addr` is a static address */
-#define TRY_SEGMENT_WEAK(_addr, _heap_stmt, _static_stmt)  \
-  if (IS_ON_HEAP(_addr)) { \
-    _heap_stmt; \
-  } else if (IS_ON_STATIC(_addr)) { \
-    _static_stmt; \
-  }
-
-/*! \brief Same as TRY_SEGMENT but performs additional checks aborting the
- * execution if the given address is `NULL` or does not belong to known
- * segments. Note that `NULL` also does not belong to any of the tracked
- * segments but it is treated separately for debugging purposes.
- *
- * The \b WEAK notion refers to the behaviour where no action is performed if
- * the given address does not belong to any of the known segments. */
-#define TRY_SEGMENT(_addr, _heap_stmt, _static_stmt) { \
-  TRY_SEGMENT_WEAK(_addr, _heap_stmt, _static_stmt) \
-  else { \
-    vassert(0, "Use of invalid address %a in %s\n", _addr, __func__); \
-  } \
-}
-
-/*! \brief Wrapper around ::heap_info and ::static_info functions that
- * dispatches one of the above functions based on the type of supplied memory
- * address (`addr`) (static, global, tls or heap). For the case when the
- * supplied address does not belong to the track segments 0 is returned.
- *
- * \param uintptr_t addr - a memory address
- * \param char p - predicate type. See ::static_info for further details. */
-static uintptr_t predicate(uintptr_t addr, char p) {
+uintptr_t predicate(uintptr_t addr, char p) {
   TRY_SEGMENT(
     addr,
     return heap_info((uintptr_t)addr, p),
     return static_info((uintptr_t)addr, p));
   return 0;
 }
-
-/*! \brief Return the byte length of the memory block containing `_addr` */
-#define _block_length(_addr) predicate((uintptr_t)_addr, 'L')
-/*! \brief Return the base address of the memory block containing `_addr` */
-#define _base_addr(_addr) predicate((uintptr_t)_addr, 'B')
 /* }}} */
 
 /* Static allocation {{{ */
@@ -508,12 +241,7 @@ static const uint64_t short_shadow_masks[] = {
   10415850140873816180UL
 };
 
-/*! \brief Record allocation of a given memory block and update shadows
- *  using offset-based encoding.
- *
- * \param ptr - pointer to a base memory address of the stack memory block.
- * \param size - size of the stack memory block. */
-static void shadow_alloca(void *ptr, size_t size) {
+void shadow_alloca(void *ptr, size_t size) {
   DVALIDATE_IS_ON_STATIC(ptr, size);
 #ifdef E_ACSL_TEMPORAL
   /* Make sure that during temporal analysis there is
@@ -576,9 +304,6 @@ static void shadow_alloca(void *ptr, size_t size) {
 /* }}} */
 
 /* Deletion of static blocks {{{ */
-
-/*! \brief Nullifies shadow regions of a memory block given by its address.
- * \param ptr - base memory address of the stack memory block. */
 void shadow_freea(void *ptr) {
   DVALIDATE_STATIC_LOCATION(ptr);
   DASSERT(ptr == (void*)_base_addr(ptr));
@@ -594,13 +319,15 @@ void shadow_freea(void *ptr) {
 
 /* Static querying {{{ */
 
-/*! \brief Return a non-zero value if a memory region of length `size`
- * starting at address `addr` belongs to a tracked stack, tls or
- * global memory block and 0 otherwise.
- * This function is only safe if applied to a tls, stack or global address.
- * Explanations regarding the third argument - `base_ptr` - are given
- * via inline documentation of function ::heap_allocated */
-static int static_allocated(uintptr_t addr, long size, uintptr_t base_ptr) {
+/*! \brief Checking whether a globally allocated memory block containing an
+ * address _addr has read-only access. Note, this is light checking that
+ * relies on the fact that a single block cannot contain read/write and
+ * read-only parts, that is to check whether the block has read-only access it
+ * is sufficient to check any of its bytes. */
+#define global_readonly(_addr) \
+  checkbit(READONLY_BIT, (*(char*)PRIMARY_GLOBAL_SHADOW(addr)))
+
+int static_allocated(uintptr_t addr, long size, uintptr_t base_ptr) {
   unsigned char *prim_shadow = (unsigned char*)PRIMARY_SHADOW(addr);
   /* Unless the address belongs to tracked allocation 0 is returned */
   if (prim_shadow[0]) {
@@ -629,10 +356,7 @@ static int static_allocated(uintptr_t addr, long size, uintptr_t base_ptr) {
   return 0;
 }
 
-/*! \brief Return a non-zero value if a statically allocated memory block
- * starting at `addr` of length `size` is fully initialized (i.e., each of
- * its cells is initialized). */
-static int static_initialized(uintptr_t addr, long size) {
+int static_initialized(uintptr_t addr, long size) {
   /* Return 0 right away if the address does not belong to
    * static allocation */
   if (!static_allocated(addr, size, addr))
@@ -654,30 +378,7 @@ static int static_initialized(uintptr_t addr, long size) {
   return result;
 }
 
-/*! \brief Checking whether a globally allocated memory block containing an
- * address _addr has read-only access. Note, this is light checking that
- * relies on the fact that a single block cannot contain read/write and
- * read-only parts, that is to check whether the block has read-only access it
- * is sufficient to check any of its bytes. */
-#define global_readonly(_addr) \
-  checkbit(READONLY_BIT, (*(char*)PRIMARY_GLOBAL_SHADOW(addr)))
-
-/*! \brief Querying information about a specific global or stack memory address
- * (based on the value of parameter `global'). The return value is interpreted
- * based on the second argument that specifies parameters of the query:
- *
- * - 'B' - return the base address of the memory block `addr` belongs to or `0`
- *     if `addr` lies outside of tracked allocation.
- * - 'O' - return the offset of `addr` within its memory block or `0`
- *     if `addr` lies outside of tracked allocation.
- * - 'L' - return the size in bytes of the memory block `addr` belongs to or `0`
- *     if `addr` lies outside of tracked allocation.
- *
- * NB: One should make sure that a given address is allocated before querying.
- * That is, for the cases when addr does not refer to an allocated memory
- * address belonging to static allocation the return value for this function is
- * unspecified. */
-static uintptr_t static_info(uintptr_t addr, char type) {
+uintptr_t static_info(uintptr_t addr, char type) {
   DVALIDATE_STATIC_LOCATION(addr);
   unsigned char *prim_shadow = (unsigned char*)PRIMARY_SHADOW(addr);
 
@@ -716,9 +417,7 @@ static uintptr_t static_info(uintptr_t addr, char type) {
 }
 
 #ifdef E_ACSL_TEMPORAL /*{{{*/
-/*! Return either an origin (if `origin` is non-zero) or referent timestamp
- *  associated with a static address `addr` */
-static uint32_t static_temporal_info(uintptr_t addr, int origin) {
+uint32_t static_temporal_info(uintptr_t addr, int origin) {
   /* NOTE: No checking for allocated blocks, since an invalid
    timestamp is zero and ununsed memory is nullified then an invalid
    timestamp is also returned for allocated memory */
@@ -737,12 +436,7 @@ static uint32_t static_temporal_info(uintptr_t addr, int origin) {
   }
 }
 
-#define static_origin_timestamp(_ptr) static_temporal_info((uintptr_t)(_ptr),1)
-#define static_referent_timestamp(_ptr) static_temporal_info((uintptr_t)(_ptr),0)
-
-/*! Store a referent time stamp associated with a static pointer.
- *  Origin timestamps are generated via `shadow_alloca` */
-static void static_store_temporal_referent(uintptr_t addr, uint32_t ref) {
+void static_store_temporal_referent(uintptr_t addr, uint32_t ref) {
   DVALIDATE_STATIC_ACCESS(addr, PTR_SZ);
   *((uint32_t*)TEMPORAL_SECONDARY_STATIC_SHADOW(addr)) = ref;
 }
@@ -750,10 +444,7 @@ static void static_store_temporal_referent(uintptr_t addr, uint32_t ref) {
 /* }}} */
 
 /* Static initialization {{{ */
-/*! \brief The following function marks n bytes starting from the address
- * given by addr as initialized. `size` equating to zero indicates that the
- * whole block should be marked as initialized.  */
-static void initialize_static_region(uintptr_t addr, long size) {
+void initialize_static_region(uintptr_t addr, long size) {
   DVALIDATE_STATIC_ACCESS(addr, size);
   DVASSERT(!(addr - _base_addr(addr) + size > _block_length(addr)),
     "Attempt to initialize %lu bytes past block boundaries\n"
@@ -793,11 +484,7 @@ static void initialize_static_region(uintptr_t addr, long size) {
 /* }}} */
 
 /* Read-only {{{ */
-/*! \brief Mark n bytes starting from the address given by `ptr` as initialized.
- * NOTE: This function has many similarities with ::initialize_static_region
- * The functionality, however is preferred to be kept separate
- * because the ::mark_readonly should operate only on the global shadow. */
-static void mark_readonly_region (uintptr_t addr, long size) {
+void mark_readonly_region (uintptr_t addr, long size) {
   /* Since read-only blocks can only be stored in the globals  segments (e.g.,
    * TEXT), this function required ptr carry a global address. */
   DASSERT(IS_ON_GLOBAL(addr));
@@ -833,7 +520,7 @@ static void set_heap_segment(void *ptr, size_t size, size_t alloc_size,
 
   /* Make sure that heap memspace has not been moved. This is likely if
      a really large chunk has been requested to be allocated. */
-  vassert(mem_spaces.heap_mspace_least ==
+  private_assert(mem_spaces.heap_mspace_least ==
     (uintptr_t)mspace_least_addr(mem_spaces.heap_mspace),
     "Exceeded heap allocation limit of %luMB -- heap memory space moved. \n",
     E_ACSL_HEAP_SIZE);
@@ -841,7 +528,7 @@ static void set_heap_segment(void *ptr, size_t size, size_t alloc_size,
   /* Similar check, make sure that allocated space does not exceed given
      allocation limit for mspace */
   uintptr_t max_addr = (uintptr_t)ptr + alloc_size;
-  vassert(mem_spaces.heap_end > max_addr,
+  private_assert(mem_spaces.heap_end > max_addr,
     "Exceeded heap allocation limit of %luMB\n", E_ACSL_HEAP_SIZE);
 
   DVALIDATE_MEMORY_INIT;
@@ -880,19 +567,6 @@ static void set_heap_segment(void *ptr, size_t size, size_t alloc_size,
   }
 }
 
-extern int MSPACES_INIT;
-/*! \brief Replacement for a malloc function that additionally tracks the
- * allocated memory block.
- *
- * NOTE: This malloc returns a `NULL` pointer if the requested size is `0`.
- * Such behaviour is compliant with the C99 standard, however it differs from
- * the behaviour of the GLIBC malloc, which returns a zero-size block instead.
- * The standard indicates that a return value for a zero-sized allocation
- * is implementation specific:
- *    "If the size of the space requested is zero, the behaviour is
- *    implementation-defined: either a null pointer is returned, or the
- *    behaviour is as if the size were some non-zero value, except that the
- *    returned pointer shall not be used to access an object." */
 void* malloc(size_t size) {
 
   size_t alloc_size = ALLOC_SIZE(size);
@@ -913,7 +587,6 @@ void* malloc(size_t size) {
   return res;
 }
 
-/*! \brief  Replacement for `calloc` that enables memory tracking */
 void* calloc(size_t nmemb, size_t size) {
   /* Since both `nmemb` and `size` are both of size `size_t` the multiplication
    * of the arguments (which gives the actual allocation size) might lead to an
@@ -940,12 +613,9 @@ void* calloc(size_t nmemb, size_t size) {
   return res;
 }
 
-/** \brief Return shadowed copy of a memory chunk on a program's heap using.
- * If `init` parameter is set to a non-zero value the memory occupied by the
- * resulting block is set to be initialized and uninitialized otherwise. */
-static void *shadow_copy(const void *ptr, size_t size, int init) {
+void *shadow_copy(const void *ptr, size_t size, int init) {
   char *ret = (init) ?	calloc(1, size) : malloc(size);
-  vassert(ret != NULL, "Shadow copy failed\n", NULL);
+  private_assert(ret != NULL, "Shadow copy failed\n", NULL);
   /* Shadow copy is internal, therefore heap status should not be updated.
      Since it is set via `set_heap_segment`, it needs to be reverted back. */
   update_heap_allocation(-size);
@@ -991,12 +661,11 @@ static void unset_heap_segment(void *ptr, int init, const char *function) {
   }
 }
 
-/*! \brief Replacement for `free` with memory tracking  */
 void free(void *ptr) {
   if (ptr == NULL) {
 /* Fail if instructed to treat NULL input to free as invalid. */
 #ifdef E_ACSL_FREE_VALID_ADDRESS
-    vabort("NULL pointer in free\n");
+    private_abort("NULL pointer in free\n");
 #endif
     return;
   }
@@ -1006,7 +675,7 @@ void free(void *ptr) {
       unset_heap_segment(ptr, 1, "free");
       public_free(ptr);
     } else {
-      vabort("Not a start of block (%a) in free\n", ptr);
+      private_abort("Not a start of block (%a) in free\n", ptr);
     }
   }
 }
@@ -1065,7 +734,7 @@ void* realloc(void *ptr, size_t size) {
         }
       }
     } else {
-      vabort("Not a start of block (%a) in realloc\n", ptr);
+      private_abort("Not a start of block (%a) in realloc\n", ptr);
     }
   }
   return res;
@@ -1073,13 +742,12 @@ void* realloc(void *ptr, size_t size) {
 /* }}} */
 
 /* Heap aligned allocation (aligned_alloc) {{{ */
-/*! \brief Replacement for `aligned_alloc` with memory tracking */
 void *aligned_alloc(size_t alignment, size_t size) {
   /* Check if:
    *  - size and alignment are greater than zero
    *  - alignment is a power of 2
    *  - size is a multiple of alignment */
-  if (!size || !alignment || !powof2(alignment) || (size%alignment))
+  if (!size || !alignment || !is_pow_of_2(alignment) || (size%alignment))
     return NULL;
 
   char *res = public_aligned_alloc(alignment, size);
@@ -1093,16 +761,15 @@ void *aligned_alloc(size_t alignment, size_t size) {
 /* }}} */
 
 /* Heap aligned allocation (posix_memalign) {{{ */
-/*! \brief Replacement for `posix_memalign` with memory tracking */
 int posix_memalign(void **memptr, size_t alignment, size_t size) {
  /* Check if:
    *  - size and alignment are greater than zero
    *  - alignment is a power of 2 and a multiple of sizeof(void*) */
-  if (!size || !alignment || !powof2(alignment) || alignment%sizeof(void*))
+  if (!size || !alignment || !is_pow_of_2(alignment) || alignment%sizeof(void*))
     return -1;
 
   /* Make sure that the first argument to posix memalign is indeed allocated */
-  vassert(allocated((uintptr_t)memptr, sizeof(void*), (uintptr_t)memptr),
+  private_assert(allocated((uintptr_t)memptr, sizeof(void*), (uintptr_t)memptr),
       "\\invalid memptr in  posix_memalign", NULL);
 
   int res = public_posix_memalign(memptr, alignment, size);
@@ -1114,23 +781,7 @@ int posix_memalign(void **memptr, size_t alignment, size_t size) {
 /* }}} */
 
 /* Heap querying {{{ */
-/*! \brief Return a non-zero value if a memory region of length `size`
- * starting at address `addr` belongs to an allocated (tracked) heap memory
- * block and a 0 otherwise. Note, this function is only safe if applied to a
- * heap address.
- *
- * Note the third argument `base_ptr` that represents the base of a pointer, i.e.,
- * `addr` of the form `base_ptr + i`, where `i` is some integer index.
- * ::heap_allocated also returns zero if `base_ptr` and `addr` belong to different
- * memory blocks, or if `base_ptr` lies within unallocated region. The intention
- * here is to be able to detect dereferencing of an allocated memory block through
- * a pointer to a different block. Consider, for instance, some pointer `p` that
- * points to a memory block `B`, and an index `i`, such that `p+i` references a
- * memory location belonging to a different memory block (say `C`). From a
- * low-level viewpoint, dereferencing `p+i` is safe (since it belongs to a properly
- * allocated block). From our perspective, however, dereference of `p+i` is
- * only legal if both `p` and `p+i` point to the same block. */
-static int heap_allocated(uintptr_t addr, size_t size, uintptr_t base_ptr) {
+int heap_allocated(uintptr_t addr, size_t size, uintptr_t base_ptr) {
   /* Base address of the shadow segment the address belongs to */
   uintptr_t *shadow = (uintptr_t*)HEAP_SHADOW(addr - addr%HEAP_SEGMENT);
 
@@ -1159,12 +810,6 @@ static int heap_allocated(uintptr_t addr, size_t size, uintptr_t base_ptr) {
   return 0;
 }
 
-/*! \brief  Return a non-zero value if a given address is a base address of a
- * heap-allocated memory block that `addr` belongs to.
- *
- * As some of the other functions, \b \\freeable can be expressed using
- * ::IS_ON_HEAP, ::heap_allocated and ::_base_addr. Here direct
- * implementation is preferred for performance reasons. */
 int freeable(void *ptr) { /* + */
   uintptr_t addr = (uintptr_t)ptr;
   /* Address is not on the program's heap, so cannot be freed */
@@ -1182,11 +827,7 @@ int freeable(void *ptr) { /* + */
   return 0;
 }
 
-/*! \brief Querying information about a specific heap memory address.
- * This function is similar to ::static_info except it returns data
- * associated with dynamically allocated memory.
- * See in-line documentation for ::static_info for further details. */
-static uintptr_t heap_info(uintptr_t addr, char type) {
+uintptr_t heap_info(uintptr_t addr, char type) {
   /* Ensure that `addr` is an allocated location on a program's heap */
   DVALIDATE_HEAP_ACCESS(addr, 1);
   /* Base address of the shadow segment the address belongs to.
@@ -1214,10 +855,7 @@ static uintptr_t heap_info(uintptr_t addr, char type) {
   return 0;
 }
 
-/*! \brief Implementation of the \b \\initialized predicate for heap-allocated
- * memory. NB: If `addr` does not belong to an allocated heap block this
- * function returns 0. */
-static int heap_initialized(uintptr_t addr, long len) {
+int heap_initialized(uintptr_t addr, long len) {
   /* Base address of a shadow segment addr belongs to */
   unsigned char *shadow = (unsigned char*)(HEAP_INIT_SHADOW(addr));
 
@@ -1238,12 +876,11 @@ static int heap_initialized(uintptr_t addr, long len) {
     return checkbits(len, shadow);
   return 1;
 }
-
 /* }}} */
 
 /* Heap temporal querying {{{*/
 #ifdef E_ACSL_TEMPORAL
-static uint32_t heap_temporal_info(uintptr_t addr, int origin) {
+uint32_t heap_temporal_info(uintptr_t addr, int origin) {
   /* NOTE: No checking for allocated blocks, since an invalid
      timestamp is zero and unused memory is nullified then an invalid
      timestamp is also returned for allocated memory */
@@ -1256,10 +893,7 @@ static uint32_t heap_temporal_info(uintptr_t addr, int origin) {
   }
 }
 
-#define heap_origin_timestamp(_ptr)   heap_temporal_info((uintptr_t)(_ptr),1)
-#define heap_referent_timestamp(_ptr) heap_temporal_info((uintptr_t)(_ptr),0)
-
-static void heap_store_temporal_referent(uintptr_t addr, uint32_t ref) {
+void heap_store_temporal_referent(uintptr_t addr, uint32_t ref) {
   DVALIDATE_HEAP_ACCESS(addr, PTR_SZ);
   uint32_t *temporal_shadow = (uint32_t*)TEMPORAL_HEAP_SHADOW(addr);
   *temporal_shadow = ref;
@@ -1267,8 +901,7 @@ static void heap_store_temporal_referent(uintptr_t addr, uint32_t ref) {
 #endif/*}}} E_ACSL_TEMPORAL*/
 
 /* Heap initialization {{{ */
-/*! \brief Mark n bytes on the heap starting from address addr as initialized */
-static void initialize_heap_region(uintptr_t addr, long len) {
+void initialize_heap_region(uintptr_t addr, long len) {
   DVALIDATE_HEAP_ACCESS(addr, len);
   DVASSERT(!(addr - _base_addr(addr) + len > _block_length(addr)),
     "Attempt to initialize %lu bytes past block boundaries\n"
@@ -1304,33 +937,9 @@ static void initialize_heap_region(uintptr_t addr, long len) {
 }
 /* }}} */
 
-/* Any allocation {{{ */
-/*! \brief Amalgamation of ::heap_allocated and ::static_allocated */
-static int allocated(uintptr_t addr, long size, uintptr_t base) {
-  TRY_SEGMENT_WEAK(addr,
-    return heap_allocated(addr, size, base),
-    return static_allocated(addr, size, base));
-  if (!IS_ON_VALID(addr))
-    return 0;
-  return 0;
-}
-
-/** \brief Return 1 if a given memory location is read-only and 0 otherwise */
-static inline int readonly (void *ptr) {
-  uintptr_t addr = (uintptr_t)ptr;
-  return IS_ON_GLOBAL(addr) && global_readonly(addr) ? 1 : 0;
-}
-
-static inline int writeable(uintptr_t addr, long size, uintptr_t base_ptr) {
-  return allocated(addr, size, base_ptr) && !readonly((void*)addr);
-}
-/* }}} */
-
 /* Internal state print (debug mode) {{{ */
 #ifdef E_ACSL_DEBUG
-/* ! \brief Print human-readable representation of a byte in a primary
- * shadow */
-static void printbyte(unsigned char c, char buf[]) {
+void printbyte(unsigned char c, char buf[]) {
   if (c >> 2 < LONG_BLOCK_INDEX_START) {
     rtl_sprintf(buf, "PRIMARY: I{%u} RO{%u} OF{%2u} => %u[%u]",
       checkbit(INIT_BIT,c), checkbit(READONLY_BIT,c), c >> 2,
@@ -1342,9 +951,7 @@ static void printbyte(unsigned char c, char buf[]) {
   }
 }
 
-/*! \brief Print human-readable (well, ish) representation of a memory block
- * using primary and secondary shadows. */
-static void print_static_shadows(uintptr_t addr, size_t size) {
+void print_static_shadows(uintptr_t addr, size_t size) {
   char prim_buf[256];
   char sec_buf[256];
 
@@ -1376,10 +983,7 @@ static void print_static_shadows(uintptr_t addr, size_t size) {
 #endif /*}}} E_ACSL_TEMPORAL*/
 }
 
-/*! \brief Print human-readable representation of a heap shadow region for a
- * memory block of length `size` starting at address `addr`. This function
- * assumes that `addr` is the base address of the memory block. */
-static void print_heap_shadows(uintptr_t addr) {
+void print_heap_shadows(uintptr_t addr) {
   unsigned char *block_shadow = (unsigned char*)HEAP_SHADOW(addr);
   unsigned char *init_shadow =  (unsigned char*)HEAP_INIT_SHADOW(addr);
 
@@ -1418,21 +1022,21 @@ static void print_heap_shadows(uintptr_t addr) {
   DLOG("\n");
 }
 
-static void print_shadows(uintptr_t addr, size_t size) {
+void print_shadows(uintptr_t addr, size_t size) {
   if (IS_ON_STATIC(addr))
     print_static_shadows(addr, size);
   else if (IS_ON_HEAP(addr))
     print_heap_shadows(addr);
 }
 
-static void print_memory_segment(struct memory_segment *p, char *lab, int off) {
+void print_memory_segment(struct memory_segment *p, char *lab, int off) {
   DLOG("   %s: %lu MB [%lu, %lu]", lab, MB_SZ(p->size), p->start, p->end);
   if (off)
     DLOG("{ Offset: %ld }", p->shadow_offset);
   DLOG("\n");
 }
 
-static void print_memory_partition(struct memory_partition *p) {
+void print_memory_partition(struct memory_partition *p) {
   print_memory_segment(&p->application, "Application", 0);
   print_memory_segment(&p->primary, "Primary    ", 1);
   print_memory_segment(&p->secondary, "Secondary  ", 1);
@@ -1442,7 +1046,7 @@ static void print_memory_partition(struct memory_partition *p) {
 #endif
 }
 
-static void print_shadow_layout() {
+void print_shadow_layout() {
   DLOG(">>> HEAP ---------------------\n");
   print_memory_partition(&mem_layout.heap);
   DLOG(">>> STACK --------------------\n");
@@ -1454,8 +1058,7 @@ static void print_shadow_layout() {
   DLOG(">>> --------------------------\n");
 }
 
-/*! \brief Output the shadow segment the address belongs to */
-static const char* which_segment(uintptr_t addr) {
+const char* which_segment(uintptr_t addr) {
   const char *loc = NULL;
   if (IS_ON_STACK(addr))
     loc = "stack";
@@ -1469,36 +1072,5 @@ static const char* which_segment(uintptr_t addr) {
     loc = "untracked";
   return loc;
 }
-
-/* NOTE: Above functions are designed to be used only through the following
- * macros or debug functions included/defined based on the value of the
- * E_ACSL_DEBUG macro. */
-
-/*! \brief Print program layout. This function outputs start/end addresses of
- * various program segments, their shadow counterparts and sizes of shadow
- * regions used. */
-#define DEBUG_PRINT_LAYOUT print_shadow_layout()
-void ___e_acsl_debug_print_layout() { DEBUG_PRINT_LAYOUT; }
-
-/*! \brief Print the shadow segment address addr belongs to */
-#define DEBUG_PRINT_SEGMENT(_addr) which_segment(_addr)
-void ___e_acsl_debug_print_segment(uintptr_t addr) { DEBUG_PRINT_SEGMENT(addr); }
-
-/*! \brief Print human-readable representation of a shadow region corresponding
- * to a memory address addr. The second argument (size) if the size of the
- * shadow region to be printed. Normally addr argument is a base address of a
- * memory block and size is its length. */
-#define DEBUG_PRINT_SHADOW(addr, size) \
-  print_shadows((uintptr_t)addr, (size_t)size)
-void ___e_acsl_debug_print_shadow(uintptr_t addr, size_t size) {
-  DEBUG_PRINT_SHADOW(addr, size);
-}
-
-#else
-/* \cond exclude from doxygen */
-#define DEBUG_PRINT_SHADOW(addr, size)
-#define DEBUG_PRINT_LAYOUT
-#define DEBUG_PRINT_SEGMENT(addr)
-/* \endcond */
 #endif
 /* }}} */
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.h b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.h
new file mode 100644
index 0000000000000000000000000000000000000000..828938c53a645956c5e0731cab2b3b7a9589985d
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.h
@@ -0,0 +1,492 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+/*! ***********************************************************************
+ * \file  e_acsl_segment_tracking.h
+ * \brief Core functionality of the segment-based memory model
+***************************************************************************/
+
+#ifndef E_ACSL_SEGMENT_TRACKING_H
+#define E_ACSL_SEGMENT_TRACKING_H
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "e_acsl_shadow_layout.h"
+
+/* Segment settings and shadow values interpretation {{{ */
+
+/* This file implements segment-based and offset-based shadow memory models
+ * (shadow encodings) (see draft of the PLDI'17 paper).
+ *
+ * IMPORTANT: While the implementation of the offset-based encoding mostly
+ * follows the description given by the paper, there are differences in the
+ * segment-based encoding for tracking heap memory. Some of these differences
+ * are as follows:
+ *  1) Size of a heap segment is increased to 32 bytes
+ *  2) Heap meta-segments are no longer used, segment-based representation of
+ *    a heap block considers only block segments, such that:
+ *    - Lowest `intptr_t` bytes of each shadow segment tracking an application
+ *      block store the base address of that block;
+ *    - `intptr_t` bytes of the first segment following the initial `intptr_t`
+ *      bytes store the length of the block. Note, the length is only stored
+ *      by the first segment.
+ *  3) Per-byte initialization of application bytes is tracked via a disjoint
+ *    shadow region, which maps one bit of shadow memory to a byte of
+ *    application memory. Comments within this file often refer to a shadow
+ *    region tracking application blocks by segments as to `block shadow`,
+ *    and to the region tracking initialization as to `init shadow`.
+*/
+
+/*! @brief Byte size of a heap segment.
+ * This size is potentially used as an argument to `memalign`.
+ * It SHOULD be a multiple of 2 and a multiple of a pointer size.
+ *
+ * \b FIXME: in the current implementation there might be issues with segment
+ * size greater than 64 bytes. This is because presently some initialization
+ * functionality relies on the fact that initialization per segment can be set
+ * and/or evaluated using an 8-byte bitmask. */
+#define HEAP_SEGMENT 32
+
+/*! \brief Size (in bytes) of a long block on the stack. */
+#define LONG_BLOCK 8
+
+/*! \brief Bit offset in a primary shadow byte that represents initialization. */
+#define INIT_BIT 0
+
+/*! \brief Bit offset in a primary shadow byte that represents read-only or
+ * read-write access.
+ *
+ * This is such that the value of 1 is read-only, and 0 is read/write */
+#define READONLY_BIT 1
+
+/*! \brief Evaluate to a non-zero value if the size of a memory
+ * block indicates that it is a long one */
+#define IS_LONG_BLOCK(_size) (_size > LONG_BLOCK)
+
+/*! \brief Offset within a long block that identifies the portion of the block
+ * that does not have a corresponding shadow and reuse the shadow of a previous
+ * segment.
+ * E.g., given a long block of 11 bytes the boundary is 8. Then, bytes [0,7] of
+ * the block are shadowed (storing block offset and size) and bytes 8-10 are
+ * not. This is because 3 bytes are not sufficient to store size and offset.
+ * These remaining bytes reuse the shadow of [0,7]. */
+#define LONG_BLOCK_BOUNDARY(_size) (_size - _size%LONG_BLOCK)
+
+/*! \brief Primary shadow of a long block consists of a 8-byte segment + a
+ * remainder. For instance, a 18-byte block is represented by two 8-byte
+ * segments + 2 bytes.  Each byte of a segment stores an offset in the secondary
+ * shadow. The offsets for each such segment can be expressed using the
+ * following number obtained by compressing all eight bytes with offsets set
+ * into a single block. */
+#define LONG_BLOCK_MASK 15913703276567643328UL
+
+/*! \brief 6 higher bytes of a memory cell on stack that belongs to a long
+ * memory block store offsets relative to meta-data in the secondary shadow. The
+ * offsets start with the below number. E.g., if the bits store 51, then the
+ * offset at which to read meta-data is (51 - 48). */
+#define LONG_BLOCK_INDEX_START 48
+
+/* }}} */
+
+/* Runtime assertions (debug mode) {{{ */
+#ifdef E_ACSL_DEBUG
+#define DVALIDATE_ALIGNMENT(_addr) \
+  DVASSERT(((uintptr_t)_addr) % HEAP_SEGMENT == 0,  \
+      "Heap base address %a is unaligned", _addr)
+
+#define DVALIDATE_MEMORY_INIT \
+  DVASSERT(mem_layout.is_initialized != 0, "Un-initialized shadow layout", NULL)
+
+/* Debug function making sure that the order of program segments is as expected
+ * and that the program and the shadow segments used do not overlap. */
+void validate_shadow_layout();
+
+/* Assert that memory layout has been initialized and all segments appear
+ * in the expected order */
+# define DVALIDATE_SHADOW_LAYOUT validate_shadow_layout()
+
+/* Assert that boundaries of a block [_addr, _addr+_size] are within a segment
+ * given by `_s`. `_s` is either HEAP, STACK, TLS, GLOBAL or STATIC. */
+#define DVALIDATE_IS_ON(_addr, _size, _s) \
+  DVASSERT(IS_ON_##_s(_addr), "Address %a not on %s", _addr, #_s); \
+  DVASSERT(IS_ON_##_s(_addr+_size), "Address %a not on %s", _addr+_size, #_s)
+
+/* Assert that [_addr, _addr+_size] are within heap segment */
+#define DVALIDATE_IS_ON_HEAP(_addr, _size) \
+  DVALIDATE_IS_ON(_addr, _size, HEAP)
+/* Assert that [_addr, _addr+_size] are within stack segment */
+#define DVALIDATE_IS_ON_STACK(_addr, _size) \
+  DVALIDATE_IS_ON(_addr, _size, STACK)
+/* Assert that [_addr, _addr+_size] are within global segment */
+#define DVALIDATE_IS_ON_GLOBAL(_addr, _size) \
+  DVALIDATE_IS_ON(_addr, _size, GLOBAL)
+/* Assert that [_addr, _addr+_size] are within TLS segment */
+#define DVALIDATE_IS_ON_TLS(_addr, _size) \
+  DVALIDATE_IS_ON(_addr, _size, TLS)
+/* Assert that [_addr, _addr+_size] are within stack, global or TLS segments */
+#define DVALIDATE_IS_ON_STATIC(_addr, _size) \
+  DVALIDATE_IS_ON(_addr, _size, STATIC)
+
+/* Assert that `_addr` is on heap and it is the base address of an allocated
+ * heap memory block */
+#define DVALIDATE_FREEABLE(_addr) \
+  DVASSERT(IS_ON_HEAP(_addr), "Expected heap location: %a\n", _addr); \
+  DVASSERT(_addr == _base_addr(_addr), \
+      "Expected base address, i.e., %a, not %a\n", _base_addr(_addr), _addr);
+
+/* Assert that a memory block [_addr, _addr + _size] is allocated on a
+ * program's heap */
+# define DVALIDATE_HEAP_ACCESS(_addr, _size) \
+    DVASSERT(IS_ON_HEAP(_addr), "Expected heap location: %a\n", _addr); \
+    DVASSERT(heap_allocated((uintptr_t)_addr, _size, (uintptr_t)_addr), \
+       "Operation on unallocated heap block [%a + %lu]\n",  _addr, _size)
+
+/* Assert that every location belonging to the range [_addr, _addr + _size] is
+ * - belongs to a tracked static region (i.e., stack, TLS or global)
+ * - not allocated */
+# define DVALIDATE_HEAP_FREE(_addr, _size) { \
+  uintptr_t i, a = (uintptr_t)_addr; \
+  for (i = 0; i < _size; i++) { \
+    DVASSERT(IS_ON_HEAP(a + i), "Expected heap location: %a\n", a + i); \
+    DVASSERT(!heap_allocated(a + i, 1, a + i), \
+      "Expected heap unallocated location: [%a + %lu]\n", a, i); \
+  } \
+}
+
+/* Assert that memory block [_addr, _addr + _size] is allocated on stack, TLS
+ * or globally */
+# define DVALIDATE_STATIC_ACCESS(_addr, _size) \
+    DVASSERT(IS_ON_STATIC(_addr), \
+        "Expected static location: [%a + %lu], \n", _addr, _size); \
+    DVASSERT(static_allocated((uintptr_t)_addr, _size,(uintptr_t)_addr), \
+       "Operation on unallocated static block [%a + %lu]\n", _addr, _size)
+
+/* Same as ::DVALIDATE_STATIC_LOCATION but for a single memory location */
+# define DVALIDATE_STATIC_LOCATION(_addr) \
+    DVASSERT(IS_ON_STATIC(_addr), \
+      "Expected static location: %a\n", _addr); \
+    DVASSERT(static_allocated_one((uintptr_t)_addr), \
+      "Operation on unallocated static block [%a]\n", _addr)
+
+/* Assert that every location belonging to the range [_addr, _addr + _size] is
+ * - belongs to a tracked static region (i.e., stack, TLS or global)
+ * - not allocated */
+# define DVALIDATE_STATIC_FREE(_addr, _size) { \
+  uintptr_t i, a = (uintptr_t)_addr; \
+  for (i = 0; i < _size; i++) { \
+    DVASSERT(IS_ON_STATIC(a + i), \
+      "Expected static location in freea: %a\n", a + i); \
+    DVASSERT(!static_allocated_one(a + i), \
+      "Expected static unallocated location in freea: [%a + %lu]\n", a, i); \
+  } \
+}
+
+/* Assert that neither of `_len - 1` addresses immediately preceding `_addr`
+ * are base addresses of some other block and that `_len` addresses past
+ * `_addr` are free */
+#define DVALIDATE_STATIC_SUFFICIENTLY_ALIGNED(_addr, _len) { \
+  int _i; \
+  for (_i = 0; _i < _len; _i++) { \
+    uintptr_t _prev = _addr - _i; \
+    if (static_allocated_one(_prev)) { \
+      private_assert(_base_addr(_prev) != _prev, \
+        "Potential backward overlap of: \n  previous block [%a]\n" \
+        "  with allocated block [%a]\n", _prev, _addr); \
+    } \
+    uintptr_t _next = _addr + _i; \
+    private_assert(!static_allocated_one(_next), \
+      "Potential forward overlap of:\n  following block location [%a]\n" \
+      "  with allocated block [%a]\n", _next, _addr); \
+  } \
+}
+
+#else
+/*! \cond exclude from doxygen */
+#  define DVALIDATE_MEMORY_INIT
+#  define DVALIDATE_SHADOW_LAYOUT
+#  define DVALIDATE_HEAP_ACCESS
+#  define DVALIDATE_STATIC_ACCESS
+#  define DVALIDATE_STATIC_LOCATION
+#  define DVALIDATE_ALIGNMENT
+#  define DVALIDATE_IS_ON
+#  define DVALIDATE_IS_ON_HEAP
+#  define DVALIDATE_IS_ON_STACK
+#  define DVALIDATE_IS_ON_GLOBAL
+#  define DVALIDATE_IS_ON_TLS
+#  define DVALIDATE_IS_ON_STATIC
+#  define DVALIDATE_FREEABLE
+#  define DVALIDATE_STATIC_FREE
+#  define DVALIDATE_HEAP_FREE
+#  define DVALIDATE_STATIC_SUFFICIENTLY_ALIGNED
+/*! \endcond */
+#endif
+/* }}} */
+
+/* E-ACSL predicates {{{ */
+
+/*! \brief Quick test to check if a static location belongs to allocation.
+ * This macro really belongs where static_allocated is defined, but
+ * since it is used across this whole file it needs to be defined here. */
+#define static_allocated_one(_addr) \
+  (*((unsigned char*)PRIMARY_SHADOW(_addr)))
+
+/*! \brief Shortcut for executing statements based on the segment a given
+ * address belongs to.
+ * \param intptr_t _addr - a memory address
+ * \param code_block _heap_stmt - code executed if `_addr` is a heap address
+ * \param code_block _static_stmt - code executed if `_addr` is a static address */
+#define TRY_SEGMENT_WEAK(_addr, _heap_stmt, _static_stmt)  \
+  if (IS_ON_HEAP(_addr)) { \
+    _heap_stmt; \
+  } else if (IS_ON_STATIC(_addr)) { \
+    _static_stmt; \
+  }
+
+/*! \brief Same as TRY_SEGMENT but performs additional checks aborting the
+ * execution if the given address is `NULL` or does not belong to known
+ * segments. Note that `NULL` also does not belong to any of the tracked
+ * segments but it is treated separately for debugging purposes.
+ *
+ * The \b WEAK notion refers to the behaviour where no action is performed if
+ * the given address does not belong to any of the known segments. */
+#define TRY_SEGMENT(_addr, _heap_stmt, _static_stmt) { \
+  TRY_SEGMENT_WEAK(_addr, _heap_stmt, _static_stmt) \
+  else { \
+    private_assert(0, "Use of invalid address %a in %s\n", _addr, __func__); \
+  } \
+}
+
+/*! \brief Wrapper around ::heap_info and ::static_info functions that
+ * dispatches one of the above functions based on the type of supplied memory
+ * address (`addr`) (static, global, tls or heap). For the case when the
+ * supplied address does not belong to the track segments 0 is returned.
+ *
+ * \param uintptr_t addr - a memory address
+ * \param char p - predicate type. See ::static_info for further details. */
+uintptr_t predicate(uintptr_t addr, char p);
+
+/*! \brief Return the byte length of the memory block containing `_addr` */
+#define _block_length(_addr) predicate((uintptr_t)_addr, 'L')
+/*! \brief Return the base address of the memory block containing `_addr` */
+#define _base_addr(_addr) predicate((uintptr_t)_addr, 'B')
+/* }}} */
+
+/* Static allocation {{{ */
+/*! \brief Record allocation of a given memory block and update shadows
+ *  using offset-based encoding.
+ *
+ * \param ptr - pointer to a base memory address of the stack memory block.
+ * \param size - size of the stack memory block. */
+void shadow_alloca(void *ptr, size_t size);
+/* }}} */
+
+/* Deletion of static blocks {{{ */
+
+/*! \brief Nullifies shadow regions of a memory block given by its address.
+ * \param ptr - base memory address of the stack memory block. */
+void shadow_freea(void *ptr);
+/* }}} */
+
+/* Static querying {{{ */
+
+/*! \brief Return a non-zero value if a memory region of length `size`
+ * starting at address `addr` belongs to a tracked stack, tls or
+ * global memory block and 0 otherwise.
+ * This function is only safe if applied to a tls, stack or global address.
+ * Explanations regarding the third argument - `base_ptr` - are given
+ * via inline documentation of function ::heap_allocated */
+int static_allocated(uintptr_t addr, long size, uintptr_t base_ptr);
+
+/*! \brief Return a non-zero value if a statically allocated memory block
+ * starting at `addr` of length `size` is fully initialized (i.e., each of
+ * its cells is initialized). */
+int static_initialized(uintptr_t addr, long size);
+
+/*! \brief Querying information about a specific global or stack memory address
+ * (based on the value of parameter `global'). The return value is interpreted
+ * based on the second argument that specifies parameters of the query:
+ *
+ * - 'B' - return the base address of the memory block `addr` belongs to or `0`
+ *     if `addr` lies outside of tracked allocation.
+ * - 'O' - return the offset of `addr` within its memory block or `0`
+ *     if `addr` lies outside of tracked allocation.
+ * - 'L' - return the size in bytes of the memory block `addr` belongs to or `0`
+ *     if `addr` lies outside of tracked allocation.
+ *
+ * NB: One should make sure that a given address is allocated before querying.
+ * That is, for the cases when addr does not refer to an allocated memory
+ * address belonging to static allocation the return value for this function is
+ * unspecified. */
+uintptr_t static_info(uintptr_t addr, char type);
+
+#ifdef E_ACSL_TEMPORAL /*{{{*/
+/*! Return either an origin (if `origin` is non-zero) or referent timestamp
+ *  associated with a static address `addr` */
+uint32_t static_temporal_info(uintptr_t addr, int origin);
+
+#define static_origin_timestamp(_ptr) static_temporal_info((uintptr_t)(_ptr),1)
+#define static_referent_timestamp(_ptr) static_temporal_info((uintptr_t)(_ptr),0)
+
+/*! Store a referent time stamp associated with a static pointer.
+ *  Origin timestamps are generated via `shadow_alloca` */
+void static_store_temporal_referent(uintptr_t addr, uint32_t ref);
+#endif/*}}} E_ACSL_TEMPORAL*/
+/* }}} */
+
+/* Static initialization {{{ */
+/*! \brief The following function marks n bytes starting from the address
+ * given by addr as initialized. `size` equating to zero indicates that the
+ * whole block should be marked as initialized.  */
+void initialize_static_region(uintptr_t addr, long size);
+/* }}} */
+
+/* Read-only {{{ */
+/*! \brief Mark n bytes starting from the address given by `ptr` as initialized.
+ * NOTE: This function has many similarities with ::initialize_static_region
+ * The functionality, however is preferred to be kept separate
+ * because the ::mark_readonly should operate only on the global shadow. */
+void mark_readonly_region (uintptr_t addr, long size);
+/* }}} */
+
+/* Heap allocation {{{ (malloc/calloc) */
+/** \brief Return shadowed copy of a memory chunk on a program's heap using.
+ * If `init` parameter is set to a non-zero value the memory occupied by the
+ * resulting block is set to be initialized and uninitialized otherwise. */
+void *shadow_copy(const void *ptr, size_t size, int init);
+/* }}} */
+
+/* Heap querying {{{ */
+/*! \brief Return a non-zero value if a memory region of length `size`
+ * starting at address `addr` belongs to an allocated (tracked) heap memory
+ * block and a 0 otherwise. Note, this function is only safe if applied to a
+ * heap address.
+ *
+ * Note the third argument `base_ptr` that represents the base of a pointer, i.e.,
+ * `addr` of the form `base_ptr + i`, where `i` is some integer index.
+ * ::heap_allocated also returns zero if `base_ptr` and `addr` belong to different
+ * memory blocks, or if `base_ptr` lies within unallocated region. The intention
+ * here is to be able to detect dereferencing of an allocated memory block through
+ * a pointer to a different block. Consider, for instance, some pointer `p` that
+ * points to a memory block `B`, and an index `i`, such that `p+i` references a
+ * memory location belonging to a different memory block (say `C`). From a
+ * low-level viewpoint, dereferencing `p+i` is safe (since it belongs to a properly
+ * allocated block). From our perspective, however, dereference of `p+i` is
+ * only legal if both `p` and `p+i` point to the same block. */
+int heap_allocated(uintptr_t addr, size_t size, uintptr_t base_ptr);
+
+/*! \brief  Return a non-zero value if a given address is a base address of a
+ * heap-allocated memory block that `addr` belongs to.
+ *
+ * As some of the other functions, \b \\freeable can be expressed using
+ * ::IS_ON_HEAP, ::heap_allocated and ::_base_addr. Here direct
+ * implementation is preferred for performance reasons. */
+int freeable(void *ptr);
+
+/*! \brief Querying information about a specific heap memory address.
+ * This function is similar to ::static_info except it returns data
+ * associated with dynamically allocated memory.
+ * See in-line documentation for ::static_info for further details. */
+uintptr_t heap_info(uintptr_t addr, char type);
+
+/*! \brief Implementation of the \b \\initialized predicate for heap-allocated
+ * memory. NB: If `addr` does not belong to an allocated heap block this
+ * function returns 0. */
+int heap_initialized(uintptr_t addr, long len);
+
+/* }}} */
+
+/* Heap temporal querying {{{*/
+#ifdef E_ACSL_TEMPORAL
+uint32_t heap_temporal_info(uintptr_t addr, int origin);
+
+#define heap_origin_timestamp(_ptr)   heap_temporal_info((uintptr_t)(_ptr),1)
+#define heap_referent_timestamp(_ptr) heap_temporal_info((uintptr_t)(_ptr),0)
+
+void heap_store_temporal_referent(uintptr_t addr, uint32_t ref);
+#endif/*}}} E_ACSL_TEMPORAL*/
+
+/* Heap initialization {{{ */
+/*! \brief Mark n bytes on the heap starting from address addr as initialized */
+void initialize_heap_region(uintptr_t addr, long len);
+/* }}} */
+
+/* Internal state print (debug mode) {{{ */
+#ifdef E_ACSL_DEBUG
+/* ! \brief Print human-readable representation of a byte in a primary
+ * shadow */
+void printbyte(unsigned char c, char buf[]);
+
+/*! \brief Print human-readable (well, ish) representation of a memory block
+ * using primary and secondary shadows. */
+void print_static_shadows(uintptr_t addr, size_t size);
+
+/*! \brief Print human-readable representation of a heap shadow region for a
+ * memory block of length `size` starting at address `addr`. This function
+ * assumes that `addr` is the base address of the memory block. */
+void print_heap_shadows(uintptr_t addr);
+
+void print_shadows(uintptr_t addr, size_t size);
+
+void print_memory_segment(struct memory_segment *p, char *lab, int off);
+
+void print_memory_partition(struct memory_partition *p);
+
+void print_shadow_layout();
+
+/*! \brief Output the shadow segment the address belongs to */
+const char* which_segment(uintptr_t addr);
+
+/* NOTE: Above functions are designed to be used only through the following
+ * macros or debug functions included/defined based on the value of the
+ * E_ACSL_DEBUG macro. */
+
+/*! \brief Print program layout. This function outputs start/end addresses of
+ * various program segments, their shadow counterparts and sizes of shadow
+ * regions used. */
+#define DEBUG_PRINT_LAYOUT print_shadow_layout()
+void ___e_acsl_debug_print_layout() { DEBUG_PRINT_LAYOUT; }
+
+/*! \brief Print the shadow segment address addr belongs to */
+#define DEBUG_PRINT_SEGMENT(_addr) which_segment(_addr)
+void ___e_acsl_debug_print_segment(uintptr_t addr) { DEBUG_PRINT_SEGMENT(addr); }
+
+/*! \brief Print human-readable representation of a shadow region corresponding
+ * to a memory address addr. The second argument (size) if the size of the
+ * shadow region to be printed. Normally addr argument is a base address of a
+ * memory block and size is its length. */
+#define DEBUG_PRINT_SHADOW(addr, size) \
+  print_shadows((uintptr_t)addr, (size_t)size)
+void ___e_acsl_debug_print_shadow(uintptr_t addr, size_t size) {
+  DEBUG_PRINT_SHADOW(addr, size);
+}
+
+#else
+/* \cond exclude from doxygen */
+#define DEBUG_PRINT_SHADOW(addr, size)
+#define DEBUG_PRINT_LAYOUT
+#define DEBUG_PRINT_SEGMENT(addr)
+/* \endcond */
+#endif
+/* }}} */
+
+#endif // E_ACSL_SEGMENT_TRACKING_H
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.c b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.c
new file mode 100644
index 0000000000000000000000000000000000000000..7d627c5348637d92e28d5c739896899a9bf8db55
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.c
@@ -0,0 +1,221 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2020                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         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).            */
+/*                                                                        */
+/**************************************************************************/
+
+#include <sys/resource.h>
+#include <errno.h>
+#include <stddef.h>
+
+#include "../../internals/e_acsl_private_assert.h"
+#include "../../internals/e_acsl_malloc.h"
+
+#include "e_acsl_shadow_layout.h"
+
+/** Program stack information {{{ */
+
+size_t increase_stack_limit(const size_t size) {
+  rlim_t stacksz = (rlim_t)size;
+  struct rlimit rl;
+  int result = getrlimit(RLIMIT_STACK, &rl);
+  if (result == 0) {
+    if (rl.rlim_cur < stacksz) {
+      if (stacksz>rl.rlim_max) stacksz = rl.rlim_max;
+      rl.rlim_cur = stacksz;
+      result = setrlimit(RLIMIT_STACK, &rl);
+      if (result != 0) {
+        private_abort("setrlimit: %s \n", strerror(errno));
+      }
+    } else {
+      stacksz = rl.rlim_cur;
+    }
+  } else {
+    private_abort("getrlimit: %s \n", strerror(errno));
+  }
+  return (size_t)stacksz;
+}
+
+size_t get_stack_size() {
+  struct rlimit rlim;
+  private_assert(!getrlimit(RLIMIT_STACK, &rlim),
+    "Cannot detect program's stack size", NULL);
+  return rlim.rlim_cur;
+}
+
+uintptr_t get_stack_start(int *argc_ref,  char *** argv_ref) {
+  char **env = environ;
+  while (env[1])
+    env++;
+  uintptr_t addr = (uintptr_t)*env + strlen(*env);
+
+  /* When returning the end stack address we need to make sure that
+   * ::ULONG_BITS past that address are actually writeable. This is
+   * to be able to set initialization and read-only bits ::ULONG_BITS
+   * at a time. If not respected, this may cause a segfault in
+   * ::argv_alloca. */
+  uintptr_t stack_end = addr + ULONG_BITS;
+  uintptr_t stack_start = stack_end - get_stack_size();
+  return stack_start;
+}
+/* }}} */
+
+/** Program heap information {{{ */
+uintptr_t get_heap_start() {
+  return mem_spaces.heap_start;
+}
+
+size_t get_heap_size() {
+  return PGM_HEAP_SIZE;
+}
+
+size_t get_heap_init_size() {
+  return get_heap_size()/8;
+}
+
+uintptr_t get_global_start() {
+  return (uintptr_t)&__executable_start;
+}
+
+size_t get_global_size() {
+  return ((uintptr_t)&end - get_global_start());
+}
+/** }}} */
+
+/** Shadow Layout {{{ */
+
+void set_application_segment(memory_segment *seg, uintptr_t start,
+    size_t size, const char *name, mspace msp) {
+  seg->name = name;
+  seg->start = start;
+  seg->size = size;
+  seg->end = seg->start + seg->size;
+  seg->mspace = msp;
+  seg->parent = NULL;
+  seg->shadow_ratio = 0;
+  seg->shadow_offset = 0;
+}
+
+void set_shadow_segment(memory_segment *seg, memory_segment *parent,
+    size_t ratio, const char *name) {
+  seg->parent = parent;
+  seg->name = name;
+  seg->shadow_ratio = ratio;
+  seg->size = parent->size/seg->shadow_ratio;
+  seg->mspace = create_mspace(seg->size + SHADOW_SEGMENT_PADDING, 0);
+  seg->start = (uintptr_t)mspace_malloc(seg->mspace,1);
+  seg->end = seg->start + seg->size;
+  seg->shadow_offset = parent->start - seg->start;
+}
+
+void init_shadow_layout_stack(int *argc_ref, char ***argv_ref) {
+  memory_partition *pstack = &mem_layout.stack;
+  set_application_segment(&pstack->application, get_stack_start(argc_ref, argv_ref),
+    get_stack_size(), "stack", NULL);
+  /* Changes of the ratio in the following will require changes in get_tls_start */
+  set_shadow_segment(&pstack->primary, &pstack->application, 1, "stack_primary");
+  set_shadow_segment(&pstack->secondary, &pstack->application, 1, "stack_secondary");
+#ifdef E_ACSL_TEMPORAL
+  set_shadow_segment(&pstack->temporal_primary, &pstack->application, 1, "temporal_stack_primary");
+  set_shadow_segment(&pstack->temporal_secondary, &pstack->application, 1, "temporal_stack_secondary");
+#endif
+
+  mem_layout.is_initialized = 1;
+}
+
+uintptr_t get_tls_start() {
+  size_t tls_size = get_tls_size();
+  uintptr_t data = (uintptr_t)&id_tdata,
+            bss = (uintptr_t)&id_tbss;
+  /* It could happen that the shadow allocated before bss is too big.
+    Indeed allocating PGM_TLS_SIZE/2 could cause an overlap with the other
+    shadow segments AND heap.application (in case the latter is too big too).
+    In such cases, take the smallest available address (the max used +1). */
+  uintptr_t tls_start_half = (data > bss ? bss : data) - tls_size/2;
+  memory_partition pheap = mem_layout.heap,
+                   pglobal = mem_layout.global;
+  uintptr_t max_shadow = pheap.primary.end;
+  max_shadow = pheap.secondary.end > max_shadow ?
+    pheap.secondary.end : max_shadow;
+  max_shadow = pglobal.primary.end > max_shadow ?
+    pglobal.primary.end : max_shadow;
+  max_shadow = pglobal.secondary.end > max_shadow ?
+    pglobal.secondary.end : max_shadow;
+  max_shadow = pheap.application.end > max_shadow ?
+    pheap.application.end : max_shadow;
+  /* Shadow stacks are not yet allocated at his point since
+     init_shadow_layout_stack is called after
+     init_shadow_layout_heap_global_tls (for reasons related to memory
+     initialization in presence of things like GCC constructors).
+     We must leave sufficient space for them. */
+  max_shadow = max_shadow +
+    2*get_stack_size() + /* One for primary, one for secondary.
+                            If ratio is changed in init_shadow_layout_stack
+                            then update required here.
+                            TODO: if stack too big ==> problem */
+    1;
+  return tls_start_half > max_shadow ? tls_start_half : max_shadow;
+}
+
+void init_shadow_layout_heap_global_tls() {
+  memory_partition *pheap = &mem_layout.heap;
+  set_application_segment(&pheap->application, get_heap_start(),
+    get_heap_size(), "heap", mem_spaces.heap_mspace);
+  set_shadow_segment(&pheap->primary, &pheap->application, 1, "heap_primary");
+  set_shadow_segment(&pheap->secondary, &pheap->application, 8, "heap_secondary");
+#ifdef E_ACSL_TEMPORAL
+  set_shadow_segment(&pheap->temporal_primary, &pheap->application, 1, "temporal_heap_primary");
+  set_shadow_segment(&pheap->temporal_secondary, &pheap->application, 1, "temporal_heap_secondary");
+#endif
+
+  memory_partition *pglobal = &mem_layout.global;
+  set_application_segment(&pglobal->application, get_global_start(),
+    get_global_size(), "global", NULL);
+  set_shadow_segment(&pglobal->primary, &pglobal->application, 1, "global_primary");
+  set_shadow_segment(&pglobal->secondary, &pglobal->application, 1, "global_secondary");
+#ifdef E_ACSL_TEMPORAL
+  set_shadow_segment(&pglobal->temporal_primary, &pglobal->application, 1, "temporal_global_primary");
+  set_shadow_segment(&pglobal->temporal_secondary, &pglobal->application, 1, "temporal_global_secondary");
+#endif
+
+  memory_partition *ptls = &mem_layout.tls;
+  set_application_segment(&ptls->application, get_tls_start(),
+    get_tls_size(), "tls", NULL);
+  set_shadow_segment(&ptls->primary, &ptls->application, 1, "tls_primary");
+  set_shadow_segment(&ptls->secondary, &ptls->application, 1, "tls_secondary");
+#ifdef E_ACSL_TEMPORAL
+  set_shadow_segment(&ptls->temporal_primary, &ptls->application, 1, "temporal_tls_primary");
+  set_shadow_segment(&ptls->temporal_secondary, &ptls->application, 1, "temporal_tls_secondary");
+#endif
+
+  mem_layout.is_initialized = 1;
+}
+
+void clean_shadow_layout() {
+  if (mem_layout.is_initialized) {
+    int i;
+    for (i = 0; i < sizeof(mem_partitions)/sizeof(memory_partition*); i++) {
+      if (mem_partitions[i]->primary.mspace)
+        destroy_mspace(mem_partitions[i]->primary.mspace);
+      if (mem_partitions[i]->secondary.mspace)
+        destroy_mspace(mem_partitions[i]->secondary.mspace);
+    }
+  }
+}
+/** }}} */
diff --git a/src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_shadow_layout.h b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.h
similarity index 71%
rename from src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_shadow_layout.h
rename to src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.h
index 472e1e4699130ac2f2c99be4c7af3ff8559226b7..b15415383d498ef48e84b392a5e6323cbbac5912 100644
--- a/src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_shadow_layout.h
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.h
@@ -25,6 +25,13 @@
  * \brief Setup for memory tracking using shadowing
 ***************************************************************************/
 
+#ifndef E_ACSL_SHADOW_LAYOUT
+#define E_ACSL_SHADOW_LAYOUT
+
+#include <stddef.h>
+#include <stdint.h>
+#include "../../internals/e_acsl_malloc.h"
+
 /* Default size of a program's heap tracked via shadow memory */
 #ifndef E_ACSL_HEAP_SIZE
 #define E_ACSL_HEAP_SIZE 512
@@ -114,7 +121,7 @@ char *strerror(int errnum);
  */
 
 /*! \brief Return byte-size of the TLS segment */
-static size_t get_tls_size() {
+inline static size_t get_tls_size() {
   return PGM_TLS_SIZE;
 }
 
@@ -127,95 +134,50 @@ static __thread int id_tbss;
 extern char ** environ;
 
 /*! \brief Set a new soft stack limit
- * \param size - new stack size in bytes */
-static size_t increase_stack_limit(const size_t size) {
-  rlim_t stacksz = (rlim_t)size;
-  struct rlimit rl;
-  int result = getrlimit(RLIMIT_STACK, &rl);
-  if (result == 0) {
-    if (rl.rlim_cur < stacksz) {
-      if (stacksz>rl.rlim_max) stacksz = rl.rlim_max;
-      rl.rlim_cur = stacksz;
-      result = setrlimit(RLIMIT_STACK, &rl);
-      if (result != 0) {
-        vabort("setrlimit: %s \n", strerror(errno));
-      }
-    }
-  } else {
-    vabort("getrlimit: %s \n", strerror(errno));
-  }
-  return (size_t)stacksz;
-}
+ *
+ * If the new stack size is greater than the max stack size, then set to the max
+ * stack size. If the new stack size is less than the current stack size, don't
+ * do anything.
+ *
+ * Abort if an error occur when retrieving or setting the stack size.
+ *
+ * \param size - new stack size in bytes
+ * \return the new stack size in bytes.
+ */
+size_t increase_stack_limit(const size_t size);
 
 /*! \brief Return byte-size of a program's stack. The return value is the soft
  * stack limit, i.e., it can be programmatically increased at runtime. */
-static size_t get_default_stack_size() {
-  struct rlimit rlim;
-  vassert(!getrlimit(RLIMIT_STACK, &rlim),
-    "Cannot detect program's stack size", NULL);
-  return rlim.rlim_cur;
-}
-
-static size_t get_stack_size() {
-#ifndef E_ACSL_STACK_SIZE
-  return get_default_stack_size();
-#else
-  return increase_stack_limit(E_ACSL_STACK_SIZE*MB);
-#endif
-}
+size_t get_stack_size();
 
 /*! \brief Return greatest (known) address on a program's stack.
  * This function presently determines the address using the address of the
  * last string in `environ`. That is, it assumes that argc and argv are
  * stored below environ, which holds for GCC/Glibc but is not necessarily
  * true for some other compilers/libraries. */
-static uintptr_t get_stack_start(int *argc_ref,  char *** argv_ref) {
-  char **env = environ;
-  while (env[1])
-    env++;
-  uintptr_t addr = (uintptr_t)*env + strlen(*env);
-
-  /* When returning the end stack address we need to make sure that
-   * ::ULONG_BITS past that address are actually writeable. This is
-   * to be able to set initialization and read-only bits ::ULONG_BITS
-   * at a time. If not respected, this may cause a segfault in
-   * ::argv_alloca. */
-  uintptr_t stack_end = addr + ULONG_BITS;
-  uintptr_t stack_start = stack_end - get_stack_size();
-  return stack_start;
-}
+uintptr_t get_stack_start(int *argc_ref,  char *** argv_ref);
 /* }}} */
 
 /** Program heap information {{{ */
 /*! \brief Return the start address of a program's heap. */
-static uintptr_t get_heap_start() {
-  return mem_spaces.heap_start;
-}
+uintptr_t get_heap_start();
 
 /*! \brief Return the tracked size of a program's heap. */
-static size_t get_heap_size() {
-  return PGM_HEAP_SIZE;
-}
+size_t get_heap_size();
 
 /*! \brief Return the size of a secondary shadow region tracking
  * initialization (i.e., init shadow). */
-static size_t get_heap_init_size() {
-  return get_heap_size()/8;
-}
+size_t get_heap_init_size();
 
 /** }}} */
 
 /** Program global information {{{ */
 /*! \brief Return the start address of a segment holding globals (generally
  * BSS and Data segments). */
-static uintptr_t get_global_start() {
-  return (uintptr_t)&__executable_start;
-}
+uintptr_t get_global_start();
 
 /*! \brief Return byte-size of global segment */
-static size_t get_global_size() {
-  return ((uintptr_t)&end - get_global_start());
-}
+size_t get_global_size();
 /** }}} */
 
 /** Shadow Layout {{{ */
@@ -301,10 +263,10 @@ struct memory_layout {
 };
 
 /*! \brief Full program memory layout. */
-static struct memory_layout mem_layout;
+struct memory_layout mem_layout;
 
 /*! \brief Array of used partitions */
-static memory_partition *mem_partitions [] = {
+memory_partition *mem_partitions [] = {
   &mem_layout.heap,
   &mem_layout.stack,
   &mem_layout.global,
@@ -318,17 +280,8 @@ static memory_partition *mem_partitions [] = {
  * \param size - size in bytes
  * \param name - segment name
  * \param msp - mspace used for this segment (defined only for heap) */
-static void set_application_segment(memory_segment *seg, uintptr_t start,
-    size_t size, const char *name, mspace msp) {
-  seg->name = name;
-  seg->start = start;
-  seg->size = size;
-  seg->end = seg->start + seg->size;
-  seg->mspace = msp;
-  seg->parent = NULL;
-  seg->shadow_ratio = 0;
-  seg->shadow_offset = 0;
-}
+void set_application_segment(memory_segment *seg, uintptr_t start,
+    size_t size, const char *name, mspace msp);
 
 /*! \brief Set a shadow memory segment
  *
@@ -337,122 +290,26 @@ static void set_application_segment(memory_segment *seg, uintptr_t start,
  * \param ratio - ratio of shadow to application memory
  * \param name - symbolic name of the segment
  */
-static void set_shadow_segment(memory_segment *seg, memory_segment *parent,
-    size_t ratio, const char *name) {
-  seg->parent = parent;
-  seg->name = name;
-  seg->shadow_ratio = ratio;
-  seg->size = parent->size/seg->shadow_ratio;
-  seg->mspace = create_mspace(seg->size + SHADOW_SEGMENT_PADDING, 0);
-  seg->start = (uintptr_t)mspace_malloc(seg->mspace,1);
-  seg->end = seg->start + seg->size;
-  seg->shadow_offset = parent->start - seg->start;
-}
+void set_shadow_segment(memory_segment *seg, memory_segment *parent,
+    size_t ratio, const char *name);
 
 /*! \brief Initialize memory layout, i.e., determine bounds of program segments,
  * allocate shadow memory spaces and compute offsets. This function populates
  * global struct ::memory_layout holding that information with data.
    Case of the stack. */
-static void init_shadow_layout_stack(int *argc_ref, char ***argv_ref) {
-  memory_partition *pstack = &mem_layout.stack;
-  set_application_segment(&pstack->application, get_stack_start(argc_ref, argv_ref),
-    get_stack_size(), "stack", NULL);
-  /* Changes of the ratio in the following will require changes in get_tls_start */
-  set_shadow_segment(&pstack->primary, &pstack->application, 1, "stack_primary");
-  set_shadow_segment(&pstack->secondary, &pstack->application, 1, "stack_secondary");
-#ifdef E_ACSL_TEMPORAL
-  set_shadow_segment(&pstack->temporal_primary, &pstack->application, 1, "temporal_stack_primary");
-  set_shadow_segment(&pstack->temporal_secondary, &pstack->application, 1, "temporal_stack_secondary");
-#endif
-
-  mem_layout.is_initialized = 1;
-}
+void init_shadow_layout_stack(int *argc_ref, char ***argv_ref);
 
 /*! \brief Return start address of a program's TLS */
-static uintptr_t get_tls_start() {
-  size_t tls_size = get_tls_size();
-  uintptr_t data = (uintptr_t)&id_tdata,
-            bss = (uintptr_t)&id_tbss;
-  /* It could happen that the shadow allocated before bss is too big.
-    Indeed allocating PGM_TLS_SIZE/2 could cause an overlap with the other
-    shadow segments AND heap.application (in case the latter is too big too).
-    In such cases, take the smallest available address (the max used +1). */
-  uintptr_t tls_start_half = (data > bss ? bss : data) - tls_size/2;
-  memory_partition pheap = mem_layout.heap,
-                   pglobal = mem_layout.global;
-  uintptr_t max_shadow = pheap.primary.end;
-  max_shadow = pheap.secondary.end > max_shadow ?
-    pheap.secondary.end : max_shadow;
-  max_shadow = pglobal.primary.end > max_shadow ?
-    pglobal.primary.end : max_shadow;
-  max_shadow = pglobal.secondary.end > max_shadow ?
-    pglobal.secondary.end : max_shadow;
-  max_shadow = pheap.application.end > max_shadow ?
-    pheap.application.end : max_shadow;
-  /* Shadow stacks are not yet allocated at his point since
-     init_shadow_layout_stack is called after
-     init_shadow_layout_heap_global_tls (for reasons related to memory
-     initialization in presence of things like GCC constructors).
-     We must leave sufficient space for them. */
-  max_shadow = max_shadow +
-    2*get_stack_size() + /* One for primary, one for secondary.
-                            If ratio is changed in init_shadow_layout_stack
-                            then update required here.
-                            TODO: if stack too big ==> problem */
-    1;
-  return tls_start_half > max_shadow ? tls_start_half : max_shadow;
-}
+uintptr_t get_tls_start();
 
 /*! \brief Initialize memory layout, i.e., determine bounds of program segments,
  * allocate shadow memory spaces and compute offsets. This function populates
  * global struct ::memory_layout holding that information with data.
    Case of the heap, globals and tls. */
-static void init_shadow_layout_heap_global_tls() {
-  memory_partition *pheap = &mem_layout.heap;
-  set_application_segment(&pheap->application, get_heap_start(),
-    get_heap_size(), "heap", mem_spaces.heap_mspace);
-  set_shadow_segment(&pheap->primary, &pheap->application, 1, "heap_primary");
-  set_shadow_segment(&pheap->secondary, &pheap->application, 8, "heap_secondary");
-#ifdef E_ACSL_TEMPORAL
-  set_shadow_segment(&pheap->temporal_primary, &pheap->application, 1, "temporal_heap_primary");
-  set_shadow_segment(&pheap->temporal_secondary, &pheap->application, 1, "temporal_heap_secondary");
-#endif
-
-  memory_partition *pglobal = &mem_layout.global;
-  set_application_segment(&pglobal->application, get_global_start(),
-    get_global_size(), "global", NULL);
-  set_shadow_segment(&pglobal->primary, &pglobal->application, 1, "global_primary");
-  set_shadow_segment(&pglobal->secondary, &pglobal->application, 1, "global_secondary");
-#ifdef E_ACSL_TEMPORAL
-  set_shadow_segment(&pglobal->temporal_primary, &pglobal->application, 1, "temporal_global_primary");
-  set_shadow_segment(&pglobal->temporal_secondary, &pglobal->application, 1, "temporal_global_secondary");
-#endif
-
-  memory_partition *ptls = &mem_layout.tls;
-  set_application_segment(&ptls->application, get_tls_start(),
-    get_tls_size(), "tls", NULL);
-  set_shadow_segment(&ptls->primary, &ptls->application, 1, "tls_primary");
-  set_shadow_segment(&ptls->secondary, &ptls->application, 1, "tls_secondary");
-#ifdef E_ACSL_TEMPORAL
-  set_shadow_segment(&ptls->temporal_primary, &ptls->application, 1, "temporal_tls_primary");
-  set_shadow_segment(&ptls->temporal_secondary, &ptls->application, 1, "temporal_tls_secondary");
-#endif
-
-  mem_layout.is_initialized = 1;
-}
+void init_shadow_layout_heap_global_tls();
 
 /*! \brief Deallocate shadow regions used by runtime analysis */
-static void clean_shadow_layout() {
-  if (mem_layout.is_initialized) {
-    int i;
-    for (i = 0; i < sizeof(mem_partitions)/sizeof(memory_partition*); i++) {
-      if (mem_partitions[i]->primary.mspace)
-        destroy_mspace(mem_partitions[i]->primary.mspace);
-      if (mem_partitions[i]->secondary.mspace)
-        destroy_mspace(mem_partitions[i]->secondary.mspace);
-    }
-  }
-}
+void clean_shadow_layout();
 /* }}} */
 
 /** Shadow access {{{
@@ -620,3 +477,5 @@ static void clean_shadow_layout() {
 #define TEMPORAL_SECONDARY_STATIC_SHADOW(_addr) \
   SHADOW_REGION_ADDRESS(_addr, TEMPORAL_SECONDARY)
 #endif /* }}} */
+
+#endif // E_ACSL_SHADOW_LAYOUT
diff --git a/src/plugins/e-acsl/src/analyses/exit_points.mli b/src/plugins/e-acsl/src/analyses/exit_points.mli
index 5af6fb4910d36fb8f03abc6dc8b41ff907f75d2a..9263b798ce56ed78868d953576d86a0a437bfbe7 100644
--- a/src/plugins/e-acsl/src/analyses/exit_points.mli
+++ b/src/plugins/e-acsl/src/analyses/exit_points.mli
@@ -25,8 +25,8 @@
     - a call to [__e_acsl_delete_block] at the end of the scope.
       This is not always sufficient to track variables because execution
       may exit a scope early (for instance via a goto or a break statement).
-      This module computes program points at which extra `delete_block` statements
-      need to be added to handle such early scope exits. *)
+      This module computes program points at which extra [delete_block]
+      statements need to be added to handle such early scope exits. *)
 
 open Cil_types
 open Cil_datatype
diff --git a/src/plugins/e-acsl/src/analyses/mmodel_analysis.ml b/src/plugins/e-acsl/src/analyses/memory_tracking.ml
similarity index 71%
rename from src/plugins/e-acsl/src/analyses/mmodel_analysis.ml
rename to src/plugins/e-acsl/src/analyses/memory_tracking.ml
index c480e318b764410dc8acfd272b8c28d27d3f75f6..e6225e41ed096b071d4f5ebd2068177bad27c632 100644
--- a/src/plugins/e-acsl/src/analyses/mmodel_analysis.ml
+++ b/src/plugins/e-acsl/src/analyses/memory_tracking.ml
@@ -138,11 +138,11 @@ end = struct
     try
       Kernel_function.Hashtbl.iter
         (fun _ h ->
-          Stmt.Hashtbl.iter
-            (fun _ set -> match set with
-            | None -> ()
-            | Some s -> if not (Varinfo.Hptset.is_empty s) then raise Exit)
-            h)
+           Stmt.Hashtbl.iter
+             (fun _ set -> match set with
+                | None -> ()
+                | Some s -> if not (Varinfo.Hptset.is_empty s) then raise Exit)
+             h)
         tbl;
       true
     with Exit ->
@@ -162,7 +162,7 @@ let reset () =
 
 module rec Transfer
   : Dataflow.BackwardsTransfer with type t = Varinfo.Hptset.t option
-  = struct
+= struct
 
   let name = "E_ACSL.Pre_analysis"
 
@@ -217,8 +217,8 @@ module rec Transfer
   let rec base_addr_node = function
     | Lval lv | AddrOf lv | StartOf lv ->
       (match lv with
-      | Var vi, _ -> Some vi
-      | Mem e, _ -> base_addr e)
+       | Var vi, _ -> Some vi
+       | Mem e, _ -> base_addr e)
     | BinOp((PlusPI | IndexPI | MinusPI), e1, e2, _) ->
       if is_ptr_or_array_exp e1 then base_addr e1
       else begin
@@ -227,7 +227,7 @@ module rec Transfer
       end
     | Info(e, _) | CastE(_, e) -> base_addr e
     | BinOp((MinusPP | PlusA | MinusA | Mult | Div | Mod |Shiftlt | Shiftrt
-                | Lt | Gt | Le | Ge | Eq | Ne | BAnd | BXor | BOr | LAnd | LOr),
+            | Lt | Gt | Le | Ge | Eq | Ne | BAnd | BXor | BOr | LAnd | LOr),
             _, _, _)
     | UnOp _ | Const _ | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _
     | AlignOfE _ ->
@@ -314,20 +314,20 @@ module rec Transfer
       register_term kf varinfos t2
     | TBinOp((PlusPI | IndexPI | MinusPI), t1, t2) ->
       (match t1.term_type with
-      | Ctype ty when is_ptr_or_array ty -> register_term kf varinfos t1
-      | _ ->
-        match t2.term_type with
-        | Ctype ty when is_ptr_or_array ty -> register_term kf varinfos t2
-        | _ ->
-          if Misc.is_set_of_ptr_or_array t1.term_type ||
-             Misc.is_set_of_ptr_or_array t2.term_type then
-            (* Occurs for example from:
-              \valid(&multi_dynamic[2..4][1..7])
-              where multi_dynamic has been dynamically allocated *)
-            let varinfos = register_term kf varinfos t1 in
-            register_term kf varinfos t2
-          else
-            assert false)
+       | Ctype ty when is_ptr_or_array ty -> register_term kf varinfos t1
+       | _ ->
+         match t2.term_type with
+         | Ctype ty when is_ptr_or_array ty -> register_term kf varinfos t2
+         | _ ->
+           if Misc.is_set_of_ptr_or_array t1.term_type ||
+              Misc.is_set_of_ptr_or_array t2.term_type then
+             (* Occurs for example from:
+                \valid(&multi_dynamic[2..4][1..7])
+                where multi_dynamic has been dynamically allocated *)
+             let varinfos = register_term kf varinfos t1 in
+             register_term kf varinfos t2
+           else
+             assert false)
     | TConst _ | TSizeOf _ | TSizeOfE _ | TSizeOfStr _ | TAlignOf _
     | TAlignOfE _ | Tnull | Ttype _ | TUnOp _ | TBinOp _ ->
       varinfos
@@ -359,73 +359,73 @@ module rec Transfer
   let register_object kf state_ref = object
     inherit Visitor.frama_c_inplace
     method !vpredicate_node = function
-    | Pvalid(_, t) | Pvalid_read(_, t)
-    | Pobject_pointer(_, t) | Pvalid_function t
-    | Pinitialized(_, t) | Pfreeable(_, t) ->
-      (*	Options.feedback "REGISTER %a" Cil.d_term t;*)
-      state_ref := register_term kf !state_ref t;
-      Cil.DoChildren
-    | Pallocable _ -> Error.not_yet "\\allocable"
-    | Pfresh _ -> Error.not_yet "\\fresh"
-    | Pseparated _ -> Error.not_yet "\\separated"
-    | Pdangling _ -> Error.not_yet "\\dangling"
-    | Ptrue | Pfalse | Papp _ | Prel _
-    | Pand _ | Por _ | Pxor _ | Pimplies _ | Piff _ | Pnot _ | Pif _
-    | Pforall _ | Pexists _ | Pat _ ->
-      Cil.DoChildren
-    | Plet(li, _) ->
-      if may_alias li then Error.not_yet "let-binding on array or pointer"
-      else begin
-        state_ref := register_term kf !state_ref (Misc.term_of_li li);
+      | Pvalid(_, t) | Pvalid_read(_, t)
+      | Pobject_pointer(_, t) | Pvalid_function t
+      | Pinitialized(_, t) | Pfreeable(_, t) ->
+        (*	Options.feedback "REGISTER %a" Cil.d_term t;*)
+        state_ref := register_term kf !state_ref t;
         Cil.DoChildren
-      end
+      | Pallocable _ -> Error.not_yet "\\allocable"
+      | Pfresh _ -> Error.not_yet "\\fresh"
+      | Pseparated _ -> Error.not_yet "\\separated"
+      | Pdangling _ -> Error.not_yet "\\dangling"
+      | Ptrue | Pfalse | Papp _ | Prel _
+      | Pand _ | Por _ | Pxor _ | Pimplies _ | Piff _ | Pnot _ | Pif _
+      | Pforall _ | Pexists _ | Pat _ ->
+        Cil.DoChildren
+      | Plet(li, _) ->
+        if may_alias li then Error.not_yet "let-binding on array or pointer"
+        else begin
+          state_ref := register_term kf !state_ref (Misc.term_of_li li);
+          Cil.DoChildren
+        end
     method !vterm term = match term.term_node with
-    | Tbase_addr(_, t) | Toffset(_, t) | Tblock_length(_, t) | Tlet(_, t) ->
-      state_ref := register_term kf !state_ref t;
-      Cil.DoChildren
-    | TConst _ | TSizeOf _ | TSizeOfStr _ | TAlignOf _  | Tnull | Ttype _
-    | Tempty_set ->
-      (* no left-value inside inside: skip for efficiency *)
-      Cil.SkipChildren
-    | TUnOp _ | TBinOp _ | Ttypeof _ | TSizeOfE _
-    | TLval _ | TAlignOfE _ | TCastE _ | TAddrOf _
-    | TStartOf _ | Tapp _ | Tlambda _ | TDataCons _ | Tif _ | Tat _
-    | TUpdate _ | Tunion _ | Tinter _
-    | Tcomprehension _ | Trange _ | TLogic_coerce _ ->
-      (* potential sub-term inside *)
-      Cil.DoChildren
+      | Tbase_addr(_, t) | Toffset(_, t) | Tblock_length(_, t) | Tlet(_, t) ->
+        state_ref := register_term kf !state_ref t;
+        Cil.DoChildren
+      | TConst _ | TSizeOf _ | TSizeOfStr _ | TAlignOf _  | Tnull | Ttype _
+      | Tempty_set ->
+        (* no left-value inside inside: skip for efficiency *)
+        Cil.SkipChildren
+      | TUnOp _ | TBinOp _ | Ttypeof _ | TSizeOfE _
+      | TLval _ | TAlignOfE _ | TCastE _ | TAddrOf _
+      | TStartOf _ | Tapp _ | Tlambda _ | TDataCons _ | Tif _ | Tat _
+      | TUpdate _ | Tunion _ | Tinter _
+      | Tcomprehension _ | Trange _ | TLogic_coerce _ ->
+        (* potential sub-term inside *)
+        Cil.DoChildren
     method !vlogic_label _ = Cil.SkipChildren
     method !vterm_lhost = function
-    | TMem t ->
-      (* potential RTE *)
-      state_ref := register_term kf !state_ref t;
-      Cil.DoChildren
-    | TVar _ | TResult _ ->
-      Cil.SkipChildren
+      | TMem t ->
+        (* potential RTE *)
+        state_ref := register_term kf !state_ref t;
+        Cil.DoChildren
+      | TVar _ | TResult _ ->
+        Cil.SkipChildren
   end
 
-let register_predicate kf pred state =
-  let state_ref = ref state in
-  Error.handle
-    (fun () ->
-      ignore
-        (Visitor.visitFramacIdPredicate (register_object kf state_ref) pred))
-    ();
-  !state_ref
+  let register_predicate kf pred state =
+    let state_ref = ref state in
+    Error.handle
+      (fun () ->
+         ignore
+           (Visitor.visitFramacIdPredicate (register_object kf state_ref) pred))
+      ();
+    !state_ref
 
   let register_code_annot kf a state =
     let state_ref = ref state in
     Error.handle
       (fun () ->
-        ignore
-          (Visitor.visitFramacCodeAnnotation (register_object kf state_ref) a))
+         ignore
+           (Visitor.visitFramacCodeAnnotation (register_object kf state_ref) a))
       ();
     !state_ref
 
-    let rec do_init vi init state = match init with
-      | SingleInit e -> handle_assignment state (Var vi, NoOffset) e
-      | CompoundInit(_, l) ->
-        List.fold_left (fun state (_, init) -> do_init vi init state) state l
+  let rec do_init vi init state = match init with
+    | SingleInit e -> handle_assignment state (Var vi, NoOffset) e
+    | CompoundInit(_, l) ->
+      List.fold_left (fun state (_, init) -> do_init vi init state) state l
 
   let register_initializers state =
     let do_one vi init state = match init.init with
@@ -433,9 +433,9 @@ let register_predicate kf pred state =
       | Some init -> do_init vi init state
     in
     Globals.Vars.fold_in_file_rev_order do_one state
-(* below: compatibility with Fluorine *)
-(*    let l = Globals.Vars.fold_in_file_order (fun v i l -> (v, i) :: l) [] in
-    List.fold_left (fun state (v, i) -> do_one v i state) state l*)
+  (* below: compatibility with Fluorine *)
+  (*    let l = Globals.Vars.fold_in_file_order (fun v i l -> (v, i) :: l) [] in
+        List.fold_left (fun state (v, i) -> do_one v i state) state l*)
 
   (** The (backwards) transfer function for a branch. The [(Cil.CurrentLoc.get
       ())] is set before calling this. If it returns None, then we have some
@@ -447,59 +447,63 @@ let register_predicate kf pred state =
     let is_last = Kernel_function.is_return_stmt kf stmt in
     Dataflow.Post
       (fun state ->
-        let state = Env.default_varinfos state in
-        let state =
-          if Functions.check kf then
-            let state =
-              if (is_first || is_last) && Functions.RTL.is_generated_kf kf then
-                Annotations.fold_behaviors
-                  (fun _ bhv s ->
-                    let handle_annot test f s =
-                      if test then
-                        f
-                          (fun _ p s -> register_predicate kf p s)
-                          kf
-                          bhv.b_name
+         let state = Env.default_varinfos state in
+         let state =
+           if Functions.check kf then
+             let state =
+               if (is_first || is_last) && Functions.RTL.is_generated_kf kf then
+                 Annotations.fold_behaviors
+                   (fun _ bhv s ->
+                      let handle_annot test f s =
+                        if test then
+                          f
+                            (fun _ p s -> register_predicate kf p s)
+                            kf
+                            bhv.b_name
+                            s
+                        else
                           s
-                      else
-                        s
-                  in
-                    let s = handle_annot is_first Annotations.fold_requires s in
-                    let s = handle_annot is_first Annotations.fold_assumes s in
-                    handle_annot
-                      is_last
-                      (fun f ->
-                        Annotations.fold_ensures (fun e (_, p) -> f e p)) s)
-                  kf
-                  state
-              else
-                state
-            in
-            let state =
-              Annotations.fold_code_annot
-                (fun _ -> register_code_annot kf) stmt state
-            in
-            if stmt.ghost then
-              let rtes = Rte.stmt kf stmt in
-              List.fold_left
-                (fun state a -> register_code_annot kf a state) state rtes
-            else
-              state
-          else (* not (Options.Functions.check kf): do not monitor [kf] *)
-            state
-        in
-        let state =
-        (* take initializers into account *)
-          if is_first then
-            let main, lib = Globals.entry_point () in
-            if Kernel_function.equal kf main && not lib then
-              register_initializers state
-            else
-              state
-          else
-            state
-        in
-        Some state)
+                      in
+                      let s =
+                        handle_annot is_first Annotations.fold_requires s
+                      in
+                      let s =
+                        handle_annot is_first Annotations.fold_assumes s
+                      in
+                      handle_annot
+                        is_last
+                        (fun f ->
+                           Annotations.fold_ensures (fun e (_, p) -> f e p)) s)
+                   kf
+                   state
+               else
+                 state
+             in
+             let state =
+               Annotations.fold_code_annot
+                 (fun _ -> register_code_annot kf) stmt state
+             in
+             if stmt.ghost then
+               let rtes = Rte.stmt kf stmt in
+               List.fold_left
+                 (fun state a -> register_code_annot kf a state) state rtes
+             else
+               state
+           else (* not (Options.Functions.check kf): do not monitor [kf] *)
+             state
+         in
+         let state =
+           (* take initializers into account *)
+           if is_first then
+             let main, lib = Globals.entry_point () in
+             if Kernel_function.equal kf main && not lib then
+               register_initializers state
+             else
+               state
+           else
+             state
+         in
+         Some state)
 
   let do_call res f args state =
     let kf = Globals.Functions.get f in
@@ -512,11 +516,11 @@ let register_predicate kf pred state =
           let init =
             List.fold_left2
               (fun acc p a -> match base_addr a with
-              | None -> acc
-              | Some vi ->
-                if Varinfo.Hptset.mem vi state
-                then Varinfo.Hptset.add p acc
-                else acc)
+                 | None -> acc
+                 | Some vi ->
+                   if Varinfo.Hptset.mem vi state
+                   then Varinfo.Hptset.add p acc
+                   else acc)
               state
               params
               args
@@ -536,10 +540,10 @@ let register_predicate kf pred state =
              corresponding formals must be kept *)
           List.fold_left2
             (fun acc p a -> match base_addr a with
-            | None -> acc
-            | Some vi ->
-              if Varinfo.Hptset.mem p state then Varinfo.Hptset.add vi acc
-              else acc)
+               | None -> acc
+               | Some vi ->
+                 if Varinfo.Hptset.mem p state then Varinfo.Hptset.add vi acc
+                 else acc)
             state
             params
             args
@@ -589,19 +593,19 @@ let register_predicate kf pred state =
       do_call (Some (Cil.var v)) f args state
     | Call(result, f_exp, l, _) ->
       (match f_exp.enode with
-      | Lval(Var vi, NoOffset) -> do_call result vi l state
-      | _ ->
-        Options.warning ~current:true
-          "function pointers may introduce too limited instrumentation.";
-(* imprecise function call: keep each argument *)
-        Dataflow.Done
-          (Some
-             (List.fold_left
-                (fun acc e -> match base_addr e with
-                | None -> acc
-                | Some vi -> Varinfo.Hptset.add vi acc)
-                state
-                l)))
+       | Lval(Var vi, NoOffset) -> do_call result vi l state
+       | _ ->
+         Options.warning ~current:true
+           "function pointers may introduce too limited instrumentation.";
+         (* imprecise function call: keep each argument *)
+         Dataflow.Done
+           (Some
+              (List.fold_left
+                 (fun acc e -> match base_addr e with
+                    | None -> acc
+                    | Some vi -> Varinfo.Hptset.add vi acc)
+                 state
+                 l)))
     | Asm _ -> Error.not_yet "asm"
     | Skip _ | Code_annot _ -> Dataflow.Default
 
@@ -633,23 +637,25 @@ end = struct
        if is_init then
          Extlib.may
            (fun set ->
-             List.iter
-               (fun s ->
-                 let old =
-                   try Extlib.the (Stmt.Hashtbl.find tbl s)
-                   with Not_found -> assert false
-                 in
-                 Stmt.Hashtbl.replace
-                   tbl
-                   s
-                   (Some (Varinfo.Hptset.union set old)))
-               returns)
+              List.iter
+                (fun s ->
+                   let old =
+                     try Extlib.the (Stmt.Hashtbl.find tbl s)
+                     with Not_found -> assert false
+                   in
+                   Stmt.Hashtbl.replace
+                     tbl
+                     s
+                     (Some (Varinfo.Hptset.union set old)))
+                returns)
            init_set
        else begin
          List.iter (fun s -> Stmt.Hashtbl.add tbl s None) stmts;
          Extlib.may
            (fun set ->
-             List.iter (fun s -> Stmt.Hashtbl.replace tbl s (Some set)) returns)
+              List.iter
+                (fun s -> Stmt.Hashtbl.replace tbl s (Some set))
+                returns)
            init_set
        end;
        D.compute stmts
@@ -665,12 +671,12 @@ end = struct
     else
       try
         let stmt = Kernel_function.find_first_stmt kf in
-(*      Options.feedback "GETTING %a" Kernel_function.pretty kf;*)
+        (*      Options.feedback "GETTING %a" Kernel_function.pretty kf;*)
         let tbl =
           if Env.mem_init kf init then
             try Env.find kf with Not_found -> assert false
           else begin
-    (* WARN: potentially incorrect in case of recursive call *)
+            (* WARN: potentially incorrect in case of recursive call *)
             Env.add_init kf init;
             Env.apply (compute init) kf
           end
@@ -686,26 +692,28 @@ end = struct
 
 end
 
-let consolidated_must_model_vi vi =
+let consolidated_must_monitor_vi vi =
   if Env.is_consolidated () then
     Env.consolidated_mem vi
   else begin
     Options.feedback ~level:2 "performing pre-analysis for minimal memory \
-instrumentation.";
+                               instrumentation.";
     (try
        let main, _ = Globals.entry_point () in
        let set = Compute.get main in
        Env.consolidate set
      with Globals.No_such_entry_point s ->
-       Options.warning ~once:true "%s@ \
-@[The generated program may miss memory instrumentation@ \
-if there are memory-related annotations.@]"
- s);
+       Options.warning
+         ~once:true
+         "%s@ \
+          @[The generated program may miss memory instrumentation@ \
+          if there are memory-related annotations.@]"
+         s);
     Options.feedback ~level:2 "pre-analysis done.";
     Env.consolidated_mem vi
   end
 
-let must_model_vi ?kf ?stmt vi =
+let must_monitor_vi ?kf ?stmt vi =
   let _kf = match kf, stmt with
     | None, None | Some _, _ -> kf
     | None, Some stmt -> Some (Kernel_function.find_englobing_kf stmt)
@@ -713,26 +721,26 @@ let must_model_vi ?kf ?stmt vi =
   (* [JS 2013/05/07] that is unsound to take the env from the given stmt in
      presence of aliasing with an address (see tests address.i).
      TODO: could be optimized though *)
-  consolidated_must_model_vi vi
+  consolidated_must_monitor_vi vi
 (*  match stmt, kf with
-  | None, _ -> consolidated_must_model_vi vi
-  | Some _, None ->
+    | None, _ -> consolidated_must_monitor_vi vi
+    | Some _, None ->
     assert false
-  | Some stmt, Some kf  ->
+    | Some stmt, Some kf  ->
     if not (Env.is_consolidated ()) then
-      ignore (consolidated_must_model_vi vi);
+      ignore (consolidated_must_monitor_vi vi);
     try
       let tbl = Env.find kf in
       try
-let set = Stmt.Hashtbl.find tbl stmt in
-Varinfo.Hptset.mem vi (Env.default_varinfos set)
+    let set = Stmt.Hashtbl.find tbl stmt in
+    Varinfo.Hptset.mem vi (Env.default_varinfos set)
       with Not_found ->
-(* new statement *)
-consolidated_must_model_vi vi
+    (* new statement *)
+    consolidated_must_monitor_vi vi
     with Not_found ->
       (* [kf] is dead code *)
       false
- *)
+*)
 
 let rec apply_on_vi_base_from_lval f ?kf ?stmt = function
   | Var vi, _ -> f ?kf ?stmt vi
@@ -748,13 +756,13 @@ and apply_on_vi_base_from_exp f ?kf ?stmt e = match e.enode with
     || apply_on_vi_base_from_exp f ?kf ?stmt e2
   | Info(e, _) | CastE(_, e) -> apply_on_vi_base_from_exp f ?kf ?stmt e
   | BinOp((PlusA | MinusA | Mult | Div | Mod |Shiftlt | Shiftrt | Lt | Gt | Le
-            | Ge | Eq | Ne | BAnd | BXor | BOr | LAnd | LOr), _, _, _)
+          | Ge | Eq | Ne | BAnd | BXor | BOr | LAnd | LOr), _, _, _)
   | Const _ -> (* possible in case of static address *) false
   | UnOp _ | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ | AlignOfE _ ->
     Options.fatal "[pre_analysis] unexpected expression %a" Exp.pretty e
 
-let must_model_lval = apply_on_vi_base_from_lval must_model_vi
-let must_model_exp = apply_on_vi_base_from_exp must_model_vi
+let must_monitor_lval = apply_on_vi_base_from_lval must_monitor_vi
+let must_monitor_exp = apply_on_vi_base_from_exp must_monitor_vi
 
 let must_never_monitor_lval ?kf ?stmt lv =
   apply_on_vi_base_from_lval
@@ -774,27 +782,27 @@ let must_never_monitor_exp ?kf ?stmt lv  =
 (** {1 Public API} *)
 (* ************************************************************************** *)
 
-let must_model_vi ?kf ?stmt vi =
+let must_monitor_vi ?kf ?stmt vi =
   not (must_never_monitor vi)
   &&
-    (Options.Full_mmodel.get ()
-     || Error.generic_handle (must_model_vi ?kf ?stmt) false vi)
+  (Options.Full_mtracking.get ()
+   || Error.generic_handle (must_monitor_vi ?kf ?stmt) false vi)
 
-let must_model_lval ?kf ?stmt lv =
+let must_monitor_lval ?kf ?stmt lv =
   not (must_never_monitor_lval ?kf ?stmt lv)
   &&
-    (Options.Full_mmodel.get ()
-     || Error.generic_handle (must_model_lval ?kf ?stmt) false lv)
+  (Options.Full_mtracking.get ()
+   || Error.generic_handle (must_monitor_lval ?kf ?stmt) false lv)
 
-let must_model_exp ?kf ?stmt exp =
+let must_monitor_exp ?kf ?stmt exp =
   not (must_never_monitor_exp ?kf ?stmt exp)
   &&
-    (Options.Full_mmodel.get ()
-     || Error.generic_handle (must_model_exp ?kf ?stmt) false exp)
+  (Options.Full_mtracking.get ()
+   || Error.generic_handle (must_monitor_exp ?kf ?stmt) false exp)
 
-let use_model () =
+let use_monitoring () =
   not (Env.is_empty ())
-  || Options.Full_mmodel.get ()
+  || Options.Full_mtracking.get ()
   || Env.has_heap_allocations ()
 
 (*
diff --git a/src/plugins/e-acsl/src/analyses/mmodel_analysis.mli b/src/plugins/e-acsl/src/analyses/memory_tracking.mli
similarity index 90%
rename from src/plugins/e-acsl/src/analyses/mmodel_analysis.mli
rename to src/plugins/e-acsl/src/analyses/memory_tracking.mli
index 8c4967c2797f9c936b3c230b40a9cb0d476f6a37..07121a82a8e8bf5fefee8d8785d6efe93e0dfee2 100644
--- a/src/plugins/e-acsl/src/analyses/mmodel_analysis.mli
+++ b/src/plugins/e-acsl/src/analyses/memory_tracking.mli
@@ -28,18 +28,18 @@ open Cil_types
 val reset: unit -> unit
 (** Must be called to redo the analysis *)
 
-val use_model: unit -> bool
+val use_monitoring: unit -> bool
 (** Is one variable monitored (at least)? *)
 
-val must_model_vi: ?kf:kernel_function -> ?stmt:stmt -> varinfo -> bool
+val must_monitor_vi: ?kf:kernel_function -> ?stmt:stmt -> varinfo -> bool
 (** [must_model_vi ?kf ?stmt vi] returns [true] if the varinfo [vi] at the given
     [stmt] in the given function [kf] must be tracked by the memory model
     library. *)
 
-val must_model_lval: ?kf:kernel_function -> ?stmt:stmt -> lval -> bool
+val must_monitor_lval: ?kf:kernel_function -> ?stmt:stmt -> lval -> bool
 (** Same as {!must_model_vi}, for left-values *)
 
-val must_model_exp: ?kf:kernel_function -> ?stmt:stmt -> exp -> bool
+val must_monitor_exp: ?kf:kernel_function -> ?stmt:stmt -> exp -> bool
 (** Same as {!must_model_vi}, for expressions *)
 
 (*
diff --git a/src/plugins/e-acsl/src/analyses/rte.ml b/src/plugins/e-acsl/src/analyses/rte.ml
index 96a1afbb988346ccc261a2181d097d949b370c8b..9305eff3a55b06c68106628a229bb27afd265565 100644
--- a/src/plugins/e-acsl/src/analyses/rte.ml
+++ b/src/plugins/e-acsl/src/analyses/rte.ml
@@ -27,7 +27,7 @@
 let warn_rte warn exn =
   if warn then
     Options.warning "@[@[cannot run RTE:@ %s.@]@ \
-Ignoring potential runtime errors in annotations." 
+                     Ignoring potential runtime errors in annotations."
       (Printexc.to_string exn)
 
 (* ************************************************************************** *)
@@ -45,8 +45,8 @@ let stmt ?(warn=true) =
          (let module L = Datatype.List(Code_annotation) in L.ty))
   with Failure _ | Dynamic.Unbound_value _ | Dynamic.Incompatible_type _ as exn
     ->
-      warn_rte warn exn;
-      fun _ _ -> []
+    warn_rte warn exn;
+    fun _ _ -> []
 
 let exp ?(warn=true) =
   try
@@ -57,8 +57,8 @@ let exp ?(warn=true) =
          (let module L = Datatype.List(Code_annotation) in L.ty))
   with Failure _ | Dynamic.Unbound_value _ | Dynamic.Incompatible_type _ as exn
     ->
-      warn_rte warn exn;
-      fun _ _ _ -> []
+    warn_rte warn exn;
+    fun _ _ _ -> []
 
 (*
 Local Variables:
diff --git a/src/plugins/e-acsl/src/code_generator/at_with_lscope.ml b/src/plugins/e-acsl/src/code_generator/at_with_lscope.ml
index 040c83991edcca505c5758fdf0ad4dea40420c12..671ea306b1f641e8cacba62184345c3256d526fd 100644
--- a/src/plugins/e-acsl/src/code_generator/at_with_lscope.ml
+++ b/src/plugins/e-acsl/src/code_generator/at_with_lscope.ml
@@ -39,8 +39,8 @@ let term_to_exp_ref
 (*****************************************************************************)
 
 (* Remove all the bindings for [kf]. [Cil_datatype.Kf.Hashtbl] does not
-  provide the [remove_all] function. Thus we need to keep calling [remove]
-  until all entries are removed. *)
+   provide the [remove_all] function. Thus we need to keep calling [remove]
+   until all entries are removed. *)
 let rec remove_all tbl kf =
   if Cil_datatype.Kf.Hashtbl.mem tbl kf then begin
     Cil_datatype.Kf.Hashtbl.remove tbl kf;
@@ -66,10 +66,10 @@ end
 (**************************************************************************)
 
 (* Builds the terms [t_size] and [t_shifted] from each
-  [Lvs_quantif(tmin, lv, tmax)] from [lscope]
-  where [t_size = tmax - tmin + (-1|0|1)] depending on whether the
+   [Lvs_quantif(tmin, lv, tmax)] from [lscope]
+   where [t_size = tmax - tmin + (-1|0|1)] depending on whether the
                                           inequalities are strict or large
-  and [t_shifted = lv - tmin + (-1|0)] (so that we start indexing at 0) *)
+   and [t_shifted = lv - tmin + (-1|0)] (so that we start indexing at 0) *)
 let rec sizes_and_shifts_from_quantifs ~loc kf lscope sizes_and_shifts =
   match lscope with
   | [] ->
@@ -97,29 +97,29 @@ let rec sizes_and_shifts_from_quantifs ~loc kf lscope sizes_and_shifts =
     in
     let iv = Interval.(extract_ival (infer t_size)) in
     (* The EXACT amount of memory that is needed can be known at runtime. This
-      is because the tightest bounds for the variables can be known at runtime.
-      Example: In the following predicate
+       is because the tightest bounds for the variables can be known at runtime.
+       Example: In the following predicate
         [\exists integer u; 9 <= u <= 13 &&
          \forall integer v; -5 < v <= (u <= 11 ? u + 6 : u - 9) ==>
            \at(u + v > 0, K)]
         the upper bound [M] for [v] depends on [u].
         In chronological order, [M] equals to 15, 16, 17, 3 and 4.
         Thus the tightest upper bound for [v] is [max(M)=17].
-      HOWEVER, computing that exact information requires extra nested loops,
-      prior to the [malloc] stmts, that will try all the possible values of the
-      variables involved in the bounds.
-      Instead of sacrificing time over memory (by performing these extra
-      computations), we consider that sacrificing memory over time is more
-      beneficial. In particular, though we may allocate more memory than
-      needed, the number of reads/writes into it is the same in both cases.
-      Conclusion: over-approximate [t_size] *)
+       HOWEVER, computing that exact information requires extra nested loops,
+       prior to the [malloc] stmts, that will try all the possible values of the
+       variables involved in the bounds.
+       Instead of sacrificing time over memory (by performing these extra
+       computations), we consider that sacrificing memory over time is more
+       beneficial. In particular, though we may allocate more memory than
+       needed, the number of reads/writes into it is the same in both cases.
+       Conclusion: over-approximate [t_size] *)
     let t_size = match Ival.min_and_max iv with
       | _, Some max ->
         Logic_const.tint ~loc max
       | _, None ->
         Error.not_yet
           "\\at on purely logic variables and with quantifier that uses \
-            too complex bound (E-ACSL cannot infer a finite upper bound to it)"
+           too complex bound (E-ACSL cannot infer a finite upper bound to it)"
     in
     (* Index *)
     let t_lv = Logic_const.tvar ~loc lv in
@@ -148,13 +148,13 @@ let rec sizes_and_shifts_from_quantifs ~loc kf lscope sizes_and_shifts =
 let size_from_sizes_and_shifts ~loc = function
   | [] ->
     (* No quantified variable. But still need to allocate [1*sizeof(_)] amount
-      of memory to store purely logic variables that are NOT quantified
-      (example: from \let). *)
+       of memory to store purely logic variables that are NOT quantified
+       (example: from \let). *)
     Cil.lone ~loc ()
   | (size, _) :: sizes_and_shifts ->
     List.fold_left
       (fun t_size (t_s, _) ->
-        Logic_const.term ~loc (TBinOp(Mult, t_size, t_s)) Linteger)
+         Logic_const.term ~loc (TBinOp(Mult, t_size, t_s)) Linteger)
       size
       sizes_and_shifts
 
@@ -171,35 +171,35 @@ let lval_at_index ~loc kf env (e_at, vi_at, t_index) =
   lval_at_index, env
 
 (* Associate to each possible tuple of quantifiers
-  a unique index from the set {n | 0 <= n < n_max}.
-  That index will serve to identify the memory location where the evaluation
-  of the term/predicate is stored for the given tuple of quantifier.
-  The following gives the smallest set of such indexes (hence we use the
-  smallest amount of memory in some respect):
-  To (t_shifted_n, t_shifted_n-1, ..., t_shifted_1)
-  where 0 <= t_shifted_i < beta_i
-  corresponds: \sum_{i=1}^n( t_shifted_i * \pi_{j=1}^{i-1}(beta_j) ) *)
+   a unique index from the set {n | 0 <= n < n_max}.
+   That index will serve to identify the memory location where the evaluation
+   of the term/predicate is stored for the given tuple of quantifier.
+   The following gives the smallest set of such indexes (hence we use the
+   smallest amount of memory in some respect):
+   To (t_shifted_n, t_shifted_n-1, ..., t_shifted_1)
+   where 0 <= t_shifted_i < beta_i
+   corresponds: \sum_{i=1}^n( t_shifted_i * \pi_{j=1}^{i-1}(beta_j) ) *)
 let index_from_sizes_and_shifts ~loc sizes_and_shifts =
   let product terms = List.fold_left
-    (fun product t ->
-      Logic_const.term ~loc (TBinOp(Mult, product, t)) Linteger)
-    (Cil.lone ~loc ())
-    terms
+      (fun product t ->
+         Logic_const.term ~loc (TBinOp(Mult, product, t)) Linteger)
+      (Cil.lone ~loc ())
+      terms
   in
   let sum, _ = List.fold_left
-    (fun (index, sizes) (t_size, t_shifted) ->
-      let pi_beta_j = product sizes in
-      let bi_mult_pi_beta_j =
-        Logic_const.term ~loc (TBinOp(Mult, t_shifted, pi_beta_j)) Linteger
-      in
-      let sum = Logic_const.term
-        ~loc
-        (TBinOp(PlusA, bi_mult_pi_beta_j, index))
-        Linteger
-      in
-      sum, t_size :: sizes)
-    (Cil.lzero ~loc (), [])
-    sizes_and_shifts
+      (fun (index, sizes) (t_size, t_shifted) ->
+         let pi_beta_j = product sizes in
+         let bi_mult_pi_beta_j =
+           Logic_const.term ~loc (TBinOp(Mult, t_shifted, pi_beta_j)) Linteger
+         in
+         let sum = Logic_const.term
+             ~loc
+             (TBinOp(PlusA, bi_mult_pi_beta_j, index))
+             Linteger
+         in
+         sum, t_size :: sizes)
+      (Cil.lzero ~loc (), [])
+      sizes_and_shifts
   in
   sum
 
@@ -225,62 +225,63 @@ let to_exp ~loc kf env pot label =
   in
   (* Creating the pointer *)
   let ty = match pot with
-  | Lscope.PoT_pred _ ->
-    Cil.intType
-  | Lscope.PoT_term t ->
-    begin match Typing.get_number_ty t with
-    | Typing.(C_integer _ | C_float _ | Nan) ->
-      Typing.get_typ t
-    | Typing.(Rational | Real) ->
-      Error.not_yet "\\at on purely logic variables and over real type"
-    | Typing.Gmpz ->
-      Error.not_yet "\\at on purely logic variables and over gmp type"
-    end
+    | Lscope.PoT_pred _ ->
+      Cil.intType
+    | Lscope.PoT_term t ->
+      begin match Typing.get_number_ty t with
+        | Typing.(C_integer _ | C_float _ | Nan) ->
+          Typing.get_typ t
+        | Typing.(Rational | Real) ->
+          Error.not_yet "\\at on purely logic variables and over real type"
+        | Typing.Gmpz ->
+          Error.not_yet "\\at on purely logic variables and over gmp type"
+      end
   in
   let ty_ptr = TPtr(ty, []) in
   let vi_at, e_at, env = Env.new_var
-    ~loc
-    ~name:"at"
-    ~scope:Varname.Function
-    env
-    kf
-    None
-    ty_ptr
-    (fun vi e ->
-      (* Handle [malloc] and [free] stmts *)
-      let lty_sizeof = Ctype Cil.(theMachine.typeOfSizeOf) in
-      let t_sizeof = Logic_const.term ~loc (TSizeOf ty) lty_sizeof in
-      let t_size = size_from_sizes_and_shifts ~loc sizes_and_shifts in
-      let t_size =
-        Logic_const.term ~loc (TBinOp(Mult, t_sizeof, t_size)) lty_sizeof
-      in
-      Typing.type_term ~use_gmp_opt:false t_size;
-      let malloc_stmt = match Typing.get_number_ty t_size with
-      | Typing.C_integer IInt ->
-        let e_size, _ = term_to_exp kf env t_size in
-        let e_size = Cil.constFold false e_size in
-        let malloc_stmt =
-          Constructor.mk_lib_call ~loc
-            ~result:(Cil.var vi)
-            "malloc"
-            [ e_size ]
-        in
-        malloc_stmt
-      | Typing.(C_integer _ | C_float _ | Gmpz) ->
-        Error.not_yet
-          "\\at on purely logic variables that needs to allocate \
-           too much memory (bigger than int_max bytes)"
-      | Typing.(Rational | Real | Nan) ->
-        Error.not_yet "quantification over non-integer type"
-      in
-      let free_stmt = Constructor.mk_lib_call ~loc "free" [e] in
-      (* The list of stmts returned by the current closure are inserted
-        LOCALLY to the block where the new var is FIRST used, whatever scope
-        is indicated to [Env.new_var].
-        Thus we need to add [malloc] and [free] through dedicated functions. *)
-      Malloc.add kf malloc_stmt;
-      Free.add kf free_stmt;
-      [])
+      ~loc
+      ~name:"at"
+      ~scope:Varname.Function
+      env
+      kf
+      None
+      ty_ptr
+      (fun vi e ->
+         (* Handle [malloc] and [free] stmts *)
+         let lty_sizeof = Ctype Cil.(theMachine.typeOfSizeOf) in
+         let t_sizeof = Logic_const.term ~loc (TSizeOf ty) lty_sizeof in
+         let t_size = size_from_sizes_and_shifts ~loc sizes_and_shifts in
+         let t_size =
+           Logic_const.term ~loc (TBinOp(Mult, t_sizeof, t_size)) lty_sizeof
+         in
+         Typing.type_term ~use_gmp_opt:false t_size;
+         let malloc_stmt = match Typing.get_number_ty t_size with
+           | Typing.C_integer IInt ->
+             let e_size, _ = term_to_exp kf env t_size in
+             let e_size = Cil.constFold false e_size in
+             let malloc_stmt =
+               Smart_stmt.lib_call ~loc
+                 ~result:(Cil.var vi)
+                 "malloc"
+                 [ e_size ]
+             in
+             malloc_stmt
+           | Typing.(C_integer _ | C_float _ | Gmpz) ->
+             Error.not_yet
+               "\\at on purely logic variables that needs to allocate \
+                too much memory (bigger than int_max bytes)"
+           | Typing.(Rational | Real | Nan) ->
+             Error.not_yet "quantification over non-integer type"
+         in
+         let free_stmt = Smart_stmt.lib_call ~loc "free" [e] in
+         (* The list of stmts returned by the current closure are inserted
+            LOCALLY to the block where the new var is FIRST used, whatever scope
+            is indicated to [Env.new_var].
+            Thus we need to add [malloc] and [free] through dedicated functions.
+         *)
+         Malloc.add kf malloc_stmt;
+         Free.add kf free_stmt;
+         [])
   in
   (* Index *)
   let t_index = index_from_sizes_and_shifts ~loc sizes_and_shifts in
@@ -295,34 +296,34 @@ let to_exp ~loc kf env pot label =
       let e, env = named_predicate_to_exp kf env p in
       let e = Cil.constFold false e in
       let storing_stmt =
-        Constructor.mk_assigns ~loc ~result:lval e
+        Smart_stmt.assigns ~loc ~result:lval e
       in
       let block, env =
         Env.pop_and_get env storing_stmt ~global_clear:false Env.After
       in
       (* We CANNOT return [block.bstmts] because it does NOT contain
-        variable declarations. *)
-      [ Constructor.mk_block_stmt block ], env
+         variable declarations. *)
+      [ Smart_stmt.block_stmt block ], env
     | Lscope.PoT_term t ->
       begin match Typing.get_number_ty t with
-      | Typing.(C_integer _ | C_float _ | Nan) ->
-        let env = Env.push env in
-        let lval, env = lval_at_index ~loc kf env (e_at, vi_at, t_index) in
-        let e, env = term_to_exp kf env t in
-        let e = Cil.constFold false e in
-        let storing_stmt =
-         Constructor.mk_assigns ~loc ~result:lval e
-        in
-        let block, env =
-          Env.pop_and_get env storing_stmt ~global_clear:false Env.After
-        in
-        (* We CANNOT return [block.bstmts] because it does NOT contain
-          variable declarations. *)
-        [ Constructor.mk_block_stmt block ], env
-      | Typing.(Rational | Real) ->
-        Error.not_yet "\\at on purely logic variables and over real type"
-      | Typing.Gmpz ->
-        Error.not_yet "\\at on purely logic variables and over gmp type"
+        | Typing.(C_integer _ | C_float _ | Nan) ->
+          let env = Env.push env in
+          let lval, env = lval_at_index ~loc kf env (e_at, vi_at, t_index) in
+          let e, env = term_to_exp kf env t in
+          let e = Cil.constFold false e in
+          let storing_stmt =
+            Smart_stmt.assigns ~loc ~result:lval e
+          in
+          let block, env =
+            Env.pop_and_get env storing_stmt ~global_clear:false Env.After
+          in
+          (* We CANNOT return [block.bstmts] because it does NOT contain
+             variable declarations. *)
+          [ Smart_stmt.block_stmt block ], env
+        | Typing.(Rational | Real) ->
+          Error.not_yet "\\at on purely logic variables and over real type"
+        | Typing.Gmpz ->
+          Error.not_yet "\\at on purely logic variables and over gmp type"
       end
   in
   (* Storing loops *)
@@ -333,16 +334,16 @@ let to_exp ~loc kf env pot label =
   in
   let storing_loops_block = Cil.mkBlock storing_loops_stmts in
   let storing_loops_block, env = Env.pop_and_get
-    env
-    (Constructor.mk_block_stmt storing_loops_block)
-    ~global_clear:false
-    Env.After
+      env
+      (Smart_stmt.block_stmt storing_loops_block)
+      ~global_clear:false
+      Env.After
   in
   (* Put at label *)
   let env = put_block_at_label env kf storing_loops_block label in
   (* Returning *)
   let lval_at_index, env = lval_at_index ~loc kf env (e_at, vi_at, t_index) in
-  let e = Constructor.mk_lval ~loc lval_at_index in
+  let e = Smart_exp.lval ~loc lval_at_index in
   e, env
 
 (*
diff --git a/src/plugins/e-acsl/src/code_generator/at_with_lscope.mli b/src/plugins/e-acsl/src/code_generator/at_with_lscope.mli
index f5b51d739bd4de58a55583a2e68cd2f95696b87e..0a971045fddfe3d0cc9ec1f9a90a6fdf982a46ed 100644
--- a/src/plugins/e-acsl/src/code_generator/at_with_lscope.mli
+++ b/src/plugins/e-acsl/src/code_generator/at_with_lscope.mli
@@ -24,7 +24,7 @@ open Cil_types
 open Cil_datatype
 
 (* Convert \at on terms or predicates in which we can find purely
-  logic variable. *)
+   logic variable. *)
 
 (**************************************************************************)
 (*************************** Translation **********************************)
@@ -39,8 +39,8 @@ val to_exp:
 (*****************************************************************************)
 
 (* The different possible evaluations of the [\at] under study are
-  stored in a memory location that needs to be alloted then freed.
-  This part is designed for that purpose. *)
+   stored in a memory location that needs to be alloted then freed.
+   This part is designed for that purpose. *)
 
 module Malloc: sig
   val find_all: kernel_function -> stmt list
diff --git a/src/plugins/e-acsl/src/code_generator/contract.ml b/src/plugins/e-acsl/src/code_generator/contract.ml
new file mode 100644
index 0000000000000000000000000000000000000000..7a8291e0b66e658b7660e7feb38e681c89c084fb
--- /dev/null
+++ b/src/plugins/e-acsl/src/code_generator/contract.ml
@@ -0,0 +1,753 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of the Frama-C's E-ACSL plug-in.                    *)
+(*                                                                        *)
+(*  Copyright (C) 2012-2020                                               *)
+(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
+(*         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 Cil_types
+open Contract_types
+
+(**************************************************************************)
+(********************** Forward references ********************************)
+(**************************************************************************)
+
+let must_translate_ppt_ref : (Property.t -> bool) ref =
+  Extlib.mk_fun "must_translate_ppt_ref"
+
+let must_translate_ppt_opt_ref : (Property.t option -> bool) ref =
+  Extlib.mk_fun "must_translate_ppt_opt_ref"
+
+(**************************************************************************)
+(********************** Contract ********************************)
+(**************************************************************************)
+
+type t = contract
+
+(** Module to ease the access to the C API for contracts *)
+module Rtl_call: sig
+  val init:
+    loc:location -> result_name:string -> Env.t -> kernel_function -> int ->
+    varinfo * exp * Env.t
+  (** Call the C function [__e_acsl_contract_init] *)
+
+  val cleanup:
+    loc:location -> Env.t -> kernel_function -> exp -> Env.t
+  (** Call the C function [__e_acsl_contract_cleanup] *)
+
+  val set_assumes:
+    loc:location -> Env.t -> kernel_function -> exp -> int -> predicate ->
+    Env.t
+  (** Call the C function [__e_acsl_contract_set_behavior_assumes] *)
+
+  val get_assumes:
+    loc:location -> result:varinfo -> Env.t -> kernel_function -> exp -> int ->
+    Env.t
+  (** Call the C function [__e_acsl_contract_get_behavior_assumes] *)
+
+  val partial_count_behaviors:
+    loc:location -> result:varinfo -> Env.t -> kernel_function -> exp ->
+    int list -> Env.t
+  (** Call the C function [__e_acsl_contract_partial_count_behaviors] *)
+
+  val partial_count_all_behaviors:
+    loc:location -> result:varinfo -> Env.t -> kernel_function -> exp -> Env.t
+    (** Call the C function [__e_acsl_contract_partial_count_all_behaviors] *)
+
+end = struct
+  let init_function_name = "contract_init"
+
+  let init_kf_lazy =
+    lazy
+      (Globals.Functions.find_by_name
+         (Functions.RTL.mk_api_name init_function_name))
+
+  let ctyp_lazy =
+    lazy
+      (Globals.Types.find_type
+         Logic_typing.Typedef (Functions.RTL.mk_api_name "contract_t"))
+
+  let init ~loc ~result_name env kf count =
+    (* Tell Eva to use init as a builtin *)
+    let init_kf = Lazy.force init_kf_lazy in
+    Dep_eva.use_builtin init_kf "Frama_C_malloc";
+    (* Add a call to init in the environment *)
+    let ty = TPtr(Lazy.force ctyp_lazy, []) in
+    Env.new_var
+      ~loc
+      ~name:result_name
+      ~scope:Varname.Function
+      env
+      kf
+      None
+      ty
+      (fun vi _e ->
+         let result = Cil.var vi in
+         let count_e = Cil.integer ~loc count in
+         [ Smart_stmt.rtl_call
+             ~loc
+             ~result
+             init_function_name
+             [count_e] ])
+
+  let cleanup ~loc env kf contract =
+    Env.add_stmt
+      env
+      kf
+      (Smart_stmt.rtl_call
+         ~loc
+         "contract_clean"
+         [contract])
+
+  let set_assumes ~loc env kf contract idx assumes =
+    let idx_e = Cil.integer ~loc idx in
+    let assumes_e, env =
+      Translate.generalized_untyped_predicate_to_exp kf env assumes
+    in
+    Env.add_stmt
+      env
+      kf
+      (Smart_stmt.rtl_call
+         ~loc
+         "contract_set_behavior_assumes"
+         [contract; idx_e; assumes_e])
+
+  let get_assumes ~loc ~result env kf contract idx =
+    let idx_e = Cil.integer ~loc idx in
+    let result = Cil.var result in
+    Env.add_stmt
+      env
+      kf
+      (Smart_stmt.rtl_call
+         ~loc
+         ~result
+         "contract_get_behavior_assumes"
+         [contract; idx_e])
+
+  let partial_count_behaviors ~loc ~result env kf contract idxes =
+    let idxes, count =
+      List.fold_right
+        (fun idx (idxes, count) ->
+           Cil.integer ~loc idx :: idxes, count + 1)
+        idxes
+        ([], 0)
+    in
+    let result = Cil.var result in
+    Env.add_stmt
+      env
+      kf
+      (Smart_stmt.rtl_call
+         ~loc
+         ~result
+         "contract_partial_count_behaviors"
+         (contract :: Cil.integer ~loc count :: idxes))
+
+  let partial_count_all_behaviors ~loc ~result env kf contract =
+    let result = Cil.var result in
+    Env.add_stmt
+      env
+      kf
+      (Smart_stmt.rtl_call
+         ~loc
+         ~result
+         "contract_partial_count_all_behaviors"
+         [ contract ])
+end
+
+(** Convert the given assumes clauses list to a single [predicate] *)
+let assumes_predicate assumes =
+  List.fold_left
+    (fun acc p ->
+       let pred = p.ip_content.tp_statement in
+       let loc = pred.pred_loc in
+       Logic_const.pand ~loc
+         (acc,
+          Logic_const.unamed ~loc pred.pred_content))
+    Logic_const.ptrue
+    assumes
+
+(** Create a [predicate] from the requires [identified_predicate] *)
+let requires_predicate requires =
+  let pred = requires.ip_content.tp_statement in
+  let loc = pred.pred_loc in
+  let p = Logic_const.unamed ~loc pred.pred_content
+  in
+  p
+
+(** Create a [predicate] from the ensures [identified_predicate] *)
+let ensures_predicate ensures =
+  let pred = ensures.ip_content.tp_statement in
+  let loc = pred.pred_loc in
+  let p = Logic_const.unamed ~loc pred.pred_content
+  in
+  p
+
+let create ~loc spec =
+  (* Create a hashtable to associate a behavior name with an index *)
+  let name_to_idx_tbl = Hashtbl.create 7 in
+  let named_behaviors_count =
+    List.fold_left
+      (fun idx b ->
+         if Cil.is_default_behavior b then
+           idx
+         else begin
+           Hashtbl.add name_to_idx_tbl b.b_name idx;
+           idx + 1
+         end
+      )
+      0
+      spec.spec_behavior
+  in
+  let var = None in
+  (* Create the contract *)
+  { location = loc;
+    named_behaviors_count;
+    name_to_idx_tbl;
+    var;
+    all_assumes_translated = true;
+    spec }
+
+(** Initialize the C API for the given contract *)
+let init kf env contract =
+  if contract.named_behaviors_count > 0 then
+    let loc = contract.location in
+    let contract_vi, contract_e, env =
+      Rtl_call.init
+        ~loc
+        ~result_name:"contract"
+        env
+        kf
+        contract.named_behaviors_count
+    in
+    contract.var <- Some (contract_vi, contract_e);
+    env
+  else env
+
+(** Cleanup the C API for the given contract *)
+let cleanup kf env contract =
+  match contract.var with
+  | None -> env
+  | Some (_, e) ->
+    let loc = contract.location in
+    Rtl_call.cleanup ~loc env kf e
+
+(** Retrieve the behavior index from its name for the given contract *)
+let get_bhvr_idx contract bhvr_name =
+  (* by construction, the behavior name is in the hashtable *)
+  try Hashtbl.find contract.name_to_idx_tbl bhvr_name
+  with _ -> assert false
+
+(** Retrieve the C variable with the contract structure for the given contract.
+    Assumes that there is such a variable. *)
+let get_contract_var contract =
+  match contract.var with
+  | Some (contract_vi, contract_e) -> contract_vi, contract_e
+  | None ->
+    Options.fatal
+      "Unexpected call to get_contract_var with a contract without named \
+       behaviors"
+
+(** Setup the assumes values for the C API *)
+let setup_assumes kf env contract =
+  match contract.var with
+  | None -> env
+  | Some (_, contract_e) ->
+    let do_fold env b =
+      let do_it env =
+        try
+          if Cil.is_default_behavior b then
+            env
+          else
+            let assumes = assumes_predicate b.b_assumes in
+            let loc = assumes.pred_loc in
+            Cil.CurrentLoc.set loc;
+            let idx = get_bhvr_idx contract b.b_name in
+            Rtl_call.set_assumes ~loc env kf contract_e idx assumes
+        with exn ->
+          (* Unable to translate the assumes clause. Save that fact and re-raise
+             the exception *)
+          contract.all_assumes_translated <- false;
+          raise exn
+      in
+      Env.handle_error do_it env
+    in
+    List.fold_left do_fold env contract.spec.spec_behavior
+
+(** Returns a closure that will (1) creates a local C variable when first
+    called and (2) returns said variable on subsequent calls. *)
+let mk_get_or_create_var kf typ var_name =
+  let var_ref = ref None in
+  let f ~loc env =
+    match !var_ref with
+    | None ->
+      let vi, e, env =
+        Env.new_var
+          ~loc
+          ~scope:Varname.Block
+          ~name:var_name
+          env
+          kf
+          None
+          typ
+          (fun _ _ -> [])
+      in
+      var_ref := Some (vi, e);
+      vi, e, env
+    | Some (vi, e) -> vi, e, env
+  in
+  f
+
+(** Drop-in replacement for [List.fold_left] with the folding function wrapped
+    in a [handle_error] call *)
+let fold_left_handle_error f env l =
+  (* Reverse input args of f *)
+  let f2 x env = f env x in
+  (* Call fold_left on the list with handle_error at each element *)
+  List.fold_left
+    (fun env x ->
+       Env.handle_error (f2 x) env)
+    env
+    l
+
+(** Drop-in replacement for [List.fold_left] when the accumulator is more than
+    the [env], with the folding function wrapped in a [handle_error] call.
+
+    The accumulator for the fold should be set up with a pair where the first
+    element is the environment and the second element the rest of the
+    accumulator. *)
+let fold_left_handle_error_with_args f (env, acc) l =
+  let f2 x (env, args) = f (env, args) x in
+  List.fold_left
+    (fun (env, args) x ->
+       Env.handle_error_with_args (f2 x) (env, args))
+    (env, acc)
+    l
+
+(** Insert requires check for the given contract in the environment *)
+let check_requires kf kinstr env contract =
+  let get_or_create_assumes_var =
+    mk_get_or_create_var kf Cil.intType "assumes_value"
+  in
+  let do_behavior env b =
+    if Cil.is_default_behavior b then
+      fold_left_handle_error
+        (fun env requires ->
+           if !must_translate_ppt_ref
+               (Property.ip_of_requires kf kinstr b requires) then
+             (* If translating the default behavior, directly translate the
+                predicate *)
+             let requires = requires_predicate requires in
+             let loc = requires.pred_loc in
+             Cil.CurrentLoc.set loc;
+             Translate.translate_predicate kf env requires
+           else
+             env)
+        env
+        b.b_requires
+    else
+      (* Compute the assumes predicate for pretty-printing *)
+      let assumes = assumes_predicate b.b_assumes in
+      (* Push a new env and check the requires of the behavior *)
+      let env = Env.push env in
+      let env, stmts =
+        fold_left_handle_error_with_args
+          (fun (env, stmts) requires ->
+             if !must_translate_ppt_ref
+                 (Property.ip_of_requires kf kinstr b requires) then
+               let requires = requires_predicate requires in
+               let loc = requires.pred_loc in
+               Cil.CurrentLoc.set loc;
+               (* Prepend the name of the behavior *)
+               let requires =
+                 { requires with pred_name = b.b_name :: requires.pred_name }
+               in
+               (* Create runtime check *)
+               let requires_e, env =
+                 Translate.generalized_untyped_predicate_to_exp kf env requires
+               in
+               let stmt =
+                 Smart_stmt.runtime_check
+                   Smart_stmt.Precondition
+                   kf
+                   requires_e
+                   requires
+               in
+               env, stmt :: stmts
+             else
+               env, stmts)
+          (env, [])
+          b.b_requires
+      in
+      let requires = Smart_stmt.block_from_stmts stmts in
+      (* Pop the env to build the requires check *)
+      let requires_blk, env =
+        Env.pop_and_get
+          env
+          requires
+          ~global_clear:false
+          Env.Middle
+      in
+      match stmts with
+      | [] ->
+        (* If no requires check have been generated, then return immediately *)
+        env
+      | _ :: _ ->
+        (* Generate a predicate that will retrieve and test the
+           already computed assumes value for the behavior *)
+        let loc = assumes.pred_loc in
+        Cil.CurrentLoc.set loc;
+        let assumes_vi, assumes_e, env =
+          get_or_create_assumes_var ~loc env
+        in
+        let _, contract_e = get_contract_var contract in
+        let idx = get_bhvr_idx contract b.b_name in
+        let env =
+          Rtl_call.get_assumes
+            ~loc
+            ~result:assumes_vi
+            env
+            kf
+            contract_e
+            idx
+        in
+        let stmt = Smart_stmt.if_stmt ~loc ~cond:assumes_e requires_blk in
+        Env.add_stmt env kf stmt
+  in
+  List.fold_left
+    do_behavior
+    env
+    contract.spec.spec_behavior
+
+type translate_ppt =
+  | Complete
+  | Disjoint
+  | Both
+
+(** For each set of behavior names in [clauses], [check_active_behaviors] counts
+    the number of active behaviors and creates assertions for the
+    [ppt_to_translate]. *)
+let check_active_behaviors ~ppt_to_translate ~get_or_create_var kf kinstr env contract clauses =
+  let must_translate = !must_translate_ppt_ref in
+  let loc = contract.location in
+  Cil.CurrentLoc.set loc;
+  let do_clause env bhvrs =
+    let bhvrs_list = Datatype.String.Set.elements bhvrs in
+    let active = [] in (* TODO: 'for' behaviors, e-acsl#109 *)
+    let must_translate_complete =
+      match ppt_to_translate with
+      | Both | Complete ->
+        must_translate (Property.ip_of_complete kf kinstr ~active bhvrs_list)
+      | Disjoint -> false
+    in
+    let must_translate_disjoint =
+      match ppt_to_translate with
+      | Both | Disjoint ->
+        must_translate (Property.ip_of_disjoint kf kinstr ~active bhvrs_list)
+      | Complete -> false
+    in
+
+    if must_translate_complete || must_translate_disjoint then
+      (* Retrieve the number of active behaviors *)
+      let active_bhvrs_e, complete_msg, disjoint_msg, env =
+        let _, contract_e = get_contract_var contract in
+        let vi, e, env = get_or_create_var ~loc env in
+        let clause_card = Datatype.String.Set.cardinal bhvrs in
+        let env, complete_msg, disjoint_msg =
+          if Datatype.Int.equal clause_card contract.named_behaviors_count then
+            let env =
+              Rtl_call.partial_count_all_behaviors
+                ~loc
+                ~result:vi
+                env
+                kf
+                contract_e
+            in
+            let complete_msg = "all behaviors complete" in
+            let disjoint_msg = "all behaviors disjoint" in
+            env, complete_msg, disjoint_msg
+          else
+            let args, bhvrs_names =
+              Datatype.String.Set.fold
+                (fun bhvr_name (args, bhvrs_names) ->
+                   let args = get_bhvr_idx contract bhvr_name :: args in
+                   let bhvrs_names = bhvr_name :: bhvrs_names in
+                   args, bhvrs_names)
+                bhvrs
+                ([], [])
+            in
+            let env =
+              Rtl_call.partial_count_behaviors
+                ~loc
+                ~result:vi
+                env
+                kf
+                contract_e
+                args
+            in
+            let bhvrs_names = String.concat ", " bhvrs_names in
+            let complete_msg =
+              Format.sprintf "complete behaviors %s" bhvrs_names
+            in
+            let disjoint_msg =
+              Format.sprintf "disjoint behaviors %s" bhvrs_names
+            in
+            env, complete_msg, disjoint_msg
+        in
+        e, complete_msg, disjoint_msg, env
+      in
+
+      (* Create assertions for complete and disjoint behaviors checks *)
+      let create_assert_stmt bop msg =
+        Smart_stmt.runtime_check_with_msg
+          ~loc
+          msg
+          (Env.annotation_kind env)
+          kf
+          (Cil.mkBinOp ~loc bop active_bhvrs_e (Cil.one ~loc))
+      in
+      let assert_complete_stmt = create_assert_stmt Ge complete_msg in
+      let assert_disjoint_stmt = create_assert_stmt Le disjoint_msg in
+
+      if must_translate_complete && must_translate_disjoint then
+        (* Build an enclosing [if] if both complete and disjoint must be checked
+           for the given clause *)
+        Env.add_stmt
+          env
+          kf
+          (Smart_stmt.if_stmt
+             ~loc
+             ~cond:(Cil.mkBinOp ~loc Ne active_bhvrs_e (Cil.one ~loc))
+             (Cil.mkBlock [ assert_complete_stmt; assert_disjoint_stmt ]))
+          (* Otherwise just get the corresponding assertion *)
+      else if must_translate_complete then
+        Env.add_stmt env kf assert_complete_stmt
+      else if must_translate_disjoint then
+        Env.add_stmt env kf assert_disjoint_stmt
+      else
+        (* By construction, at least either [must_translate_complete] or
+           [must_translate_disjoint] is true *)
+        assert false
+    else
+      (* Nothing to translate *)
+      env
+  in
+  fold_left_handle_error do_clause env clauses
+
+(** Insert complete and disjoint behaviors check for the given contract in the
+    environement *)
+let check_complete_and_disjoint kf kinstr env contract =
+  (* Only translate the complete and disjoint clauses if all the assumes clauses
+     could be translated *)
+  if contract.all_assumes_translated then
+    (* Partition the complete and disjoint clauses of the contract into 3 lists:
+       - The complete and disjoint list
+       - The complete list
+       - The disjoint list
+
+       The behaviors of a clause are stored in a Set so that they are
+       automatically sorted, the duplicates are removed, and they can be compared
+       for equality.
+    *)
+    let completes =
+      List.map
+        Datatype.String.Set.of_list
+        contract.spec.spec_complete_behaviors
+    in
+    let completes_and_disjoints, completes, disjoints =
+      List.fold_left
+        (fun (completes_and_disjoints, completes, disjoints) clause ->
+           let clause = Datatype.String.Set.of_list clause in
+           if List.mem clause completes then
+             let completes_and_disjoints = clause :: completes_and_disjoints in
+             let completes =
+               List.filter
+                 (fun c -> not (Datatype.String.Set.equal clause c))
+                 completes
+             in
+             completes_and_disjoints, completes, disjoints
+           else
+             let disjoints = clause :: disjoints in
+             completes_and_disjoints, completes, disjoints
+        )
+        ([], completes, [])
+        contract.spec.spec_disjoint_behaviors
+    in
+    (* Create a common variable to hold the number of active behavior for the
+       current check *)
+    let get_or_create_var = mk_get_or_create_var kf Cil.intType "active_bhvrs" in
+    (* Check the complete and disjoint clauses *)
+    let check_bhvrs env ppt_to_translate bhvrs =
+      check_active_behaviors
+        ~ppt_to_translate
+        ~get_or_create_var
+        kf
+        kinstr
+        env
+        contract
+        bhvrs
+    in
+    let env = check_bhvrs env Both completes_and_disjoints in
+    let env = check_bhvrs env Complete completes in
+    let env = check_bhvrs env Disjoint disjoints in
+    env
+  else begin
+    Cil.CurrentLoc.set contract.location;
+    Options.warning
+      ~current:true
+      "@[Some assumes clauses couldn't be translated.@ Ignoring complete and \
+       disjoint behaviors annotations.@]";
+    env
+  end
+
+(** Insert ensures check for the given contract in the environement *)
+let check_post_conds kf kinstr env contract =
+  let get_or_create_assumes_var =
+    mk_get_or_create_var kf Cil.intType "assumes_value"
+  in
+  let do_behavior env b =
+    let env =
+      Env.handle_error
+        (fun env ->
+           let active = [] in (* TODO: 'for' behaviors, e-acsl#109 *)
+           let ppt = Property.ip_assigns_of_behavior kf kinstr ~active b in
+           if b.b_assigns <> WritesAny && !must_translate_ppt_opt_ref ppt
+           then Env.not_yet env "assigns clause in behavior";
+           (* ignore b.b_extended since we never translate them *)
+           env)
+        env
+    in
+    if Cil.is_default_behavior b then
+      fold_left_handle_error
+        (fun env ((termination, post_cond) as tp) ->
+           if !must_translate_ppt_ref
+               (Property.ip_of_ensures kf kinstr b tp) then
+             let post_cond = ensures_predicate post_cond in
+             let loc = post_cond.pred_loc in
+             Cil.CurrentLoc.set loc;
+             match termination with
+             | Normal ->
+               (* If translating the default behavior, directly translate the
+                  predicate *)
+               Translate.translate_predicate kf env post_cond
+             | Exits | Breaks | Continues | Returns ->
+               Error.process_error
+                 (Error.not_yet "abnormal termination case in behavior");
+               env
+           else
+             env)
+        env
+        b.b_post_cond
+    else
+      (* Compute the assumes predicate for pretty printing *)
+      let assumes = assumes_predicate b.b_assumes in
+      (* Push a new env and check the ensures of the behavior *)
+      let env = Env.push env in
+      let env, stmts =
+        fold_left_handle_error_with_args
+          (fun (env, stmts) ((termination, post_cond) as tp) ->
+             if !must_translate_ppt_ref
+                 (Property.ip_of_ensures kf kinstr b tp) then
+               let post_cond = ensures_predicate post_cond in
+               let loc = post_cond.pred_loc in
+               Cil.CurrentLoc.set loc;
+               match termination with
+               | Normal ->
+                 (* Prepend the name of the behavior *)
+                 let post_cond =
+                   { post_cond with pred_name = b.b_name :: post_cond.pred_name }
+                 in
+                 (* Create runtime check *)
+                 let post_cond_e, env =
+                   Translate.generalized_untyped_predicate_to_exp kf env post_cond
+                 in
+                 let stmt =
+                   Smart_stmt.runtime_check
+                     Smart_stmt.Postcondition
+                     kf
+                     post_cond_e
+                     post_cond
+                 in
+                 env, stmt :: stmts
+               | Exits | Breaks | Continues | Returns ->
+                 Error.process_error (Error.not_yet "abnormal termination case in behavior");
+                 env, stmts
+             else
+               env, stmts)
+          (env, [])
+          b.b_post_cond
+      in
+      let post_cond = Smart_stmt.block_from_stmts stmts in
+      (* Pop the env to build the post_cond check *)
+      let post_cond_blk, env =
+        Env.pop_and_get
+          env
+          post_cond
+          ~global_clear:false
+          Env.Middle
+      in
+      match stmts with
+      | [] ->
+        (* If no post_cond check have been generated, then return immediately *)
+        env
+      | _ :: _ ->
+        (* Generate a predicate that retrieves and tests the already
+           computed assumes value for the behavior *)
+        let loc = assumes.pred_loc in
+        let assumes_vi, assumes_e, env =
+          get_or_create_assumes_var ~loc env
+        in
+        let _, contract_e = get_contract_var contract in
+        let idx = get_bhvr_idx contract b.b_name in
+        let env =
+          Rtl_call.get_assumes
+            ~loc
+            ~result:assumes_vi
+            env
+            kf
+            contract_e
+            idx
+        in
+        let stmt = Smart_stmt.if_stmt ~loc ~cond:assumes_e post_cond_blk in
+        Env.add_stmt env kf stmt
+  in
+  List.fold_left
+    do_behavior
+    env
+    contract.spec.spec_behavior
+
+let translate_preconditions kf kinstr env contract =
+  let env = Env.set_annotation_kind env Smart_stmt.Precondition in
+  let env = Env.push_contract env contract in
+  let env = init kf env contract in
+  let env = setup_assumes kf env contract in
+  let do_it env =
+    let env = check_requires kf kinstr env contract in
+    let env = check_complete_and_disjoint kf kinstr env contract in
+    env
+  in
+  Env.handle_error do_it env
+
+let translate_postconditions kf kinstr env =
+  let env = Env.set_annotation_kind env Smart_stmt.Postcondition in
+  let contract, env = Env.pop_and_get_contract env in
+  let do_it env =
+    let env = check_post_conds kf kinstr env contract in
+    env
+  in
+  let env = Env.handle_error do_it env in
+  cleanup kf env contract
diff --git a/src/plugins/e-acsl/src/code_generator/contract.mli b/src/plugins/e-acsl/src/code_generator/contract.mli
new file mode 100644
index 0000000000000000000000000000000000000000..0b7732602334736cc9d258c4867bd6b57e028f66
--- /dev/null
+++ b/src/plugins/e-acsl/src/code_generator/contract.mli
@@ -0,0 +1,47 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of the Frama-C's E-ACSL plug-in.                    *)
+(*                                                                        *)
+(*  Copyright (C) 2012-2020                                               *)
+(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
+(*         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 Cil_types
+open Contract_types
+
+(** Translate a given ACSL contract (function or statement) into the
+    corresponding C statement for runtime assertion checking. *)
+
+type t = contract
+
+val create: loc:location -> spec -> t
+(** Create a contract from a [spec] object (either function spec or statement
+    spec) *)
+
+val translate_preconditions: kernel_function -> kinstr -> Env.t -> t -> Env.t
+(** Translate the preconditions of the given contract into the environement *)
+
+val translate_postconditions: kernel_function -> kinstr -> Env.t -> Env.t
+(** Translate the postconditions of the given contract into the environment *)
+
+(**************************************************************************)
+(********************** Forward references ********************************)
+(**************************************************************************)
+
+val must_translate_ppt_ref: (Property.t -> bool) ref
+
+val must_translate_ppt_opt_ref: (Property.t option -> bool) ref
diff --git a/src/plugins/e-acsl/src/code_generator/contract_types.ml b/src/plugins/e-acsl/src/code_generator/contract_types.ml
new file mode 100644
index 0000000000000000000000000000000000000000..adef414cc84636870d1c2d5167cf48384e6958e5
--- /dev/null
+++ b/src/plugins/e-acsl/src/code_generator/contract_types.ml
@@ -0,0 +1,51 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of the Frama-C's E-ACSL plug-in.                    *)
+(*                                                                        *)
+(*  Copyright (C) 2012-2020                                               *)
+(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
+(*         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 Cil_types
+
+(** Represent a function or statement contract. *)
+type contract = {
+  location: location;
+  (** Location of the function or statement attached to the contract. *)
+
+  named_behaviors_count: int;
+  (** Number of named behaviors in the contract
+      (excluding the default behavior) *)
+
+  name_to_idx_tbl: (string, int) Hashtbl.t;
+  (** Hashtable associating the name of a behavior with its index in the C API
+      structure used to store behaviors information at runtime. *)
+
+  mutable var: (varinfo * exp) option;
+  (** Elements to access the C API structure used to store contracts
+      information at runtime. *)
+
+  mutable all_assumes_translated: bool;
+  (** True if all the assumes clauses of the contract could be translated, false
+      otherwise.
+
+      If even one assume clause can't be translated, then the complete and
+      disjoint clauses can't be computed. *)
+
+  spec: spec
+  (** Specification for the contract *)
+}
diff --git a/src/plugins/e-acsl/src/code_generator/env.ml b/src/plugins/e-acsl/src/code_generator/env.ml
index e457ac5c2264548399b60b7ed77206f49cd6973e..595dc566e1e836413c056e3c2c462ff3fedcf11a 100644
--- a/src/plugins/e-acsl/src/code_generator/env.ml
+++ b/src/plugins/e-acsl/src/code_generator/env.ml
@@ -23,6 +23,7 @@
 module E_acsl_label = Label
 open Cil_types
 open Cil_datatype
+open Contract_types
 
 type localized_scope =
   | LGlobal
@@ -56,12 +57,14 @@ type local_env = {
 type t = {
   lscope: Lscope.t;
   lscope_reset: bool;
-  annotation_kind: Constructor.annotation_kind;
+  annotation_kind: Smart_stmt.annotation_kind;
   new_global_vars: (varinfo * localized_scope) list;
   (* generated variables. The scope indicates the level where the variable
      should be added. *)
   global_mp_tbl: mp_tbl;
   env_stack: local_env list;
+  contract_stack: contract list;
+  (* Stack of contracts for active functions and statements *)
   var_mapping: Varinfo.t Stack.t Logic_var.Map.t;
   (* records of C bindings for logic vars *)
   loop_invariants: predicate list list;
@@ -88,10 +91,11 @@ let empty_local_env =
 let empty =
   { lscope = Lscope.empty;
     lscope_reset = true;
-    annotation_kind = Constructor.Assertion;
+    annotation_kind = Smart_stmt.Assertion;
     new_global_vars = [];
     global_mp_tbl = empty_mp_tbl;
     env_stack = [];
+    contract_stack = [];
     var_mapping = Logic_var.Map.empty;
     loop_invariants = [];
     cpt = 0 }
@@ -257,7 +261,7 @@ let rtl_call_to_new_var ~loc ?scope ?name env kf t ty func_name args =
       t
       ty
       (fun v _ ->
-         [ Constructor.mk_rtl_call ~loc ~result:(Cil.var v) func_name args ])
+         [ Smart_stmt.rtl_call ~loc ~result:(Cil.var v) func_name args ])
   in
   exp, env
 
@@ -351,9 +355,9 @@ let add_stmt ?(post=false) ?before env kf stmt =
   { env with env_stack = local_env :: tl }
 
 let extend_stmt_in_place env stmt ~label block =
-  let new_stmt = Constructor.mk_block_stmt block in
+  let new_stmt = Smart_stmt.block_stmt block in
   let sk = stmt.skind in
-  stmt.skind <- Block (Cil.mkBlock [ new_stmt; Constructor.mk_stmt sk ]);
+  stmt.skind <- Block (Cil.mkBlock [ new_stmt; Smart_stmt.stmt sk ]);
   let pre = match label with
     | BuiltinLabel(Here | Post) -> true
     | BuiltinLabel(Old | Pre | LoopEntry | LoopCurrent | Init)
@@ -447,7 +451,7 @@ let pop_and_get ?(split=false) env stmt ~global_clear where =
        add the given [stmt] afterwards. This way, we have the guarantee that
        the final block does not contain any local, so may be transient. *)
     if split then
-      let sblock = Constructor.mk_block_stmt b in
+      let sblock = Smart_stmt.block_stmt b in
       Cil.transient_block (Cil.mkBlock [ sblock; stmt ])
     else
       b
@@ -491,6 +495,40 @@ module Context = struct
 
 end
 
+let handle_error f env =
+  let env = Error.handle f env in
+  Context.restore env
+
+let handle_error_with_args f (env, args) =
+  let env, args = Error.handle f (env, args) in
+  let env = Context.restore env in
+  env, args
+
+let not_yet env s =
+  Context.save env;
+  Error.not_yet s
+
+let untypable env s =
+  Context.save env;
+  Error.untypable s
+
+let push_contract env contract =
+  { env with contract_stack = contract :: env.contract_stack }
+
+let top_contract env =
+  match env.contract_stack with
+  | [] -> Options.fatal "Contract list is empty in env. That is unexpected"
+  | hd :: tl -> hd, tl
+
+let pop_and_get_contract env =
+  let hd, tl = top_contract env in
+  hd, { env with contract_stack = tl }
+
+let pop_contract env =
+  let _, env = pop_and_get_contract env in
+  env
+
+
 (* debugging purpose *)
 let pretty fmt env =
   let local_env, _ = top env in
diff --git a/src/plugins/e-acsl/src/code_generator/env.mli b/src/plugins/e-acsl/src/code_generator/env.mli
index 847b551cacb7222e4efdf9f1448012bcc655496a..3a5aebf2f5d4f1a0ea67af77099032535365f8e7 100644
--- a/src/plugins/e-acsl/src/code_generator/env.mli
+++ b/src/plugins/e-acsl/src/code_generator/env.mli
@@ -21,6 +21,7 @@
 (**************************************************************************)
 
 open Cil_types
+open Contract_types
 
 (** Environments.
 
@@ -148,8 +149,8 @@ end
 (** {2 Current annotation kind} *)
 (* ************************************************************************** *)
 
-val annotation_kind: t -> Constructor.annotation_kind
-val set_annotation_kind: t -> Constructor.annotation_kind -> t
+val annotation_kind: t -> Smart_stmt.annotation_kind
+val set_annotation_kind: t -> Smart_stmt.annotation_kind -> t
 
 (* ************************************************************************** *)
 (** {2 Loop invariants} *)
@@ -175,6 +176,36 @@ module Context: sig
   val restore: t -> t
 end
 
+val handle_error: (t -> t) -> t -> t
+(** Run the closure with the given environment and handle potential errors.
+    Restore the globals of the environment to the last time [Env.Context.save]
+    was called and return it in case of errors. *)
+
+val handle_error_with_args: (t * 'a -> t * 'a) -> t * 'a -> t * 'a
+(** Run the closure with the given environment and arguments  and handle
+    potential errors.
+    Restore the globals of the environment to the last time [Env.Context.save]
+    was called and return it in case of errors. *)
+
+val not_yet: t -> string -> 'a
+(** Save the current context and raise [Error.Not_yet] exception. *)
+
+val untypable: t -> string -> 'a
+(** Save the current context and raise [Error.Typing_error] exception. *)
+
+(* ************************************************************************** *)
+(** {2 Contracts} *)
+(* ************************************************************************** *)
+
+val push_contract: t -> contract -> t
+(** Push a contract to the environment's stack *)
+val top_contract: t -> contract * contract list
+(** Return the top contract of the environment's stack *)
+val pop_and_get_contract: t -> contract * t
+(** Pop and return the top contract of the environment's stack *)
+val pop_contract: t -> t
+(** Pop the top contract of the environment's stack *)
+
 val pretty: Format.formatter -> t -> unit
 
 (*
diff --git a/src/plugins/e-acsl/src/code_generator/global_observer.ml b/src/plugins/e-acsl/src/code_generator/global_observer.ml
index ab1d0ed88db4408e4dd14635e8291350f6666ba8..352152f2c2a83846935cd323e03bf0838cf5fb99 100644
--- a/src/plugins/e-acsl/src/code_generator/global_observer.ml
+++ b/src/plugins/e-acsl/src/code_generator/global_observer.ml
@@ -24,7 +24,7 @@ open Cil_types
 open Cil_datatype
 
 let function_init_name = Functions.RTL.mk_api_name "globals_init"
-let function_delete_name = Functions.RTL.mk_api_name "globals_delete"
+let function_clean_name = Functions.RTL.mk_api_name "globals_clean"
 
 (* Hashtable mapping global variables (as Cil_type.varinfo) to their
    initializers (if any).
@@ -43,11 +43,11 @@ let is_empty () = Varinfo.Hashtbl.length tbl = 0
    Initializers (used to capture literal strings) are added through
    [add_initializer] below. *)
 let add vi =
-  if Mmodel_analysis.must_model_vi vi then
+  if Memory_tracking.must_monitor_vi vi then
     Varinfo.Hashtbl.replace tbl vi (ref [])
 
 let add_initializer vi offset init =
-  if Mmodel_analysis.must_model_vi vi then
+  if Memory_tracking.must_monitor_vi vi then
     try
       let l = Varinfo.Hashtbl.find tbl vi in
       l := (offset, init) :: !l
@@ -60,11 +60,11 @@ let rec literal_in_initializer env kf = function
   | CompoundInit (_, l) ->
     List.fold_left (fun env (_, i) -> literal_in_initializer env kf i) env l
 
-(* Create a global kernel function named `name`.
+(* Create a global kernel function named [name].
    Return a triple (varinfo * fundec * kernel_function) of the created
    global function. *)
 let mk_function name =
-  (* Create global function `name` *)
+  (* Create global function [name] *)
   let vi =
     Cil.makeGlobalVar ~source:true
       name
@@ -123,8 +123,8 @@ let mk_init_function () =
          if Misc.is_fc_or_compiler_builtin vi then stmts
          else
            (* a global is both allocated and initialized *)
-           Constructor.mk_store_stmt vi
-           :: Constructor.mk_initialize ~loc:Location.unknown (Cil.var vi)
+           Smart_stmt.store_stmt vi
+           :: Smart_stmt.initialize ~loc:Location.unknown (Cil.var vi)
            :: stmts)
       tbl
       stmts
@@ -136,10 +136,10 @@ let mk_init_function () =
          let loc = Location.unknown in
          let e = Cil.new_exp ~loc:loc (Const (CStr s)) in
          let str_size = Cil.new_exp loc (SizeOfStr s) in
-         Constructor.mk_assigns ~loc ~result:(Cil.var vi) e
-         :: Constructor.mk_store_stmt ~str_size vi
-         :: Constructor.mk_full_init_stmt vi
-         :: Constructor.mk_mark_readonly vi
+         Smart_stmt.assigns ~loc ~result:(Cil.var vi) e
+         :: Smart_stmt.store_stmt ~str_size vi
+         :: Smart_stmt.full_init_stmt vi
+         :: Smart_stmt.mark_readonly vi
          :: stmts)
       stmts
   in
@@ -150,7 +150,7 @@ let mk_init_function () =
       let b, _env = Env.pop_and_get env stmt ~global_clear:true Env.Before in
       b, stmts
   in
-  let stmts = Constructor.mk_block_stmt b :: stmts in
+  let stmts = Smart_stmt.block_stmt b :: stmts in
   (* prevent multiple calls to [__e_acsl_globals_init] *)
   let loc = Location.unknown in
   let vi_already_run =
@@ -168,14 +168,14 @@ let mk_init_function () =
       (Local_init (vi_already_run, init, loc))
   in
   let already_run =
-    Constructor.mk_assigns
+    Smart_stmt.assigns
       ~loc
       ~result:(Cil.var vi_already_run)
       (Cil.one ~loc)
   in
   let stmts = already_run :: stmts in
   let guard =
-    Constructor.mk_if
+    Smart_stmt.if_stmt
       ~loc
       ~cond:(Cil.evar vi_already_run)
       (Cil.mkBlock [])
@@ -186,16 +186,16 @@ let mk_init_function () =
   fundec.sbody.bstmts <- stmts;
   vi, fundec
 
-let mk_delete_function () =
-  (* Create and register [__e_acsl_globals_delete] function with definition
+let mk_clean_function () =
+  (* Create and register [__e_acsl_globals_clean] function with definition
      for de-allocation of global variables *)
-  let vi, fundec, _kf = mk_function function_delete_name in
+  let vi, fundec, _kf = mk_function function_clean_name in
   (* Generate delete statements and add them to the function body *)
   let stmts =
     Varinfo.Hashtbl.fold_sorted
       (fun vi _l acc ->
          if Misc.is_fc_or_compiler_builtin vi then acc
-         else Constructor.mk_delete_stmt vi :: acc)
+         else Smart_stmt.delete_stmt vi :: acc)
       tbl
       []
   in
diff --git a/src/plugins/e-acsl/src/code_generator/global_observer.mli b/src/plugins/e-acsl/src/code_generator/global_observer.mli
index fa18ebead123e6af2c21ddad05e397417daa1c56..e37f39301d3515e52be12305f3505d6797eae8c6 100644
--- a/src/plugins/e-acsl/src/code_generator/global_observer.mli
+++ b/src/plugins/e-acsl/src/code_generator/global_observer.mli
@@ -27,8 +27,8 @@ open Cil_types
 val function_init_name: string
 (** Name of the function in which [mk_init_function] (see below) generates the
     code. *)
-val function_delete_name: string
-(** Name of the function in which [mk_delete_function] (see below) generates the
+val function_clean_name: string
+(** Name of the function in which [mk_clean_function] (see below) generates the
     code. *)
 
 val reset: unit -> unit
@@ -44,7 +44,7 @@ val mk_init_function: unit -> varinfo * fundec
 (** Generate a new C function containing the observers for global variable
     declarations and initializations. *)
 
-val mk_delete_function: unit -> varinfo * fundec
+val mk_clean_function: unit -> varinfo * fundec
 (** Generate a new C function containing the observers for global variable
     de-allocations. *)
 
diff --git a/src/plugins/e-acsl/src/code_generator/gmp.ml b/src/plugins/e-acsl/src/code_generator/gmp.ml
index 8c28ac5e32e0267754723bd1a0042f492fb6cb17..8a2b5385f1cb1830a92ff5272cb14bd0cd3d7c69 100644
--- a/src/plugins/e-acsl/src/code_generator/gmp.ml
+++ b/src/plugins/e-acsl/src/code_generator/gmp.ml
@@ -33,7 +33,7 @@ let apply_on_var ~loc funname e =
     else if Gmp_types.Q.is_t ty then "__gmpq_"
     else assert false
   in
-  Constructor.mk_lib_call ~loc (prefix ^ funname) [ e ]
+  Smart_stmt.lib_call ~loc (prefix ^ funname) [ e ]
 
 let init ~loc e = apply_on_var "init" ~loc e
 let clear ~loc e = apply_on_var "clear" ~loc e
@@ -90,9 +90,9 @@ let generic_affect ~loc fname lv ev e =
   let ty = Cil.typeOf ev in
   if Gmp_types.Z.is_t ty || Gmp_types.Q.is_t ty then begin
     let suf, args = get_set_suffix_and_arg ty e in
-    Constructor.mk_lib_call ~loc (fname ^ suf) (ev :: args)
+    Smart_stmt.lib_call ~loc (fname ^ suf) (ev :: args)
   end else
-    Constructor.mk_assigns ~loc:e.eloc ~result:lv e
+    Smart_stmt.assigns ~loc:e.eloc ~result:lv e
 
 let init_set ~loc lv ev e =
   let fname =
@@ -111,7 +111,7 @@ let init_set ~loc lv ev e =
      | Lval elv ->
        assert (Gmp_types.Z.is_t (Cil.typeOf ev));
        let call =
-         Constructor.mk_lib_call ~loc
+         Smart_stmt.lib_call ~loc
            "__gmpz_import"
            [ ev;
              Cil.one ~loc;
@@ -121,7 +121,7 @@ let init_set ~loc lv ev e =
              Cil.zero ~loc;
              Cil.mkAddrOf ~loc elv ]
        in
-       Constructor.mk_block_stmt (Cil.mkBlock [ init ~loc ev; call ])
+       Smart_stmt.block_stmt (Cil.mkBlock [ init ~loc ev; call ])
      | _ ->
        Error.not_yet "unsigned long long expression requiring GMP")
   | Longlong ILongLong ->
diff --git a/src/plugins/e-acsl/src/code_generator/injector.ml b/src/plugins/e-acsl/src/code_generator/injector.ml
index dd1222051d790f8757da083c9f9628ac3be4d877..75ec65a7b495488bd454bdf700317ad3e6ad505b 100644
--- a/src/plugins/e-acsl/src/code_generator/injector.ml
+++ b/src/plugins/e-acsl/src/code_generator/injector.ml
@@ -60,7 +60,7 @@ let inject_in_local_init loc env kf vi = function
   | ConsInit (fvi, sz :: _, _) as init
     when Functions.Libc.is_vla_alloc_name fvi.vname ->
     (* add a store statement when creating a variable length array *)
-    let store = Constructor.mk_store_stmt ~str_size:sz vi in
+    let store = Smart_stmt.store_stmt ~str_size:sz vi in
     let env = Env.add_stmt ~post:true env kf store in
     init, env
 
@@ -138,20 +138,20 @@ let add_initializer loc ?vi lv ?(post=false) stmt env kf =
       | Var vi, NoOffset -> vi.vglob || vi.vformal
       | _ -> false
     in
-    let must_model = Mmodel_analysis.must_model_lval ~stmt ~kf lv in
+    let must_model = Memory_tracking.must_monitor_lval ~stmt ~kf lv in
     if not (may_safely_ignore lv) && must_model then
       let before = Cil.mkStmt ~valid_sid:true stmt.skind in
       let new_stmt =
         (* bitfields are not yet supported ==> no initializer.
            a [not_yet] will be raised in [Translate]. *)
         if Cil.isBitfield lv then Cil.mkEmptyStmt ()
-        else Constructor.mk_initialize ~loc lv
+        else Smart_stmt.initialize ~loc lv
       in
       let env = Env.add_stmt ~post ~before env kf new_stmt in
       let env = match vi with
         | None -> env
         | Some vi ->
-          let new_stmt = Constructor.mk_store_stmt vi in
+          let new_stmt = Smart_stmt.store_stmt vi in
           Env.add_stmt ~post ~before env kf new_stmt
       in
       env
@@ -189,7 +189,7 @@ let inject_in_instr env kf stmt = function
       if Functions.Libc.is_vla_free caller then
         match args with
         | [ { enode = CastE (_, { enode = Lval (Var vi, NoOffset) }) } ] ->
-          let delete_block = Constructor.mk_delete_stmt ~is_addr:true vi in
+          let delete_block = Smart_stmt.delete_stmt ~is_addr:true vi in
           Env.add_stmt env kf delete_block
         | _ -> Options.fatal "The normalization of __fc_vla_free() has changed"
       else
@@ -232,7 +232,7 @@ let add_new_block_in_stmt env kf stmt =
   in
   let mk_post_env env stmt =
     Annotations.fold_code_annot
-      (fun _ a env -> Translate.translate_post_code_annotation kf stmt env a)
+      (fun _ a env -> Translate_annots.post_code_annotation kf stmt env a)
       stmt
       env
   in
@@ -252,7 +252,7 @@ let add_new_block_in_stmt env kf stmt =
           let env = mk_post_env env stmt in
           (* also handle the postcondition of the function and clear the
              env *)
-          Translate.translate_post_spec kf Kglobal env (Annotations.funspec kf)
+          Translate_annots.post_funspec kf Kglobal env
         else
           env
       in
@@ -263,7 +263,7 @@ let add_new_block_in_stmt env kf stmt =
       let b, env =
         Env.pop_and_get env new_stmt ~global_clear:true Env.After
       in
-      let new_stmt = Constructor.mk_block stmt b in
+      let new_stmt = Smart_stmt.block stmt b in
       if not (Cil_datatype.Stmt.equal stmt new_stmt) then begin
         (* move the labels of the return to the new block in order to
            evaluate the postcondition when jumping to them. *)
@@ -293,7 +293,7 @@ let add_new_block_in_stmt env kf stmt =
       let post_block, env =
         Env.pop_and_get
           env
-          (Constructor.mk_block new_stmt pre_block)
+          (Smart_stmt.block new_stmt pre_block)
           ~global_clear:false
           Env.Before
       in
@@ -302,7 +302,7 @@ let add_new_block_in_stmt env kf stmt =
         then Cil.transient_block post_block
         else post_block
       in
-      let res = Constructor.mk_block new_stmt post_block in
+      let res = Smart_stmt.block new_stmt post_block in
       if not (Cil_datatype.Stmt.equal new_stmt res) then
         E_acsl_label.move kf new_stmt res;
       res, env
@@ -337,7 +337,7 @@ let insert_as_last_stmts_in_innermost_block ~last_stmts kf outer_block =
     match return_stmt with
     | Some return_stmt ->
       let b = Cil.mkBlock new_stmts in
-      let new_stmt = Constructor.mk_block return_stmt b in
+      let new_stmt = Smart_stmt.block return_stmt b in
       E_acsl_label.move kf return_stmt new_stmt;
       [ new_stmt ]
     | None -> new_stmts
@@ -450,7 +450,7 @@ and inject_in_stmt env kf stmt =
       (* translate the precondition of the function *)
       if Functions.check kf then
         let funspec = Annotations.funspec kf in
-        Translate.translate_pre_spec kf Kglobal env funspec
+        Translate_annots.pre_funspec kf Kglobal env funspec
       else env
     else
       env
@@ -459,7 +459,7 @@ and inject_in_stmt env kf stmt =
   let env =
     if Functions.check kf then
       Annotations.fold_code_annot
-        (fun _ a env -> Translate.translate_pre_code_annotation kf stmt env a)
+        (fun _ a env -> Translate_annots.pre_code_annotation kf stmt env a)
         stmt
         env
     else
@@ -508,15 +508,15 @@ and inject_in_block (env: Env.t) kf blk =
           (* The free statements are passed in the same order than the malloc
              ones. In order to free the variable in the reverse order, the list
              is reversed before appending the return statement. Moreover,
-             `rev_append` is tail recursive contrary to `append` *)
+             [List.rev_append] is tail recursive contrary to [List.append] *)
           List.rev_append free_stmts [ return_stmt ]
         | None -> []
       in
       if Functions.instrument kf then
         List.fold_left
           (fun acc vi ->
-             if Mmodel_analysis.must_model_vi ~kf vi
-             then Constructor.mk_delete_stmt vi :: acc
+             if Memory_tracking.must_monitor_vi ~kf vi
+             then Smart_stmt.delete_stmt vi :: acc
              else acc)
           stmts
           blk.blocals
@@ -530,8 +530,8 @@ and inject_in_block (env: Env.t) kf blk =
       blk.bstmts <-
         List.fold_left
           (fun acc vi ->
-             if Mmodel_analysis.must_model_vi vi && not vi.vdefined
-             then Constructor.mk_store_stmt vi :: acc
+             if Memory_tracking.must_monitor_vi vi && not vi.vdefined
+             then Smart_stmt.store_stmt vi :: acc
              else acc)
           blk.bstmts
           blk.blocals;
@@ -702,13 +702,13 @@ let surround_function_with kf fundec stmt_begin stmt_end =
     These functions track the usage of globals if the program being analyzed. *)
 let inject_global_handler file main =
   Options.feedback ~dkey ~level:2 "building global handler.";
-  if Mmodel_analysis.use_model () then
+  if Memory_tracking.use_monitoring () then
     (* Create [__e_acsl_globals_init] function *)
     let vi_init, fundec_init = Global_observer.mk_init_function () in
     let cil_fct_init = GFun(fundec_init, Location.unknown) in
     (* Create [__e_acsl_globals_delete] function *)
-    let vi_delete, fundec_delete = Global_observer.mk_delete_function () in
-    let cil_fct_delete = GFun(fundec_delete, Location.unknown) in
+    let vi_clean, fundec_clean = Global_observer.mk_clean_function () in
+    let cil_fct_clean = GFun(fundec_clean, Location.unknown) in
     match main with
     | Some main ->
       let mk_fct_call vi =
@@ -727,14 +727,14 @@ let inject_global_handler file main =
       (* Create [__e_acsl_globals_init();] call *)
       let stmt_init = mk_fct_call vi_init in
       (* Create [__e_acsl_globals_delete();] call *)
-      let stmt_delete =
-        match fundec_delete.sbody.bstmts with
+      let stmt_clean =
+        match fundec_clean.sbody.bstmts with
         | [] -> None
-        | _ -> Some (mk_fct_call vi_delete)
+        | _ -> Some (mk_fct_call vi_clean)
       in
       (* Surround the content of main with the calls to
          [__e_acsl_globals_init();] and [__e_acsl_globals_delete();] *)
-      surround_function_with main main_fundec stmt_init stmt_delete;
+      surround_function_with main main_fundec stmt_init stmt_clean;
       (* Retrieve all globals except main *)
       let main_vi = Globals.Functions.get_vi main in
       let new_globals =
@@ -753,11 +753,11 @@ let inject_global_handler file main =
         in
         (* [main] at the end *)
         let globals_to_add = [ GFun(main_fundec, Location.unknown) ] in
-        (* Prepend [__e_acsl_globals_delete] if not empty *)
+        (* Prepend [__e_acsl_globals_clean] if not empty *)
         let globals_to_add =
-          match fundec_delete.sbody.bstmts with
+          match fundec_clean.sbody.bstmts with
           | [] -> globals_to_add
-          | _ -> cil_fct_delete :: globals_to_add
+          | _ -> cil_fct_clean :: globals_to_add
         in
         (* Prepend [__e_acsl_globals_init] *)
         let globals_to_add = cil_fct_init :: globals_to_add in
@@ -777,25 +777,25 @@ let inject_global_handler file main =
                       `__e_acsl_memory_init' and `__e_acsl_memory_clean' \
                       by yourself.@]"
         Global_observer.function_init_name
-        Global_observer.function_delete_name;
+        Global_observer.function_clean_name;
       let globals_func =
-        match fundec_delete.sbody.bstmts with
+        match fundec_clean.sbody.bstmts with
         | [] -> [ cil_fct_init ]
-        | _ -> [ cil_fct_init; cil_fct_delete ]
+        | _ -> [ cil_fct_init; cil_fct_clean ]
       in
       file.globals <- file.globals @ globals_func
 
 (** Add a call to [__e_acsl_memory_init] and [__e_acsl_memory_clean] if the
-    memory model analysis is running.
+    memory tracking analysis is running.
     [__e_acsl_memory_init] initializes memory storage and potentially records
     program arguments. Parameters to [__e_acsl_memory_init] are addresses of
     program arguments or NULLs if [main] is declared without arguments.
     [__e_acsl_memory_clean] clean the memory allocated by
     [__e_acsl_memory_init]. *)
-let inject_mmodel_handler main =
+let inject_mtracking_handler main =
   (* Only inject memory init and memory clean if the memory model analysis is
      running *)
-  if Mmodel_analysis.use_model () then begin
+  if Memory_tracking.use_monitoring () then begin
     let loc = Location.unknown in
     let nulls = [ Cil.zero loc ; Cil.zero loc ] in
     let handle_main main =
@@ -821,8 +821,8 @@ let inject_mmodel_handler main =
       in
       let ptr_size = Cil.sizeOf loc Cil.voidPtrType in
       let args = args @ [ ptr_size ] in
-      let init = Constructor.mk_rtl_call loc "memory_init" args in
-      let clean = Constructor.mk_rtl_call loc "memory_clean" [] in
+      let init = Smart_stmt.rtl_call loc "memory_init" args in
+      let clean = Smart_stmt.rtl_call loc "memory_clean" [] in
       surround_function_with main fundec init (Some clean)
     in
     Extlib.may handle_main main
@@ -837,13 +837,13 @@ let inject_in_file file =
   if not (Global_observer.is_empty () && Literal_strings.is_empty ()) then
     inject_global_handler file main;
   file.globals <- Logic_functions.add_generated_functions file.globals;
-  inject_mmodel_handler main
+  inject_mtracking_handler main
 
 let reset_all ast =
   (* by default, do not run E-ACSL on the generated code *)
   Options.Run.off ();
   (* reset all the E-ACSL environments to their original states *)
-  Mmodel_analysis.reset ();
+  Memory_tracking.reset ();
   Logic_functions.reset ();
   Literal_strings.reset ();
   Global_observer.reset ();
diff --git a/src/plugins/e-acsl/src/code_generator/literal_observer.ml b/src/plugins/e-acsl/src/code_generator/literal_observer.ml
index 9cc7e7f8b5e566285e6ba08231578420f038fca2..8b3bd0f99193c163abc41e86d508bf8974a0b239 100644
--- a/src/plugins/e-acsl/src/code_generator/literal_observer.ml
+++ b/src/plugins/e-acsl/src/code_generator/literal_observer.ml
@@ -52,7 +52,7 @@ let subst_all_literals_in_exp env kf e =
       (* the guard below could be optimized: if no annotation depends on this
          string, then it is not required to monitor it.
          (currently, the guard says: "no annotation uses the memory model" *)
-      | Const (CStr s) when Mmodel_analysis.use_model () ->
+      | Const (CStr s) when Memory_tracking.use_monitoring () ->
         let e, env = literal e.eloc !env_ref kf s in
         env_ref := env;
         Cil.ChangeTo e
diff --git a/src/plugins/e-acsl/src/code_generator/logic_array.ml b/src/plugins/e-acsl/src/code_generator/logic_array.ml
index af522479dc6c22f7926c9edfee20c28821c1ce1a..95faf7ea005b9e3e44dd365f9c286d5d99695cab 100644
--- a/src/plugins/e-acsl/src/code_generator/logic_array.ml
+++ b/src/plugins/e-acsl/src/code_generator/logic_array.ml
@@ -95,7 +95,7 @@ let length_exp ~loc kf env ~name array =
         ~name
         Cil.theMachine.typeOfSizeOf
         (fun v _ -> [
-             Constructor.mk_assigns
+             Smart_stmt.assigns
                ~loc
                ~result:(Cil.var v)
                (Cil.mkBinOp
@@ -168,7 +168,7 @@ let comparison_to_exp ~loc kf env ~name bop array1 array2 =
       None
       ~name
       Cil.intType
-      (fun v _ -> [ Constructor.mk_assigns ~loc ~result:(Cil.var v) (res_value ()) ])
+      (fun v _ -> [ Smart_stmt.assigns ~loc ~result:(Cil.var v) (res_value ()) ])
   in
 
   (* Retrieve the length of the arrays *)
@@ -193,8 +193,8 @@ let comparison_to_exp ~loc kf env ~name bop array1 array2 =
      arrays. This env will enable us to also check RTEs *)
   let env = Env.push env in
   (* Create the access to the arrays *)
-  let array1_iter_e = Constructor.mk_subscript ~loc array1 iter_e in
-  let array2_iter_e = Constructor.mk_subscript ~loc array2 iter_e in
+  let array1_iter_e = Smart_exp.subscript ~loc array1 iter_e in
+  let array2_iter_e = Smart_exp.subscript ~loc array2 iter_e in
   (* Check RTE on the arrays, filtering out bounding checks since the accesses
      are built already in bounds *)
   let filter a =
@@ -202,7 +202,7 @@ let comparison_to_exp ~loc kf env ~name bop array1 array2 =
       Alarms.get_name (Index_out_of_bound (iter_e, Some len1_exp))
     in
     match a.annot_content with
-    | AAssert (_, _, { pred_name = hd :: _ })
+    | AAssert (_, { tp_statement = { pred_name = hd :: _ }})
       when Datatype.String.equal hd index_bound -> false
     | _ -> true
   in
@@ -212,12 +212,12 @@ let comparison_to_exp ~loc kf env ~name bop array1 array2 =
   let cond = Cil.mkBinOp ~loc Ne array1_iter_e array2_iter_e in
   (* Create the statement representing the body of the for loop *)
   let body =
-    Constructor.mk_if
+    Smart_stmt.if_stmt
       ~loc
       ~cond
       (Cil.mkBlock [
-          Constructor.mk_assigns ~loc ~result:(Cil.var comparison_vi) (res_value ~flip:true ());
-          Constructor.mk_break ~loc
+          Smart_stmt.assigns ~loc ~result:(Cil.var comparison_vi) (res_value ~flip:true ());
+          Smart_stmt.break ~loc
         ])
   in
   (* Pop the env to build the body of the for loop *)
@@ -225,14 +225,14 @@ let comparison_to_exp ~loc kf env ~name bop array1 array2 =
 
   (* Create the statement representing the full for loop *)
   let for_loop =
-    (Constructor.mk_block_stmt
+    (Smart_stmt.block_stmt
        (Cil.mkBlock
           (Cil.mkForIncr
              ~iter
              ~first:(Cil.zero ~loc)
              ~stopat:len1_exp
              ~incr:(Cil.one ~loc)
-             ~body:[ Constructor.mk_block_stmt body_blk ]
+             ~body:[ Smart_stmt.block_stmt body_blk ]
           )
        )
     )
@@ -244,7 +244,7 @@ let comparison_to_exp ~loc kf env ~name bop array1 array2 =
 
   (* Add the check for the length before the for loop *)
   let prepend_coercion_check ~name env stmts array len =
-    let array_orig = Option.get (Constructor.extract_uncoerced_lval array) in
+    let array_orig = Option.get (Misc.extract_uncoerced_lval array) in
     if array_orig == array then
       stmts, env
     else
@@ -259,7 +259,7 @@ let comparison_to_exp ~loc kf env ~name bop array1 array2 =
       in
       let p = { p with pred_name = "array_coercion" :: p.pred_name } in
       let stmt =
-        Constructor.mk_runtime_check Constructor.RTE kf e p
+        Smart_stmt.runtime_check Smart_stmt.RTE kf e p
       in
       stmt :: stmts, env
   in
@@ -272,17 +272,17 @@ let comparison_to_exp ~loc kf env ~name bop array1 array2 =
 
   (* Pop the env to build the full then block *)
   let then_blk, env =
-    pop_and_get_env env (Constructor.mk_block_stmt (Cil.mkBlock then_stmts))
+    pop_and_get_env env (Smart_stmt.block_stmt (Cil.mkBlock then_stmts))
   in
 
   (* Create the statement representing the whole generated code *)
   let stmt =
-    Constructor.mk_if
+    Smart_stmt.if_stmt
       ~loc
       ~cond:(Cil.mkBinOp ~loc Eq len1_exp len2_exp)
       then_blk
       ~else_blk:(Cil.mkBlock
-                   [ Constructor.mk_assigns
+                   [ Smart_stmt.assigns
                        ~loc
                        ~result:(Cil.var comparison_vi)
                        (res_value ~flip:true ()) ])
diff --git a/src/plugins/e-acsl/src/code_generator/logic_functions.ml b/src/plugins/e-acsl/src/code_generator/logic_functions.ml
index d5bf1c4da99b052ef55ba976adb9eba5c4929ff7..ebac4f3a70f0e9ee966a874f44e52e60225ba20a 100644
--- a/src/plugins/e-acsl/src/code_generator/logic_functions.ml
+++ b/src/plugins/e-acsl/src/code_generator/logic_functions.ml
@@ -27,9 +27,9 @@ open Cil_datatype
 (********************** Forward references ********************************)
 (**************************************************************************)
 
-let named_predicate_to_exp_ref
+let predicate_to_exp_ref
   : (kernel_function -> Env.t -> predicate -> exp * Env.t) ref
-  = Extlib.mk_fun "named_predicate_to_exp_ref"
+  = Extlib.mk_fun "predicate_to_exp_ref"
 
 let term_to_exp_ref
   : (kernel_function -> Env.t -> term -> exp * Env.t) ref
@@ -81,7 +81,7 @@ let generate_return_block ~loc env ret_vi e = match e.enode with
 (* Generate the function's body for predicates. *)
 let pred_to_block ~loc kf env ret_vi p =
   Typing.type_named_predicate ~must_clear:false p;
-  let e, env = !named_predicate_to_exp_ref kf env p in
+  let e, env = !predicate_to_exp_ref kf env p in
   (* for predicate, since the result is either 0 or 1, return it directly (it
      cannot be provided as extra argument *)
   generate_return_block ~loc env ret_vi e
@@ -98,7 +98,7 @@ let term_to_block ~loc kf env ret_ty ret_vi t =
        function (by reference). *)
     let set =
       let lv_star_ret = Cil.mkMem ~addr:(Cil.evar ~loc ret_vi) ~off:NoOffset in
-      let star_ret = Constructor.mk_lval ~loc lv_star_ret in
+      let star_ret = Smart_exp.lval ~loc lv_star_ret in
       Gmp.init_set ~loc lv_star_ret star_ret e
     in
     let return_void = Cil.mkStmt ~valid_sid:true (Return (None, loc)) in
diff --git a/src/plugins/e-acsl/src/code_generator/logic_functions.mli b/src/plugins/e-acsl/src/code_generator/logic_functions.mli
index 3025a6b94aa7fdd9a2c884a8e906812624e2f8f2..0f8898ffb67155c4231e4f960f4d80b6c15c6ad8 100644
--- a/src/plugins/e-acsl/src/code_generator/logic_functions.mli
+++ b/src/plugins/e-acsl/src/code_generator/logic_functions.mli
@@ -50,7 +50,7 @@ val add_generated_functions: global list -> global list
 (********************** Forward references ********************************)
 (**************************************************************************)
 
-val named_predicate_to_exp_ref:
+val predicate_to_exp_ref:
   (kernel_function -> Env.t -> predicate -> exp * Env.t) ref
 
 val term_to_exp_ref:
diff --git a/src/plugins/e-acsl/src/code_generator/loops.ml b/src/plugins/e-acsl/src/code_generator/loops.ml
index bca60ec4f2cd8197f440f38a15241dd03c70761e..0018b0c8fe392b459d27335ec641e152f0e64866 100644
--- a/src/plugins/e-acsl/src/code_generator/loops.ml
+++ b/src/plugins/e-acsl/src/code_generator/loops.ml
@@ -27,13 +27,13 @@ open Cil_types
 (********************** Forward references ********************************)
 (**************************************************************************)
 
-let translate_named_predicate_ref
+let translate_predicate_ref
   : (kernel_function -> Env.t -> predicate -> Env.t) ref
-  = Extlib.mk_fun "translate_named_predicate_ref"
+  = Extlib.mk_fun "translate_predicate_ref"
 
-let named_predicate_ref
+let predicate_to_exp_ref
   : (kernel_function -> Env.t -> predicate -> exp * Env.t) ref
-  = Extlib.mk_fun "named_predicate_ref"
+  = Extlib.mk_fun "predicate_to_exp_ref"
 
 let term_to_exp_ref
   : (kernel_function -> Env.t -> term -> exp * Env.t) ref
@@ -53,17 +53,17 @@ let preserve_invariant env kf stmt = match stmt.skind with
         let invariants, env = Env.pop_loop env in
         let env = Env.push env in
         let env =
-          let translate_named_predicate = !translate_named_predicate_ref in
+          let translate_named_predicate = !translate_predicate_ref in
           List.fold_left (translate_named_predicate kf) env invariants
         in
         let blk, env =
           Env.pop_and_get env last ~global_clear:false Env.Before
         in
-        Constructor.mk_block last blk :: stmts, env
+        Smart_stmt.block last blk :: stmts, env
       | s :: tl ->
         handle_invariants (s :: stmts, env) tl
     in
-    let env = Env.set_annotation_kind env Constructor.Invariant in
+    let env = Env.set_annotation_kind env Smart_stmt.Invariant in
     let stmts, env = handle_invariants ([], env) stmts in
     let new_blk = { blk with bstmts = List.rev stmts } in
     { stmt with skind = Loop([], new_blk, loc, cont, break) },
@@ -212,7 +212,7 @@ let rec mk_nested_loops ~loc mk_innermost_block kf env lscope_vars =
         Env.Middle
     in
     (* generate the guard [x bop t2] *)
-    let block_to_stmt b = Constructor.mk_block_stmt b in
+    let block_to_stmt b = Smart_stmt.block_stmt b in
     let tlv = Logic_const.tvar ~loc logic_x in
     let guard =
       (* must copy [t2] to force being typed again *)
@@ -221,10 +221,10 @@ let rec mk_nested_loops ~loc mk_innermost_block kf env lscope_vars =
     in
     Typing.type_term ~use_gmp_opt:false ~ctx:Typing.c_int guard;
     let guard_exp, env = term_to_exp kf (Env.push env) guard in
-    let break_stmt = Constructor.mk_break ~loc:guard_exp.eloc in
+    let break_stmt = Smart_stmt.break ~loc:guard_exp.eloc in
     let guard_blk, env = Env.pop_and_get
         env
-        (Constructor.mk_if
+        (Smart_stmt.if_stmt
            ~loc:guard_exp.eloc
            ~cond:guard_exp
            (mkBlock [ mkEmptyStmt ~loc () ])
@@ -249,12 +249,12 @@ let rec mk_nested_loops ~loc mk_innermost_block kf env lscope_vars =
       | None ->
         guard :: body @ [ next ], env
       | Some p ->
-        let e, env = !named_predicate_ref kf (Env.push env) p in
+        let e, env = !predicate_to_exp_ref kf (Env.push env) p in
         let stmt, env =
-          Constructor.mk_runtime_check Constructor.RTE kf e p, env
+          Smart_stmt.runtime_check Smart_stmt.RTE kf e p, env
         in
         let b, env = Env.pop_and_get env stmt ~global_clear:false Env.After in
-        let guard_for_small_type = Constructor.mk_block_stmt b in
+        let guard_for_small_type = Smart_stmt.block_stmt b in
         guard_for_small_type :: guard :: body @ [ next ], env
     in
     let start = block_to_stmt init_blk in
diff --git a/src/plugins/e-acsl/src/code_generator/loops.mli b/src/plugins/e-acsl/src/code_generator/loops.mli
index 4a450be12350a2ede8a109824c4ad16b53364f3a..06d512d0cf6d2222f06591915262acb9da2835f5 100644
--- a/src/plugins/e-acsl/src/code_generator/loops.mli
+++ b/src/plugins/e-acsl/src/code_generator/loops.mli
@@ -51,10 +51,10 @@ val mk_nested_loops:
 (********************** Forward references ********************************)
 (**************************************************************************)
 
-val translate_named_predicate_ref:
+val translate_predicate_ref:
   (kernel_function -> Env.t -> predicate -> Env.t) ref
 
-val named_predicate_ref:
+val predicate_to_exp_ref:
   (kernel_function -> Env.t -> predicate -> exp * Env.t) ref
 
 val term_to_exp_ref:
diff --git a/src/plugins/e-acsl/src/code_generator/memory_observer.ml b/src/plugins/e-acsl/src/code_generator/memory_observer.ml
index 0ec5cda04ef5f39be1210766ebaca866b748dd37..1babc64d9246264cbd2fcf76094218ac2ca099ab 100644
--- a/src/plugins/e-acsl/src/code_generator/memory_observer.ml
+++ b/src/plugins/e-acsl/src/code_generator/memory_observer.ml
@@ -26,7 +26,7 @@ let tracking_stmt ?before fold mk_stmt env kf vars =
   if Functions.instrument kf then
     fold
       (fun vi env ->
-         if Mmodel_analysis.must_model_vi ~kf vi then
+         if Memory_tracking.must_monitor_vi ~kf vi then
            Env.add_stmt ?before env kf (mk_stmt vi)
          else
            env)
@@ -39,7 +39,7 @@ let store ?before env kf vars =
   tracking_stmt
     ?before
     List.fold_right (* small list *)
-    Constructor.mk_store_stmt
+    Smart_stmt.store_stmt
     env
     kf
     vars
@@ -48,7 +48,7 @@ let duplicate_store ?before env kf vars =
   tracking_stmt
     ?before
     Varinfo.Set.fold
-    Constructor.mk_duplicate_store_stmt
+    Smart_stmt.duplicate_store_stmt
     env
     kf
     vars
@@ -57,7 +57,7 @@ let delete_from_list ?before env kf vars =
   tracking_stmt
     ?before
     List.fold_right (* small list *)
-    Constructor.mk_delete_stmt
+    Smart_stmt.delete_stmt
     env
     kf
     vars
@@ -66,7 +66,7 @@ let delete_from_set ?before env kf vars =
   tracking_stmt
     ?before
     Varinfo.Set.fold
-    Constructor.mk_delete_stmt
+    Smart_stmt.delete_stmt
     env
     kf
     vars
diff --git a/src/plugins/e-acsl/src/code_generator/memory_observer.mli b/src/plugins/e-acsl/src/code_generator/memory_observer.mli
index 24b4556658713db974efb2a1ea95364b6864d633..7fb098d7655305e782dafe533d6a7b5af69528bf 100644
--- a/src/plugins/e-acsl/src/code_generator/memory_observer.mli
+++ b/src/plugins/e-acsl/src/code_generator/memory_observer.mli
@@ -27,7 +27,7 @@ open Cil_types
 open Cil_datatype
 
 val store: ?before:stmt -> Env.t -> kernel_function -> varinfo list -> Env.t
-(** For each variable of the given list, if necessary according to the mmodel
+(** For each variable of the given list, if necessary according to the mtracking
     analysis, add a call to [__e_acsl_store_block] in the given environment. *)
 
 val duplicate_store:
diff --git a/src/plugins/e-acsl/src/code_generator/mmodel_translate.ml b/src/plugins/e-acsl/src/code_generator/memory_translate.ml
similarity index 99%
rename from src/plugins/e-acsl/src/code_generator/mmodel_translate.ml
rename to src/plugins/e-acsl/src/code_generator/memory_translate.ml
index f5cae16eb0bdb82fc8330038a5c218c6c79f50f7..654433624a3147fc868f052b6d16ab13c9adfaa1 100644
--- a/src/plugins/e-acsl/src/code_generator/mmodel_translate.ml
+++ b/src/plugins/e-acsl/src/code_generator/memory_translate.ml
@@ -155,8 +155,8 @@ let gmp_to_sizet ~loc kf env size p =
       None
       sizet
       (fun vi _ ->
-         [ Constructor.mk_runtime_check Constructor.RTE kf guard p;
-           Constructor.mk_lib_call ~loc
+         [ Smart_stmt.runtime_check Smart_stmt.RTE kf guard p;
+           Smart_stmt.lib_call ~loc
              ~result:(Cil.var vi)
              "__gmpz_get_ui"
              [ size ] ])
diff --git a/src/plugins/e-acsl/src/code_generator/mmodel_translate.mli b/src/plugins/e-acsl/src/code_generator/memory_translate.mli
similarity index 100%
rename from src/plugins/e-acsl/src/code_generator/mmodel_translate.mli
rename to src/plugins/e-acsl/src/code_generator/memory_translate.mli
diff --git a/src/plugins/e-acsl/src/code_generator/quantif.ml b/src/plugins/e-acsl/src/code_generator/quantif.ml
index b6114f25cd132102a8ccd4e606ca1ad303c2047a..b32d939f05d87cf39e1b798480a59e53a44b6d52 100644
--- a/src/plugins/e-acsl/src/code_generator/quantif.ml
+++ b/src/plugins/e-acsl/src/code_generator/quantif.ml
@@ -174,7 +174,7 @@ let convert kf env loc is_forall p bounded_vars hyps goal =
           intType
           (fun v _ ->
              let lv = var v in
-             [ Constructor.mk_assigns ~loc ~result:lv init_val ])
+             [ Smart_stmt.assigns ~loc ~result:lv init_val ])
       in
       let end_loop_ref = ref dummyStmt in
       (* innermost block *)
@@ -188,23 +188,23 @@ let convert kf env loc is_forall p bounded_vars hyps goal =
           (* use a 'goto', not a simple 'break' in order to handle 'forall' with
              multiple binders (leading to imbricated loops) *)
           mkBlock
-            [ Constructor.mk_assigns ~loc ~result:(var var_res) found_val;
+            [ Smart_stmt.assigns ~loc ~result:(var var_res) found_val;
               mkStmt ~valid_sid:true (Goto(end_loop_ref, loc)) ]
         in
         let blk, env = Env.pop_and_get
             env
-            (Constructor.mk_if ~loc ~cond:(mk_guard test) then_blk ~else_blk)
+            (Smart_stmt.if_stmt ~loc ~cond:(mk_guard test) then_blk ~else_blk)
             ~global_clear:false
             Env.After
         in
         let blk = Cil.flatten_transient_sub_blocks blk in
-        [ Constructor.mk_block_stmt blk ], env
+        [ Smart_stmt.block_stmt blk ], env
       in
       let stmts, env =
         Loops.mk_nested_loops ~loc mk_innermost_block kf env lvs_guards
       in
       let env =
-        Env.add_stmt env kf (Constructor.mk_block_stmt (mkBlock stmts))
+        Env.add_stmt env kf (Smart_stmt.block_stmt (mkBlock stmts))
       in
       (* where to jump to go out of the loop *)
       let end_loop = mkEmptyStmt ~loc () in
diff --git a/src/plugins/e-acsl/src/code_generator/rational.ml b/src/plugins/e-acsl/src/code_generator/rational.ml
index 3a0da53951b3b4f569e7f55bc2ea3d4849e1fcc4..2f4417b0191213b6730879074147a5f66f68fe43 100644
--- a/src/plugins/e-acsl/src/code_generator/rational.ml
+++ b/src/plugins/e-acsl/src/code_generator/rational.ml
@@ -24,7 +24,7 @@ open Cil_types
 
 (* No init_set for GMPQ: init then set separately *)
 let init_set ~loc lval vi_e e =
-  Constructor.mk_block_stmt
+  Smart_stmt.block_stmt
     (Cil.mkBlock
        [ Gmp.init ~loc vi_e ;
          Gmp.affect ~loc lval vi_e e ])
@@ -148,7 +148,7 @@ let add_cast ~loc ?name e env kf ty =
         None
         Cil.doubleType
         (fun v _ ->
-           [ Constructor.mk_lib_call ~loc
+           [ Smart_stmt.lib_call ~loc
                ~result:(Cil.var v)
                "__gmpq_get_d"
                [ e ] ])
@@ -197,7 +197,7 @@ let cmp ~loc bop e1 e2 env kf t_opt =
       ~name
       Cil.intType
       (fun v _ ->
-         [ Constructor.mk_lib_call ~loc ~result:(Cil.var v) fname [ e1; e2 ] ])
+         [ Smart_stmt.lib_call ~loc ~result:(Cil.var v) fname [ e1; e2 ] ])
   in
   Cil.new_exp ~loc (BinOp(bop, e, Cil.zero ~loc, Cil.intType)), env
 
@@ -226,7 +226,7 @@ let binop ~loc bop e1 e2 env kf t_opt =
      [e2] *)
   let e1, env = create ~loc e1 env kf None in
   let e2, env = create ~loc e2 env kf None in
-  let mk_stmts _ e = [ Constructor.mk_lib_call ~loc name [ e; e1; e2 ] ] in
+  let mk_stmts _ e = [ Smart_stmt.lib_call ~loc name [ e; e1; e2 ] ] in
   let name = Misc.name_of_binop bop in
   let _, e, env = new_var_and_init ~loc ~name env kf t_opt mk_stmts in
   e, env
diff --git a/src/plugins/e-acsl/src/code_generator/rational.mli b/src/plugins/e-acsl/src/code_generator/rational.mli
index 3648ecba6021a59f9936d6b634de33b80fc6e7a7..90c4c9a5cfcf534f94b15ab9d8635f24cd760a3f 100644
--- a/src/plugins/e-acsl/src/code_generator/rational.mli
+++ b/src/plugins/e-acsl/src/code_generator/rational.mli
@@ -41,8 +41,8 @@ val init_set: loc:location -> lval -> exp -> exp -> stmt
 val normalize_str: string -> string
 (** Normalize the string so that it fits the representation used by the
     underlying real library. For example, "0.1" is a real number in ACSL
-    whereas it is considered as a double by `libgmp` because it is written in
-    decimal expansion. In order to make `libgmp` consider it to be a rational,
+    whereas it is considered as a double by [libgmp] because it is written in
+    decimal expansion. In order to make [libgmp] consider it to be a rational,
     it must be converted into "1/10". *)
 
 (* TODO: change the call convention *)
diff --git a/src/plugins/e-acsl/src/code_generator/smart_exp.ml b/src/plugins/e-acsl/src/code_generator/smart_exp.ml
new file mode 100644
index 0000000000000000000000000000000000000000..f3dac85ffd20bd197d046e874ae3a7a40f68e207
--- /dev/null
+++ b/src/plugins/e-acsl/src/code_generator/smart_exp.ml
@@ -0,0 +1,46 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of the Frama-C's E-ACSL plug-in.                    *)
+(*                                                                        *)
+(*  Copyright (C) 2012-2020                                               *)
+(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
+(*         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 Cil_types
+
+let lval ~loc lv =
+  Cil.new_exp ~loc (Lval lv)
+
+let deref ~loc lv = lval ~loc (Mem lv, NoOffset)
+
+let subscript ~loc array idx =
+  match Misc.extract_uncoerced_lval array with
+  | Some { enode = Lval lv } ->
+    let subscript_lval = Cil.addOffsetLval (Index(idx, NoOffset)) lv in
+    lval ~loc subscript_lval
+  | Some _ | None ->
+    Options.fatal
+      ~current:true
+      "Trying to create a subscript on an array that is not an Lval: %a"
+      Cil_types_debug.pp_exp
+      array
+
+(*
+Local Variables:
+compile-command: "make -C ../../../../.."
+End:
+*)
diff --git a/src/plugins/e-acsl/src/code_generator/smart_exp.mli b/src/plugins/e-acsl/src/code_generator/smart_exp.mli
new file mode 100644
index 0000000000000000000000000000000000000000..566702f1e8012f361cfb3beaf9e3683bf50f94a4
--- /dev/null
+++ b/src/plugins/e-acsl/src/code_generator/smart_exp.mli
@@ -0,0 +1,43 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of the Frama-C's E-ACSL plug-in.                    *)
+(*                                                                        *)
+(*  Copyright (C) 2012-2020                                               *)
+(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
+(*         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 Cil_types
+
+(* ********************************************************************** *)
+(* Helper functions to build expressions *)
+(* ********************************************************************** *)
+
+val lval: loc:location -> lval -> exp
+(** Construct an lval expression from an lval. *)
+
+val deref: loc:location -> exp -> exp
+(** Construct a dereference of an expression. *)
+
+val subscript: loc:location -> exp -> exp -> exp
+(** [mk_subscript ~loc array idx] Create an expression to access the [idx]'th
+    element of the [array]. *)
+
+(*
+Local Variables:
+compile-command: "make -C ../../../../.."
+End:
+*)
diff --git a/src/plugins/e-acsl/src/code_generator/constructor.ml b/src/plugins/e-acsl/src/code_generator/smart_stmt.ml
similarity index 70%
rename from src/plugins/e-acsl/src/code_generator/constructor.ml
rename to src/plugins/e-acsl/src/code_generator/smart_stmt.ml
index a38f36ce70e425255853780dbbf358bef43cc0ab..984188546901494f65d6ab58fc6a88919f95dc49 100644
--- a/src/plugins/e-acsl/src/code_generator/constructor.ml
+++ b/src/plugins/e-acsl/src/code_generator/smart_stmt.ml
@@ -22,51 +22,22 @@
 
 open Cil_types
 
-(* ********************************************************************** *)
-(* Expressions *)
-(* ********************************************************************** *)
-
-let extract_uncoerced_lval e =
-  let rec aux e =
-    match e.enode with
-    | Lval _ -> Some e
-    | CastE (_, e) -> aux e
-    | _ -> None
-  in
-  aux e
-
-let mk_lval ~loc lval =
-  Cil.new_exp ~loc (Lval lval)
-
-let mk_deref ~loc lv = mk_lval ~loc (Mem lv, NoOffset)
-
-let mk_subscript ~loc array idx =
-  match extract_uncoerced_lval array with
-  | Some { enode = Lval lval } ->
-    let subscript_lval = Cil.addOffsetLval (Index(idx, NoOffset)) lval in
-    mk_lval ~loc subscript_lval
-  | Some _ | None ->
-    Options.fatal
-      ~current:true
-      "Trying to create a subscript on an array that is not an Lval: %a"
-      Cil_types_debug.pp_exp
-      array
-
 (* ********************************************************************** *)
 (* Statements *)
 (* ********************************************************************** *)
 
-let mk_stmt sk = Cil.mkStmt ~valid_sid:true sk
-let mk_instr i = mk_stmt (Instr i)
-let mk_block_stmt blk = mk_stmt (Block blk)
-let mk_call ~loc ?result e args = mk_instr (Call(result, e, args, loc))
+let stmt sk = Cil.mkStmt ~valid_sid:true sk
+let instr i = stmt (Instr i)
+let block_stmt blk = stmt (Block blk)
+let block_from_stmts stmts = block_stmt (Cil.mkBlock stmts)
+let call ~loc ?result e args = instr (Call(result, e, args, loc))
 
-let mk_assigns ~loc ~result e = mk_instr (Set(result, e, loc))
+let assigns ~loc ~result e = instr (Set(result, e, loc))
 
-let mk_if ~loc ~cond ?(else_blk=Cil.mkBlock []) then_blk =
-  mk_stmt (If (cond, then_blk, else_blk, loc))
+let if_stmt ~loc ~cond ?(else_blk=Cil.mkBlock []) then_blk =
+  stmt (If (cond, then_blk, else_blk, loc))
 
-let mk_break ~loc = mk_stmt (Break loc)
+let break ~loc = stmt (Break loc)
 
 type annotation_kind =
   | Assertion
@@ -85,19 +56,19 @@ let kind_to_string loc k =
      | Invariant -> "Invariant"
      | RTE -> "RTE")
 
-let mk_block stmt b = match b.bstmts with
+let block stmt b = match b.bstmts with
   | [] ->
     (match stmt.skind with
      | Instr(Skip _) -> stmt
      | _ -> assert false)
   | [ s ] -> s
-  |  _ :: _ -> mk_block_stmt b
+  |  _ :: _ -> block_stmt b
 
 (* ********************************************************************** *)
 (* E-ACSL specific code *)
 (* ********************************************************************** *)
 
-let mk_lib_call ~loc ?result fname args =
+let lib_call ~loc ?result fname args =
   let vi =
     try Rtl.Symbols.find_vi fname
     with Rtl.Symbols.Unregistered _ as exn ->
@@ -133,32 +104,32 @@ let mk_lib_call ~loc ?result fname args =
     | TFun(_, None, _, _) -> []
     | _ -> assert false
   in
-  mk_call ~loc ?result f args
+  call ~loc ?result f args
 
-let mk_rtl_call ~loc ?result fname args =
-  mk_lib_call ~loc ?result (Functions.RTL.mk_api_name fname) args
+let rtl_call ~loc ?result fname args =
+  lib_call ~loc ?result (Functions.RTL.mk_api_name fname) args
 
 (* ************************************************************************** *)
 (** {2 Handling the E-ACSL's C-libraries, part II} *)
 (* ************************************************************************** *)
 
-let mk_full_init_stmt vi =
+let full_init_stmt vi =
   let loc = vi.vdecl in
-  mk_rtl_call ~loc "full_init" [ Cil.evar ~loc vi ]
+  rtl_call ~loc "full_init" [ Cil.evar ~loc vi ]
 
-let mk_initialize ~loc (host, offset as lv) = match host, offset with
+let initialize ~loc (host, offset as lv) = match host, offset with
   | Var _, NoOffset ->
-    mk_rtl_call ~loc "full_init" [ Cil.mkAddrOf ~loc lv ]
+    rtl_call ~loc "full_init" [ Cil.mkAddrOf ~loc lv ]
   | _ ->
     let typ = Cil.typeOfLval lv in
-    mk_rtl_call ~loc
+    rtl_call ~loc
       "initialize"
       [ Cil.mkAddrOf ~loc lv; Cil.new_exp loc (SizeOf typ) ]
 
-let mk_named_store_stmt name ?str_size vi =
+let named_store_stmt name ?str_size vi =
   let ty = Cil.unrollType vi.vtype in
   let loc = vi.vdecl in
-  let store = mk_rtl_call ~loc name in
+  let store = rtl_call ~loc name in
   match ty, str_size with
   | TArray(_, Some _,_,_), None ->
     store [ Cil.evar ~loc vi; Cil.sizeOf ~loc ty ]
@@ -178,27 +149,27 @@ let mk_named_store_stmt name ?str_size vi =
       Printer.pp_typ ty
       Printer.pp_exp size
 
-let mk_store_stmt ?str_size vi =
-  mk_named_store_stmt "store_block" ?str_size vi
+let store_stmt ?str_size vi =
+  named_store_stmt "store_block" ?str_size vi
 
-let mk_duplicate_store_stmt ?str_size vi =
-  mk_named_store_stmt "store_block_duplicate" ?str_size vi
+let duplicate_store_stmt ?str_size vi =
+  named_store_stmt "store_block_duplicate" ?str_size vi
 
-let mk_delete_stmt ?(is_addr=false) vi =
+let delete_stmt ?(is_addr=false) vi =
   let loc = vi.vdecl in
-  let mk = mk_rtl_call ~loc "delete_block" in
+  let mk = rtl_call ~loc "delete_block" in
   match is_addr, Cil.unrollType vi.vtype with
   | _, TArray(_, Some _, _, _) | true, _ -> mk [ Cil.evar ~loc vi ]
   | _ -> mk [ Cil.mkAddrOfVi vi ]
 
-let mk_mark_readonly vi =
+let mark_readonly vi =
   let loc = vi.vdecl in
-  mk_rtl_call ~loc "mark_readonly" [ Cil.evar ~loc vi ]
+  rtl_call ~loc "mark_readonly" [ Cil.evar ~loc vi ]
 
-let mk_runtime_check_with_msg ~loc msg kind kf e =
+let runtime_check_with_msg ~loc msg kind kf e =
   let file = (fst loc).Filepath.pos_path in
   let line = (fst loc).Filepath.pos_lnum in
-  mk_rtl_call ~loc
+  rtl_call ~loc
     "assert"
     [ e;
       kind_to_string loc kind;
@@ -207,13 +178,13 @@ let mk_runtime_check_with_msg ~loc msg kind kf e =
       Cil.mkString ~loc (Filepath.Normalized.to_pretty_string file);
       Cil.integer loc line ]
 
-let mk_runtime_check kind kf e p =
+let runtime_check kind kf e p =
   let loc = p.pred_loc in
   let msg =
     Kernel.Unicode.without_unicode
       (Format.asprintf "%a@?" Printer.pp_predicate) p
   in
-  mk_runtime_check_with_msg ~loc msg kind kf e
+  runtime_check_with_msg ~loc msg kind kf e
 
 (*
 Local Variables:
diff --git a/src/plugins/e-acsl/src/code_generator/constructor.mli b/src/plugins/e-acsl/src/code_generator/smart_stmt.mli
similarity index 64%
rename from src/plugins/e-acsl/src/code_generator/constructor.mli
rename to src/plugins/e-acsl/src/code_generator/smart_stmt.mli
index d21c71e53a434f9905a89fc1ca49ab31df10a781..3aebb9f4cc27419db8d9337096af57fb2d3cebb6 100644
--- a/src/plugins/e-acsl/src/code_generator/constructor.mli
+++ b/src/plugins/e-acsl/src/code_generator/smart_stmt.mli
@@ -20,97 +20,76 @@
 (*                                                                        *)
 (**************************************************************************)
 
-(** Smart constructors for building C code. *)
-
 open Cil_types
-open Cil_datatype
-
-(* ********************************************************************** *)
-(* Expressions *)
-(* ********************************************************************** *)
-
-val extract_uncoerced_lval: exp -> exp option
-(** Unroll the [CastE] part of the expression until an [Lval] is found, and
-    return it.
-
-    If at some point the expression is neither a [CastE] nor an [Lval], then
-    return [None]. *)
-
-val mk_lval: loc:location -> lval -> exp
-(** Construct an lval expression from an lval. *)
-
-val mk_deref: loc:Location.t -> exp -> exp
-(** Construct a dereference of an expression. *)
-
-val mk_subscript: loc:location -> exp -> exp -> exp
-(** [mk_subscript ~loc array idx] Create an expression to access the [idx]'th
-    element of the [array]. *)
 
 (* ********************************************************************** *)
-(* Statements *)
+(* Helper functions to build statements *)
 (* ********************************************************************** *)
 
-val mk_stmt: stmtkind -> stmt
+val stmt: stmtkind -> stmt
 (** Create a statement from a statement kind. *)
 
-val mk_block: stmt -> block -> stmt
+val block: stmt -> block -> stmt
 (** Create a block statement from a block to replace a given statement.
     Requires that (1) the block is not empty, or (2) the statement is a skip. *)
 
-val mk_block_stmt: block -> stmt
+val block_stmt: block -> stmt
 (** Create a block statement from a block *)
 
-val mk_assigns: loc:location -> result:lval -> exp -> stmt
-(** [mk_assigns ~loc ~result value] create a statement to assign the [value]
+val block_from_stmts: stmt list -> stmt
+(** Create a block statement from a statement list. *)
+
+val assigns: loc:location -> result:lval -> exp -> stmt
+(** [assigns ~loc ~result value] create a statement to assign the [value]
     expression to the [result] lval. *)
 
-val mk_if:
+val if_stmt:
   loc:location -> cond:exp -> ?else_blk:block -> block -> stmt
-(** [mk_if ~loc ~cond ~then_blk ~else_blk] create an if statement with [cond]
+(** [if ~loc ~cond ~then_blk ~else_blk] create an if statement with [cond]
     as condition and [then_blk] and [else_blk] as respectively "then" block and
     "else" block. *)
 
-val mk_break: loc:location -> stmt
+val break: loc:location -> stmt
 (** Create a break statement *)
 
 (* ********************************************************************** *)
 (* E-ACSL specific code: build calls to its RTL API *)
 (* ********************************************************************** *)
 
-val mk_lib_call: loc:Location.t -> ?result:lval -> string -> exp list -> stmt
+val lib_call: loc:location -> ?result:lval -> string -> exp list -> stmt
 (** Construct a call to a library function with the given name.
     @raise Rtl.Symbols.Unregistered if the given string does not represent
     such a function or if library functions were never registered (only possible
     when using E-ACSL through its API). *)
 
-val mk_rtl_call: loc:Location.t -> ?result:lval -> string -> exp list -> stmt
-(** Special version of [mk_lib_call] for E-ACSL's RTL functions. *)
+val rtl_call: loc:location -> ?result:lval -> string -> exp list -> stmt
+(** Special version of [lib_call] for E-ACSL's RTL functions. *)
 
-val mk_store_stmt: ?str_size:exp -> varinfo -> stmt
+val store_stmt: ?str_size:exp -> varinfo -> stmt
 (** Construct a call to [__e_acsl_store_block] that observes the allocation of
     the given varinfo. See [share/e-acsl/e_acsl.h] for details about this
     function. *)
 
-val mk_duplicate_store_stmt: ?str_size:exp -> varinfo -> stmt
-(** Same as [mk_store_stmt] for [__e_acsl_duplicate_store_block] that first
+val duplicate_store_stmt: ?str_size:exp -> varinfo -> stmt
+(** Same as [store_stmt] for [__e_acsl_duplicate_store_block] that first
     checks for a previous allocation of the given varinfo. *)
 
-val mk_delete_stmt: ?is_addr:bool -> varinfo -> stmt
-(** Same as [mk_store_stmt] for [__e_acsl_delete_block] that observes the
+val delete_stmt: ?is_addr:bool -> varinfo -> stmt
+(** Same as [store_stmt] for [__e_acsl_delete_block] that observes the
     de-allocation of the given varinfo.
     If [is_addr] is false (default), take the address of varinfo. *)
 
-val mk_full_init_stmt: varinfo -> stmt
-(** Same as [mk_store_stmt] for [__e_acsl_full_init] that observes the
+val full_init_stmt: varinfo -> stmt
+(** Same as [store_stmt] for [__e_acsl_full_init] that observes the
     initialization of the given varinfo. The varinfo is the address to fully
     initialize, no [addrOf] is taken. *)
 
-val mk_initialize: loc:location -> lval -> stmt
-(** Same as [mk_store_stmt] for [__e_acsl_initialize] that observes the
+val initialize: loc:location -> lval -> stmt
+(** Same as [store_stmt] for [__e_acsl_initialize] that observes the
     initialization of the given left-value. *)
 
-val mk_mark_readonly: varinfo -> stmt
-(** Same as [mk_store_stmt] for [__e_acsl_markreadonly] that observes the
+val mark_readonly: varinfo -> stmt
+(** Same as [store_stmt] for [__e_acsl_markreadonly] that observes the
     read-onlyness of the given varinfo. *)
 
 type annotation_kind =
@@ -120,16 +99,16 @@ type annotation_kind =
   | Invariant
   | RTE
 
-val mk_runtime_check:
+val runtime_check:
   annotation_kind -> kernel_function -> exp -> predicate -> stmt
-(** [mk_runtime_check kind kf e p] generates a runtime check for predicate [p]
+(** [runtime_check kind kf e p] generates a runtime check for predicate [p]
     by building a call to [__e_acsl_assert]. [e] (or [!e] if [reverse] is set to
     [true]) is the C translation of [p], [kf] is the current kernel_function and
     [kind] is the annotation kind of [p]. *)
 
-val mk_runtime_check_with_msg:
+val runtime_check_with_msg:
   loc:location -> string -> annotation_kind -> kernel_function -> exp -> stmt
-(** [mk_runtime_check_with_msg kind kf e msg] generates a runtime check for [e]
+(** [runtime_check_with_msg kind kf e msg] generates a runtime check for [e]
     (or [!e] if [reverse] is [true]) by building a call to [__e_acsl_assert].
     [msg] is the message printed if the runtime check fails. [loc] is the
     location printed in the message if the runtime check fails. [kf] is the
diff --git a/src/plugins/e-acsl/src/code_generator/temporal.ml b/src/plugins/e-acsl/src/code_generator/temporal.ml
index a2694969cc618f039f6314f651099618e8985184..d0f6ced85f13d7305efda530e904f39ae1dd8cfc 100644
--- a/src/plugins/e-acsl/src/code_generator/temporal.ml
+++ b/src/plugins/e-acsl/src/code_generator/temporal.ml
@@ -51,9 +51,9 @@ type flow =
 
 module Mk: sig
   (* Generate either
-      - [store_nblock(lhs, rhs)], or
-      - [store_nreferent(lhs, rhs)]
-     function call based on the value of [flow] *)
+     - [store_nblock(lhs, rhs)], or
+     - [store_nreferent(lhs, rhs)]
+       function call based on the value of [flow] *)
   val store_reference: loc:location -> flow -> lval -> exp -> stmt
 
   (* Generate a [save_*_parameter] call *)
@@ -81,7 +81,7 @@ end = struct
       | Copy -> Options.fatal "Copy flow type in store_reference"
     in
     let fname = RTL.mk_temporal_name fname in
-    Constructor.mk_lib_call ~loc fname [ Cil.mkAddrOf ~loc lhs; rhs ]
+    Smart_stmt.lib_call ~loc fname [ Cil.mkAddrOf ~loc lhs; rhs ]
 
   let save_param ~loc flow lhs pos =
     let infix = match flow with
@@ -91,13 +91,13 @@ end = struct
     in
     let fname = "save_" ^ infix ^ "_parameter" in
     let fname = RTL.mk_temporal_name fname in
-    Constructor.mk_lib_call ~loc fname [ lhs ; Cil.integer ~loc pos ]
+    Smart_stmt.lib_call ~loc fname [ lhs ; Cil.integer ~loc pos ]
 
   let pull_param ~loc vi pos =
     let exp = Cil.mkAddrOfVi vi in
     let fname = RTL.mk_temporal_name "pull_parameter" in
     let sz = Cil.kinteger ~loc IULong (Cil.bytesSizeOf vi.vtype) in
-    Constructor.mk_lib_call ~loc fname [ exp ; Cil.integer ~loc pos ; sz ]
+    Smart_stmt.lib_call ~loc fname [ exp ; Cil.integer ~loc pos ; sz ]
 
   let handle_return_referent ~save ~loc lhs =
     let fname = match save with
@@ -106,17 +106,17 @@ end = struct
     in
     (* TODO: Returning structs is unsupported so far *)
     (match (Cil.typeOf lhs) with
-      | TPtr _ -> ()
-      | _ -> Error.not_yet "Struct in return");
-    Constructor.mk_lib_call ~loc (RTL.mk_temporal_name fname) [ lhs ]
+     | TPtr _ -> ()
+     | _ -> Error.not_yet "Struct in return");
+    Smart_stmt.lib_call ~loc (RTL.mk_temporal_name fname) [ lhs ]
 
   let reset_return_referent ~loc =
-    Constructor.mk_lib_call ~loc (RTL.mk_temporal_name "reset_return") []
+    Smart_stmt.lib_call ~loc (RTL.mk_temporal_name "reset_return") []
 
   let temporal_memcpy_struct ~loc lhs rhs =
     let fname  = RTL.mk_temporal_name "memcpy" in
     let size = Cil.sizeOf ~loc (Cil.typeOfLval lhs) in
-    Constructor.mk_lib_call ~loc fname [ Cil.mkAddrOf ~loc lhs; rhs; size ]
+    Smart_stmt.lib_call ~loc fname [ Cil.mkAddrOf ~loc lhs; rhs; size ]
 end
 (* }}} *)
 
@@ -125,10 +125,10 @@ end
 (* ************************************************************************** *)
 
 (* Given an lvalue [lhs] representing LHS of an assignment, and an expression
-  [rhs] representing its RHS compute triple (l,r,f), such that:
+   [rhs] representing its RHS compute triple (l,r,f), such that:
    - lval [l] and exp [r] are addresses of a pointer and a memory block, and
    - flow [f] indicates how to update the meta-data of [l] using information
-    stored by [r]. The values of [f] indicate the following
+     stored by [r]. The values of [f] indicate the following
      + Direct - referent number of [l] is assigned the referent number of [r]
      + Indirect - referent number of [l] is assigned the origin number of [r]
      + Copy - metadata of [r] is copied to metadata of [l] *)
@@ -145,51 +145,52 @@ let assign ?(ltype) lhs rhs loc =
     let base, _ = Misc.ptr_index rhs in
     let rhs, flow =
       (match base.enode with
-      | AddrOf _
-      | StartOf _ -> rhs, Direct
-      (* Unary operator describes !, ~ or -: treat it same as Const since
-         it implies integer or logical operations. This case is rare but
-         happens: for instance in Gap SPEC CPU benchmark the returned pointer
-         is assigned -1 (for whatever bizarre reason) *)
-      | Const _ | UnOp _ -> base, Direct
-      (* Special case for literal strings which E-ACSL rewrites into
-         global variables: take the origin number of a string *)
-      | Lval(Var vi, _) when RTL.is_generated_name vi.vname ->
-        base, Direct
-      (* Lvalue of a pointer type can be a cast of an integral type, for
-         instance for the case when address is taken by value (shown via the
-         following example).
-           uintptr_t addr = ...;
-           char *p = (char* )addr;
-         If this is the case then the analysis takes the value of a variable. *)
-      | Lval lv ->
-        if Cil.isPointerType (Cil.unrollType (Cil.typeOfLval lv)) then
-          Cil.mkAddrOf ~loc lv, Indirect
-        else
-          rhs, Direct
-      (* Binary operation which yields an integer (or FP) type.
-         Since LHS is of pointer type we assume that the whole integer
-         expression computes to an address for which there is no
-         outer container, so the only thing to do is to take origin number *)
-      | BinOp(op, _, _, _) ->
-        (* At this point [ptr_index] should have split pointer arithmetic into
-           base pointer and index so there should be no pointer arithmetic
-           operations there. The following bit is to make sure of it. *)
-        (match op with
+       | AddrOf _
+       | StartOf _ -> rhs, Direct
+       (* Unary operator describes !, ~ or -: treat it same as Const since
+          it implies integer or logical operations. This case is rare but
+          happens: for instance in Gap SPEC CPU benchmark the returned pointer
+          is assigned -1 (for whatever bizarre reason) *)
+       | Const _ | UnOp _ -> base, Direct
+       (* Special case for literal strings which E-ACSL rewrites into
+          global variables: take the origin number of a string *)
+       | Lval(Var vi, _) when RTL.is_generated_name vi.vname ->
+         base, Direct
+       (* Lvalue of a pointer type can be a cast of an integral type, for
+          instance for the case when address is taken by value (shown via the
+          following example).
+            uintptr_t addr = ...;
+            char *p = (char* )addr;
+          If this is the case then the analysis takes the value of a variable.
+       *)
+       | Lval lv ->
+         if Cil.isPointerType (Cil.unrollType (Cil.typeOfLval lv)) then
+           Cil.mkAddrOf ~loc lv, Indirect
+         else
+           rhs, Direct
+       (* Binary operation which yields an integer (or FP) type.
+          Since LHS is of pointer type we assume that the whole integer
+          expression computes to an address for which there is no
+          outer container, so the only thing to do is to take origin number *)
+       | BinOp(op, _, _, _) ->
+         (* At this point [ptr_index] should have split pointer arithmetic into
+            base pointer and index so there should be no pointer arithmetic
+            operations there. The following bit is to make sure of it. *)
+         (match op with
           | MinusPI | PlusPI | IndexPI -> assert false
           | _ -> ());
-        base, Direct
-      | _ -> assert false)
+         base, Direct
+       | _ -> assert false)
     in Some (lhs, rhs, flow)
   | TNamed _ -> assert false
   | TInt _ | TFloat _ | TEnum _ -> None
   | TComp _ ->
     let rhs = match rhs.enode with
-    | AddrOf _ -> rhs
-    | Lval lv -> Cil.mkAddrOf ~loc lv
-    | Const _ | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ | AlignOfE _
-    | UnOp _ | BinOp _ | CastE _ | StartOf _ | Info _ ->
-      Options.abort "unsupported RHS %a" Printer.pp_exp rhs
+      | AddrOf _ -> rhs
+      | Lval lv -> Cil.mkAddrOf ~loc lv
+      | Const _ | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ | AlignOfE _
+      | UnOp _ | BinOp _ | CastE _ | StartOf _ | Info _ ->
+        Options.abort "unsupported RHS %a" Printer.pp_exp rhs
     in Some (lhs, rhs, Copy)
   (* va_list is a builtin type, we assume it has no pointers here and treat
      it as a "big" integer rather than a struct *)
@@ -215,7 +216,7 @@ let mk_stmt_from_assign loc lhs rhs =
 
 (* Top-level handler for Set instructions *)
 let set_instr ?(post=false) current_stmt loc lhs rhs env kf =
-  if Mmodel_analysis.must_model_lval ~kf lhs then
+  if Memory_tracking.must_monitor_lval ~kf lhs then
     Extlib.may_map
       (fun stmt -> Env.add_stmt ~before:current_stmt ~post env kf stmt)
       ~dft:env
@@ -240,29 +241,29 @@ end = struct
      structure so they can be retrieved once that function is called *)
   let save_params current_stmt loc args env kf =
     let (env, _) = List.fold_left
-      (fun (env, index) param ->
-        let lv = Mem(param), NoOffset in
-        let ltype = Cil.typeOf param in
-        let vals = assign ~ltype lv param loc in
-        Extlib.may_map
-          (fun (_, rhs, flow) ->
-            let env =
-              if Mmodel_analysis.must_model_exp ~kf param then
-                let stmt = Mk.save_param ~loc flow rhs index in
-                Env.add_stmt ~before:current_stmt ~post:false env kf stmt
-              else env
-            in
-            (env, index+1))
-          ~dft:(env, index+1)
-          vals)
-      (env, 0)
-      args
+        (fun (env, index) param ->
+           let lv = Mem(param), NoOffset in
+           let ltype = Cil.typeOf param in
+           let vals = assign ~ltype lv param loc in
+           Extlib.may_map
+             (fun (_, rhs, flow) ->
+                let env =
+                  if Memory_tracking.must_monitor_exp ~kf param then
+                    let stmt = Mk.save_param ~loc flow rhs index in
+                    Env.add_stmt ~before:current_stmt ~post:false env kf stmt
+                  else env
+                in
+                (env, index+1))
+             ~dft:(env, index+1)
+             vals)
+        (env, 0)
+        args
     in env
 
   (* Update local environment with a statement tracking temporal metadata
      associated with assignment [ret] = [func(args)]. *)
   let call_with_ret ?(alloc=false) current_stmt loc ret env kf =
-    let rhs = Constructor.mk_lval ~loc ret in
+    let rhs = Smart_exp.lval ~loc ret in
     let vals = assign ret rhs loc in
     (* Track referent numbers of assignments via function calls.
        Library functions (i.e., with no source code available) that return
@@ -282,17 +283,17 @@ end = struct
        [pull_return] added via a call to [Mk.handle_return_referent] *)
     Extlib.may_map
       (fun (lhs, rhs, flow) ->
-        let flow, rhs = match flow with
-          | Indirect when alloc -> Direct, (Constructor.mk_deref ~loc rhs)
-          | _ -> flow, rhs
-        in
-        let stmt =
-          if alloc then
-            Mk.store_reference ~loc flow lhs rhs
-          else
-            Mk.handle_return_referent ~save:false ~loc (Cil.mkAddrOf ~loc lhs)
-        in
-        Env.add_stmt ~before:current_stmt ~post:true env kf stmt)
+         let flow, rhs = match flow with
+           | Indirect when alloc -> Direct, (Smart_exp.deref ~loc rhs)
+           | _ -> flow, rhs
+         in
+         let stmt =
+           if alloc then
+             Mk.store_reference ~loc flow lhs rhs
+           else
+             Mk.handle_return_referent ~save:false ~loc (Cil.mkAddrOf ~loc lhs)
+         in
+         Env.add_stmt ~before:current_stmt ~post:true env kf stmt)
       ~dft:env
       vals
 
@@ -305,7 +306,7 @@ end = struct
         | _ -> Options.fatal "[Temporal.call_memxxx] not a left-value"
       in
       let stmt =
-        Constructor.mk_lib_call ~loc (RTL.mk_temporal_name name) args
+        Smart_stmt.lib_call ~loc (RTL.mk_temporal_name name) args
       in
       Env.add_stmt ~before:current_stmt ~post:false env kf stmt
     else
@@ -320,7 +321,7 @@ end = struct
        the implementation of the function should be empty and compiler should
        be able to optimize that code out. *)
     let name = (RTL.mk_temporal_name "reset_parameters") in
-    let stmt = Constructor.mk_lib_call ~loc name [] in
+    let stmt = Smart_stmt.lib_call ~loc name [] in
     let env = Env.add_stmt ~before:current_stmt ~post:false env kf stmt in
     let stmt = Mk.reset_return_referent ~loc in
     let env = Env.add_stmt ~before:current_stmt ~post:false env kf stmt in
@@ -340,9 +341,9 @@ end = struct
     let alloc = not has_def in
     Extlib.may_map
       (fun lhs ->
-        if Mmodel_analysis.must_model_lval ~kf lhs then
-          call_with_ret ~alloc current_stmt loc lhs env kf
-        else env)
+         if Memory_tracking.must_monitor_lval ~kf lhs then
+           call_with_ret ~alloc current_stmt loc lhs env kf
+         else env)
       ~dft:env
       ret
 end
@@ -370,7 +371,7 @@ end = struct
         inits
 
   let instr current_stmt vi li loc env kf =
-    if Mmodel_analysis.must_model_vi ~kf vi then
+    if Memory_tracking.must_monitor_vi ~kf vi then
       match li with
       | AssignInit init ->
         handle_init current_stmt NoOffset loc vi init env kf
@@ -420,7 +421,7 @@ let handle_return_stmt loc ret env kf =
   | _ -> Options.fatal "Something other than Lval in return"
 
 let handle_return_stmt loc ret env kf =
-  if Mmodel_analysis.must_model_exp ~kf ret then
+  if Memory_tracking.must_monitor_exp ~kf ret then
     handle_return_stmt loc ret env kf
   else
     env
@@ -465,15 +466,15 @@ let mk_global_init ~loc vi off init =
      corresponding variable which that literal string has been converted to *)
   let exp =
     try let rec get_string e = match e.enode with
-      | Const(CStr str) -> str
-      | CastE(_, exp) -> get_string exp
-      | _ -> raise Not_found
-    in
-    let str = get_string exp in
-    Cil.evar ~loc (Literal_strings.find str)
-  with
+        | Const(CStr str) -> str
+        | CastE(_, exp) -> get_string exp
+        | _ -> raise Not_found
+      in
+      let str = get_string exp in
+      Cil.evar ~loc (Literal_strings.find str)
+    with
     (* Not a literal string: just use the expression at hand *)
-    Not_found -> exp
+      Not_found -> exp
   in
   (* The input [vi] is from the old project, so get the corresponding variable
      from the new one, otherwise AST integrity is violated *)
@@ -488,15 +489,15 @@ let mk_global_init ~loc vi off init =
 let handle_function_parameters kf env =
   if is_enabled () then
     let env, _ = List.fold_left
-      (fun (env, index) param ->
-        let env =
-          if Mmodel_analysis.must_model_vi ~kf param
-          then track_argument param index env kf
-          else env
-        in
-        env, index + 1)
-      (env, 0)
-      (Kernel_function.get_formals kf)
+        (fun (env, index) param ->
+           let env =
+             if Memory_tracking.must_monitor_vi ~kf param
+             then track_argument param index env kf
+             else env
+           in
+           env, index + 1)
+        (env, 0)
+        (Kernel_function.get_formals kf)
     in env
   else
     env
@@ -505,8 +506,8 @@ let handle_stmt stmt env kf =
   if is_enabled () then begin
     match stmt.skind with
     | Instr instr -> handle_instruction stmt instr env kf
-    | Return(ret, loc) -> Extlib.may_map
-      (fun ret -> handle_return_stmt loc ret env kf) ~dft:env ret
+    | Return(ret, loc) ->
+      Extlib.may_map (fun ret -> handle_return_stmt loc ret env kf) ~dft:env ret
     | Goto _ | Break _ | Continue _ | If _ | Switch _ | Loop _ | Block _
     | UnspecifiedSequence _ | Throw _ | TryCatch _ | TryFinally _
     | TryExcept _ -> env
diff --git a/src/plugins/e-acsl/src/code_generator/temporal.mli b/src/plugins/e-acsl/src/code_generator/temporal.mli
index 087683efea0f91666aa6e29ad8d8b3f98fe1179d..469df071656ebe7278c7090343e8ab85e3a71959 100644
--- a/src/plugins/e-acsl/src/code_generator/temporal.mli
+++ b/src/plugins/e-acsl/src/code_generator/temporal.mli
@@ -43,8 +43,8 @@ val handle_stmt: stmt -> Env.t -> kernel_function -> Env.t
     properties of memory blocks *)
 
 val generate_global_init: varinfo -> offset -> init -> stmt option
-  (** Generate [Some s], where [s] is a statement tracking global initializer
-      or [None] if there is no need to track it *)
+(** Generate [Some s], where [s] is a statement tracking global initializer
+    or [None] if there is no need to track it *)
 
 (*
 Local Variables:
diff --git a/src/plugins/e-acsl/src/code_generator/translate.ml b/src/plugins/e-acsl/src/code_generator/translate.ml
index 009763c7931d6f8d47f548698052917a7551ed21..81b165d36f9a914a62c2a80baf4a91bccfc23f23 100644
--- a/src/plugins/e-acsl/src/code_generator/translate.ml
+++ b/src/plugins/e-acsl/src/code_generator/translate.ml
@@ -24,17 +24,11 @@ module E_acsl_label = Label
 open Cil_types
 open Cil_datatype
 
-let dkey = Options.dkey_translation
-
-let not_yet env s =
-  Env.Context.save env;
-  Error.not_yet s
+(** *)
 
-let handle_error f env =
-  let env = Error.handle f env in
-  Env.Context.restore env
+let dkey = Options.dkey_translation
 
-(* internal to [named_predicate_to_exp] but put it outside in order to not add
+(* internal to [predicate_to_exp] but put it outside in order to not add
    extra tedious parameter.
    It is [true] iff we are currently visiting \valid. *)
 let is_visiting_valid = ref false
@@ -141,7 +135,7 @@ let add_cast ~loc ?name env kf ctx strnum t_opt e =
             None
             new_ty
             (fun v _ ->
-               [ Constructor.mk_lib_call ~loc ~result:(Cil.var v) fname [ e ] ])
+               [ Smart_stmt.lib_call ~loc ~result:(Cil.var v) fname [ e ] ])
         in
         e, env
       else if Gmp_types.Q.is_t ty || strnum = Str_R then
@@ -229,7 +223,7 @@ let conditional_to_exp ?(name="if") loc kf t_opt e1 (e2, env2) (e3, env3) =
              let s = affect e3 in
              Env.pop_and_get env3 s ~global_clear:false Env.Middle
            in
-           [ Constructor.mk_if ~loc ~cond:e1 then_blk ~else_blk ])
+           [ Smart_stmt.if_stmt ~loc ~cond:e1 then_blk ~else_blk ])
     in
     e, env
 
@@ -257,7 +251,7 @@ and toffset_to_offset ?loc kf env = function
     let e, env = term_to_exp kf env t in
     let offset, env = toffset_to_offset kf env offset in
     Index(e, offset), env
-  | TModel _ -> not_yet env "model"
+  | TModel _ -> Env.not_yet env "model"
 
 and tlval_to_lval kf env (host, offset) =
   let host, env, name = thost_to_host kf env host in
@@ -276,7 +270,7 @@ and context_insensitive_term_to_exp kf env t =
     c, env, strnum, ""
   | TLval lv ->
     let lv, env, name = tlval_to_lval kf env lv in
-    Constructor.mk_lval ~loc lv, env, C_number, name
+    Smart_exp.lval ~loc lv, env, C_number, name
   | TSizeOf ty -> Cil.sizeOf ~loc ty, env, C_number, "sizeof"
   | TSizeOfE t ->
     let e, env = term_to_exp kf env t in
@@ -303,11 +297,11 @@ and context_insensitive_term_to_exp kf env t =
           kf
           ~name:vname
           (Some t)
-          (fun _ ev -> [ Constructor.mk_lib_call ~loc name [ ev; e ] ])
+          (fun _ ev -> [ Smart_stmt.lib_call ~loc name [ ev; e ] ])
       in
       e, env, C_number, ""
     else if Gmp_types.Q.is_t ty then
-      not_yet env "reals: Neg | BNot"
+      Env.not_yet env "reals: Neg | BNot"
     else
       Cil.new_exp ~loc (UnOp(op, e, ty)), env, C_number, ""
   | TUnOp(LNot, t) ->
@@ -332,7 +326,7 @@ and context_insensitive_term_to_exp kf env t =
     let e2, env = term_to_exp kf env t2 in
     if Gmp_types.Z.is_t ty then
       let name = name_of_mpz_arith_bop bop in
-      let mk_stmts _ e = [ Constructor.mk_lib_call ~loc name [ e; e1; e2 ] ] in
+      let mk_stmts _ e = [ Smart_stmt.lib_call ~loc name [ e; e1; e2 ] ] in
       let name = Misc.name_of_binop bop in
       let _, e, env =
         Env.new_var_and_mpz_init ~loc ~name env kf (Some t) mk_stmts
@@ -370,14 +364,14 @@ and context_insensitive_term_to_exp kf env t =
       let mk_stmts _v e =
         assert (Gmp_types.Z.is_t ty);
         let cond =
-          Constructor.mk_runtime_check
+          Smart_stmt.runtime_check
             (Env.annotation_kind env)
             kf
             guard
             p
         in
         Env.add_assert kf cond p;
-        let instr = Constructor.mk_lib_call ~loc name [ e; e1; e2 ] in
+        let instr = Smart_stmt.lib_call ~loc name [ e; e1; e2 ] in
         [ cond; instr ]
       in
       let name = Misc.name_of_binop bop in
@@ -435,7 +429,7 @@ and context_insensitive_term_to_exp kf env t =
             (fun vi _e ->
                let result = Cil.var vi in
                let fname = "__gmpz_fits_ulong_p" in
-               [ Constructor.mk_lib_call ~loc ~result fname [ e2 ] ])
+               [ Smart_stmt.lib_call ~loc ~result fname [ e2 ] ])
         in
         e, env
       in
@@ -454,8 +448,8 @@ and context_insensitive_term_to_exp kf env t =
           in
           let pname = bop_name ^ "_rhs_fits_in_mp_bitcnt_t" in
           let pred = { pred with pred_name = pname :: pred.pred_name } in
-          let cond = Constructor.mk_runtime_check
-              Constructor.RTE
+          let cond = Smart_stmt.runtime_check
+              Smart_stmt.RTE
               kf
               coerce_guard
               pred
@@ -465,7 +459,7 @@ and context_insensitive_term_to_exp kf env t =
         in
         let result = Cil.var vi in
         let name = "__gmpz_get_ui" in
-        let instr = Constructor.mk_lib_call ~loc ~result name [ e2 ] in
+        let instr = Smart_stmt.lib_call ~loc ~result name [ e2 ] in
         [ coerce_guard_cond; instr ]
       in
       let name = e2_name ^ bop_name ^ "_coerced" in
@@ -484,7 +478,7 @@ and context_insensitive_term_to_exp kf env t =
       (* Create the shift instruction *)
       let mk_shift_instr result_e =
         let name = name_of_mpz_arith_bop bop in
-        Constructor.mk_lib_call ~loc name [ result_e; e1; e2_as_bitcnt_e ]
+        Smart_stmt.lib_call ~loc name [ result_e; e1; e2_as_bitcnt_e ]
       in
 
       (* Put t in an option to use with comparison_to_exp and
@@ -515,8 +509,8 @@ and context_insensitive_term_to_exp kf env t =
           in
           let e1_guard_cond =
             let pred = Logic_const.prel ~loc (Rge, t1, zero) in
-            let cond = Constructor.mk_runtime_check
-                Constructor.RTE
+            let cond = Smart_stmt.runtime_check
+                Smart_stmt.RTE
                 kf
                 e1_guard
                 pred
@@ -568,7 +562,7 @@ and context_insensitive_term_to_exp kf env t =
     if Gmp_types.Z.is_t ty then
       let mk_stmts _v e =
         let name = name_of_mpz_arith_bop bop in
-        let instr = Constructor.mk_lib_call ~loc name [ e; e1; e2 ] in
+        let instr = Smart_stmt.lib_call ~loc name [ e; e1; e2 ] in
         [ instr ]
       in
       let name = Misc.name_of_binop bop in
@@ -583,7 +577,8 @@ and context_insensitive_term_to_exp kf env t =
     if Misc.is_set_of_ptr_or_array t1.term_type ||
        Misc.is_set_of_ptr_or_array t2.term_type then
       (* case of arithmetic over set of pointers (due to use of ranges)
-         should have already been handled in [mmodel_call_with_ranges] *)
+         should have already been handled in [Memory_translate.call_with_ranges]
+      *)
       assert false;
     (* binary operation over pointers *)
     let ty = match t1.term_type with
@@ -601,7 +596,7 @@ and context_insensitive_term_to_exp kf env t =
         let ty = Typing.get_typ t in
         Cil.new_exp ~loc (BinOp(MinusPP, e1, e2, ty)), env, C_number, ""
       | Typing.Gmpz ->
-        not_yet env "pointer subtraction resulting in gmp"
+        Env.not_yet env "pointer subtraction resulting in gmp"
       | Typing.(C_float _ | Rational | Real | Nan) ->
         assert false
     end
@@ -646,7 +641,7 @@ and context_insensitive_term_to_exp kf env t =
           (Some t)
           (Misc.cty (Extlib.the li.l_type))
           (fun vi _ ->
-             [ Constructor.mk_lib_call ~loc ~result:(Cil.var vi) fname args ])
+             [ Smart_stmt.lib_call ~loc ~result:(Cil.var vi) fname args ])
       else
         (* build the arguments and compute the integer_ty of the parameters *)
         let params_ty, args, env =
@@ -672,9 +667,9 @@ and context_insensitive_term_to_exp kf env t =
     in
     e, env, C_number, "app"
   | Tapp(_, _ :: _, _) ->
-    not_yet env "logic functions with labels"
-  | Tlambda _ -> not_yet env "functional"
-  | TDataCons _ -> not_yet env "constructor"
+    Env.not_yet env "logic functions with labels"
+  | Tlambda _ -> Env.not_yet env "functional"
+  | TDataCons _ -> Env.not_yet env "constructor"
   | Tif(t1, t2, t3) ->
     let e1, env1 = term_to_exp kf (Env.rte env true) t1 in
     let (_, env2 as res2) = term_to_exp kf (Env.push env1) t2 in
@@ -696,31 +691,31 @@ and context_insensitive_term_to_exp kf env t =
       e, env, sty, ""
   | Tbase_addr(BuiltinLabel Here, t) ->
     let name = "base_addr" in
-    let e, env = Mmodel_translate.call ~loc kf name Cil.voidPtrType env t in
+    let e, env = Memory_translate.call ~loc kf name Cil.voidPtrType env t in
     e, env, C_number, name
-  | Tbase_addr _ -> not_yet env "labeled \\base_addr"
+  | Tbase_addr _ -> Env.not_yet env "labeled \\base_addr"
   | Toffset(BuiltinLabel Here, t) ->
     let size_t = Cil.theMachine.Cil.typeOfSizeOf in
     let name = "offset" in
-    let e, env = Mmodel_translate.call ~loc kf name size_t env t in
+    let e, env = Memory_translate.call ~loc kf name size_t env t in
     e, env, C_number, name
-  | Toffset _ -> not_yet env "labeled \\offset"
+  | Toffset _ -> Env.not_yet env "labeled \\offset"
   | Tblock_length(BuiltinLabel Here, t) ->
     let size_t = Cil.theMachine.Cil.typeOfSizeOf in
     let name = "block_length" in
-    let e, env = Mmodel_translate.call ~loc kf name size_t env t in
+    let e, env = Memory_translate.call ~loc kf name size_t env t in
     e, env, C_number, name
-  | Tblock_length _ -> not_yet env "labeled \\block_length"
+  | Tblock_length _ -> Env.not_yet env "labeled \\block_length"
   | Tnull ->
     Cil.mkCast (Cil.zero ~loc) (TPtr(TVoid [], [])), env, C_number, "null"
-  | TUpdate _ -> not_yet env "functional update"
-  | Ttypeof _ -> not_yet env "typeof"
-  | Ttype _ -> not_yet env "C type"
-  | Tempty_set -> not_yet env "empty tset"
-  | Tunion _ -> not_yet env "union of tsets"
-  | Tinter _ -> not_yet env "intersection of tsets"
-  | Tcomprehension _ -> not_yet env "tset comprehension"
-  | Trange _ -> not_yet env "range"
+  | TUpdate _ -> Env.not_yet env "functional update"
+  | Ttypeof _ -> Env.not_yet env "typeof"
+  | Ttype _ -> Env.not_yet env "C type"
+  | Tempty_set -> Env.not_yet env "empty tset"
+  | Tunion _ -> Env.not_yet env "union of tsets"
+  | Tinter _ -> Env.not_yet env "intersection of tsets"
+  | Tcomprehension _ -> Env.not_yet env "tset comprehension"
+  | Trange _ -> Env.not_yet env "range"
   | Tlet(li, t) ->
     let lvs = Lscope.Lvs_let(li.l_var_info, Misc.term_of_li li) in
     let env = Env.Logic_scope.extend env lvs in
@@ -788,7 +783,7 @@ and comparison_to_exp
             ~name
             Cil.intType
             (fun v _ ->
-               [ Constructor.mk_lib_call ~loc
+               [ Smart_stmt.lib_call ~loc
                    ~result:(Cil.var v)
                    "__gmpz_cmp"
                    [ e1; e2 ] ])
@@ -855,7 +850,7 @@ and env_of_li li kf env loc =
   let e, env = term_to_exp kf env t in
   let stmt = match Typing.get_number_ty t with
     | Typing.(C_integer _ | C_float _ | Nan) ->
-      Constructor.mk_assigns ~loc ~result:(Cil.var vi) e
+      Smart_stmt.assigns ~loc ~result:(Cil.var vi) e
     | Typing.Gmpz ->
       Gmp.init_set ~loc (Cil.var vi) vi_e e
     | Typing.Rational ->
@@ -865,10 +860,10 @@ and env_of_li li kf env loc =
   in
   Env.add_stmt env kf stmt
 
-(* Convert an ACSL named predicate into a corresponding C expression (if
-   any) in the given environment. Also extend this environment which includes
-   the generating constructs. *)
-and named_predicate_content_to_exp ?name kf env p =
+(* Convert an ACSL predicate into a corresponding C expression (if any) in the
+   given environment. Also extend this environment which includes the generating
+   constructs. *)
+and predicate_content_to_exp ?name kf env p =
   let loc = p.pred_loc in
   match p.pred_content with
   | Pfalse -> Cil.zero ~loc, env
@@ -887,39 +882,39 @@ and named_predicate_content_to_exp ?name kf env p =
     Typing.type_term ~use_gmp_opt:false ~ctx:Typing.c_int tapp;
     let e, env = term_to_exp kf env tapp in
     e, env
-  | Pseparated _ -> not_yet env "\\separated"
-  | Pdangling _ -> not_yet env "\\dangling"
-  | Pobject_pointer _ -> not_yet env "\\object_pointer"
-  | Pvalid_function _ -> not_yet env "\\valid_function"
+  | Pseparated _ -> Env.not_yet env "\\separated"
+  | Pdangling _ -> Env.not_yet env "\\dangling"
+  | Pobject_pointer _ -> Env.not_yet env "\\object_pointer"
+  | Pvalid_function _ -> Env.not_yet env "\\valid_function"
   | Prel(rel, t1, t2) ->
     let ity = Typing.get_integer_op_of_predicate p in
     comparison_to_exp ~loc kf env ity (relation_to_binop rel) t1 t2 None
   | Pand(p1, p2) ->
     (* p1 && p2 <==> if p1 then p2 else false *)
-    let e1, env1 = named_predicate_to_exp kf (Env.rte env true) p1 in
+    let e1, env1 = predicate_to_exp kf (Env.rte env true) p1 in
     let _, env2 as res2 =
-      named_predicate_to_exp kf (Env.push env1) p2 in
+      predicate_to_exp kf (Env.push env1) p2 in
     let env3 = Env.push env2 in
     let name = match name with None -> "and" | Some n -> n in
     conditional_to_exp ~name loc kf None e1 res2 (Cil.zero loc, env3)
   | Por(p1, p2) ->
     (* p1 || p2 <==> if p1 then true else p2 *)
-    let e1, env1 = named_predicate_to_exp kf (Env.rte env true) p1 in
+    let e1, env1 = predicate_to_exp kf (Env.rte env true) p1 in
     let env' = Env.push env1 in
-    let res2 = named_predicate_to_exp kf (Env.push env') p2 in
+    let res2 = predicate_to_exp kf (Env.push env') p2 in
     let name = match name with None -> "or" | Some n -> n in
     conditional_to_exp ~name loc kf None e1 (Cil.one loc, env') res2
-  | Pxor _ -> not_yet env "xor"
+  | Pxor _ -> Env.not_yet env "xor"
   | Pimplies(p1, p2) ->
     (* (p1 ==> p2) <==> !p1 || p2 *)
-    named_predicate_to_exp
+    predicate_to_exp
       ~name:"implies"
       kf
       env
       (Logic_const.por ~loc ((Logic_const.pnot ~loc p1), p2))
   | Piff(p1, p2) ->
     (* (p1 <==> p2) <==> (p1 ==> p2 && p2 ==> p1) *)
-    named_predicate_to_exp
+    predicate_to_exp
       ~name:"equiv"
       kf
       env
@@ -927,24 +922,24 @@ and named_predicate_content_to_exp ?name kf env p =
          (Logic_const.pimplies ~loc (p1, p2),
           Logic_const.pimplies ~loc (p2, p1)))
   | Pnot p ->
-    let e, env = named_predicate_to_exp kf env p in
+    let e, env = predicate_to_exp kf env p in
     Cil.new_exp ~loc (UnOp(LNot, e, Cil.intType)), env
   | Pif(t, p2, p3) ->
     let e1, env1 = term_to_exp kf (Env.rte env true) t in
     let (_, env2 as res2) =
-      named_predicate_to_exp kf (Env.push env1) p2 in
-    let res3 = named_predicate_to_exp kf (Env.push env2) p3 in
+      predicate_to_exp kf (Env.push env1) p2 in
+    let res3 = predicate_to_exp kf (Env.push env2) p3 in
     conditional_to_exp loc kf None e1 res2 res3
   | Plet(li, p) ->
     let lvs = Lscope.Lvs_let(li.l_var_info, Misc.term_of_li li) in
     let env = Env.Logic_scope.extend env lvs in
     let env = env_of_li li kf env loc in
-    let e, env = named_predicate_to_exp kf env p in
+    let e, env = predicate_to_exp kf env p in
     Interval.Env.remove li.l_var_info;
     e, env
   | Pforall _ | Pexists _ -> Quantif.quantif_to_exp kf env p
   | Pat(p, BuiltinLabel Here) ->
-    named_predicate_to_exp kf env p
+    predicate_to_exp kf env p
   | Pat(p', label) ->
     let lscope = Env.Logic_scope.get env in
     let pot = Lscope.PoT_pred p' in
@@ -952,7 +947,7 @@ and named_predicate_content_to_exp ?name kf env p =
       At_with_lscope.to_exp ~loc kf env pot label
     else begin
       (* convert [t'] to [e] in a separated local env *)
-      let e, env = named_predicate_to_exp kf (Env.push env) p' in
+      let e, env = predicate_to_exp kf (Env.push env) p' in
       let e, env, sty = at_to_exp_no_lscope env kf None label e in
       assert (sty = C_number);
       e, env
@@ -965,7 +960,7 @@ and named_predicate_content_to_exp ?name kf env p =
         | Pvalid_read _ -> "valid_read"
         | _ -> assert false
       in
-      Mmodel_translate.call_valid ~loc kf name Cil.intType env t
+      Memory_translate.call_valid ~loc kf name Cil.intType env t
     in
     if !is_visiting_valid then begin
       (* we already transformed \valid(t) into \initialized(&t) && \valid(t):
@@ -981,12 +976,12 @@ and named_predicate_content_to_exp ?name kf env p =
         Typing.type_named_predicate ~must_clear:false init;
         let p = Logic_const.pand ~loc (init, p) in
         is_visiting_valid := true;
-        named_predicate_to_exp kf env p
+        predicate_to_exp kf env p
       | _ ->
         call_valid t p
     end
-  | Pvalid _ -> not_yet env "labeled \\valid"
-  | Pvalid_read _ -> not_yet env "labeled \\valid_read"
+  | Pvalid _ -> Env.not_yet env "labeled \\valid"
+  | Pvalid_read _ -> Env.not_yet env "labeled \\valid_read"
   | Pinitialized(BuiltinLabel Here, t) ->
     (match t.term_node with
      (* optimisation when we know that the initialisation is ok *)
@@ -996,7 +991,7 @@ and named_predicate_content_to_exp ?name kf env p =
          vi.vformal || vi.vglob || Functions.RTL.is_generated_name vi.vname ->
        Cil.one ~loc, env
      | _ ->
-       Mmodel_translate.call_with_size
+       Memory_translate.call_with_size
          ~loc
          kf
          "initialized"
@@ -1004,17 +999,17 @@ and named_predicate_content_to_exp ?name kf env p =
          env
          t
          p)
-  | Pinitialized _ -> not_yet env "labeled \\initialized"
-  | Pallocable _ -> not_yet env "\\allocate"
+  | Pinitialized _ -> Env.not_yet env "labeled \\initialized"
+  | Pallocable _ -> Env.not_yet env "\\allocate"
   | Pfreeable(BuiltinLabel Here, t) ->
-    Mmodel_translate.call ~loc kf "freeable" Cil.intType env t
-  | Pfreeable _ -> not_yet env "labeled \\freeable"
-  | Pfresh _ -> not_yet env "\\fresh"
+    Memory_translate.call ~loc kf "freeable" Cil.intType env t
+  | Pfreeable _ -> Env.not_yet env "labeled \\freeable"
+  | Pfresh _ -> Env.not_yet env "\\fresh"
 
-and named_predicate_to_exp ?name kf ?rte env p =
+and predicate_to_exp ?name kf ?rte env p =
   let rte = match rte with None -> Env.generate_rte env | Some b -> b in
   let env = Env.rte env false in
-  let e, env = named_predicate_content_to_exp ?name kf env p in
+  let e, env = predicate_content_to_exp ?name kf env p in
   let env = if rte then translate_rte kf env e else env in
   let cast = Typing.get_cast_of_predicate p in
   add_cast
@@ -1027,26 +1022,36 @@ and named_predicate_to_exp ?name kf ?rte env p =
     None
     e
 
+and generalized_untyped_predicate_to_exp ?name kf ?rte ?must_clear_typing env p =
+  let rte = match rte with None -> Env.generate_rte env | Some b -> b in
+  let must_clear = match must_clear_typing with None -> rte | Some b -> b in
+  Typing.type_named_predicate ~must_clear p;
+  let e, env = predicate_to_exp ?name kf ~rte env p in
+  assert (Typ.equal (Cil.typeOf e) Cil.intType);
+  let env = Env.Logic_scope.reset env in
+  e, env
+
 and translate_rte_annots:
   'a. (Format.formatter -> 'a -> unit) -> 'a ->
   kernel_function -> Env.t -> code_annotation list -> Env.t =
   fun pp elt kf env l ->
   let old_valid = !is_visiting_valid in
   let old_kind = Env.annotation_kind env in
-  let env = Env.set_annotation_kind env Constructor.RTE in
+  let env = Env.set_annotation_kind env Smart_stmt.RTE in
   let env =
     List.fold_left
       (fun env a -> match a.annot_content with
-         | AAssert(_, _, p) ->
-           handle_error
+         | AAssert(_, p) ->
+           Env.handle_error
              (fun env ->
                 Options.feedback ~dkey ~level:4 "prevent RTE from %a" pp elt;
                 (* The logic scope MUST NOT be reset here since we still might
                    be in the middle of the translation of the original
                    predicate. *)
+                let p = p.tp_statement in
                 let lscope_reset_old = Env.Logic_scope.get_reset env in
                 let env = Env.Logic_scope.set_reset env false in
-                let env = translate_named_predicate kf (Env.rte env false) p in
+                let env = translate_predicate kf (Env.rte env false) p in
                 let env = Env.Logic_scope.set_reset env lscope_reset_old in
                 env)
              env
@@ -1067,51 +1072,60 @@ and translate_rte ?filter kf env e =
   in
   translate_rte_annots Printer.pp_exp e kf env l
 
-and translate_named_predicate kf env p =
+and translate_predicate ?pred_to_print kf env p =
   Options.feedback ~dkey ~level:3 "translating predicate %a"
     Printer.pp_predicate p;
-  let rte = Env.generate_rte env in
-  Typing.type_named_predicate ~must_clear:rte p;
-  let e, env = named_predicate_to_exp kf ~rte env p in
-  assert (Typ.equal (Cil.typeOf e) Cil.intType);
-  let env = Env.Logic_scope.reset env in
+  let pred_to_print =
+    match pred_to_print with
+    | Some pred ->
+      Options.feedback ~dkey ~level:3 "(predicate to print %a)"
+        Printer.pp_predicate pred;
+      pred
+    | None -> p
+  in
+  let e, env = generalized_untyped_predicate_to_exp kf env p in
   Env.add_stmt
     env
     kf
-    (Constructor.mk_runtime_check
+    (Smart_stmt.runtime_check
        (Env.annotation_kind env)
        kf
        e
-       p)
+       pred_to_print)
 
-let named_predicate_to_exp ?name kf env p =
-  named_predicate_to_exp ?name kf env p (* forget optional argument ?rte *)
+let predicate_to_exp_without_rte ?name kf env p =
+  predicate_to_exp ?name kf env p (* forget optional argument ?rte *)
 
 let () =
   Loops.term_to_exp_ref := term_to_exp;
-  Loops.translate_named_predicate_ref := translate_named_predicate;
-  Loops.named_predicate_ref := named_predicate_to_exp;
-  Quantif.predicate_to_exp_ref := named_predicate_to_exp;
+  Loops.translate_predicate_ref := translate_predicate;
+  Loops.predicate_to_exp_ref := predicate_to_exp_without_rte;
+  Quantif.predicate_to_exp_ref := predicate_to_exp_without_rte;
   At_with_lscope.term_to_exp_ref := term_to_exp;
-  At_with_lscope.predicate_to_exp_ref := named_predicate_to_exp;
-  Mmodel_translate.term_to_exp_ref := term_to_exp;
-  Mmodel_translate.predicate_to_exp_ref := named_predicate_to_exp;
+  At_with_lscope.predicate_to_exp_ref := predicate_to_exp_without_rte;
+  Memory_translate.term_to_exp_ref := term_to_exp;
+  Memory_translate.predicate_to_exp_ref := predicate_to_exp_without_rte;
   Logic_functions.term_to_exp_ref := term_to_exp;
-  Logic_functions.named_predicate_to_exp_ref := named_predicate_to_exp;
+  Logic_functions.predicate_to_exp_ref := predicate_to_exp_without_rte;
   Logic_array.translate_rte_ref := translate_rte
 
+exception No_simple_term_translation of term
+exception No_simple_predicate_translation of predicate
+
 (* This function is used by Guillaume.
    However, it is correct to use it only in specific contexts. *)
-let predicate_to_exp kf p =
-  Typing.type_named_predicate ~must_clear:true p;
-  let e, _ = named_predicate_to_exp kf Env.empty p in
-  assert (Typ.equal (Cil.typeOf e) Cil.intType);
+let untyped_predicate_to_exp p =
+  let env = Env.push Env.empty in
+  let env = Env.rte env false in
+  let e, env =
+    try generalized_untyped_predicate_to_exp ~must_clear_typing:false (Kernel_function.dummy ()) env p
+    with Rtl.Symbols.Unregistered _ -> raise (No_simple_predicate_translation p)
+  in
+  if not (Env.has_no_new_stmt env) then raise (No_simple_predicate_translation p);
   e
 
-exception No_simple_translation of term
-
 (* This function is used by plug-in [Cfp]. *)
-let term_to_exp typ t =
+let untyped_term_to_exp typ t =
   (* infer a context from the given [typ] whenever possible *)
   let ctx_of_typ ty =
     if Gmp_types.Z.is_t ty then Typing.gmpz
@@ -1128,217 +1142,11 @@ let term_to_exp typ t =
   let env = Env.rte env false in
   let e, env =
     try term_to_exp (Kernel_function.dummy ()) env t
-    with Rtl.Symbols.Unregistered _ -> raise (No_simple_translation t)
+    with Rtl.Symbols.Unregistered _ -> raise (No_simple_term_translation t)
   in
-  if not (Env.has_no_new_stmt env) then raise (No_simple_translation t);
+  if not (Env.has_no_new_stmt env) then raise (No_simple_term_translation t);
   e
 
-(* ************************************************************************** *)
-(* [translate_*] translates a given ACSL annotation into the corresponding C
-   statement (if any) for runtime assertion checking. *)
-(* ************************************************************************** *)
-
-let must_translate ppt =
-  Options.Valid.get ()
-  || match Property_status.get ppt with
-  | Never_tried
-  | Inconsistent _
-  | Best ((False_if_reachable | False_and_reachable | Dont_know), _) ->
-    true
-  | Best (True, _) ->
-    (* [TODO] generating code for "valid under hypotheses" properties could be
-       useful for some use cases (in particular, when E-ACSL does not stop on
-       the very first error).
-       ==> introduce a new option or modify the behavior of -e-acsl-valid,
-       see e-acsl#35 *)
-    false
-
-let must_translate_opt = function
-  | None -> false
-  | Some ppt -> must_translate ppt
-
-let assumes_predicate bhv =
-  List.fold_left
-    (fun acc p ->
-       let loc = p.ip_content.pred_loc in
-       Logic_const.pand ~loc
-         (acc,
-          Logic_const.unamed ~loc p.ip_content.pred_content))
-    Logic_const.ptrue
-    bhv.b_assumes
-
-let translate_preconditions kf kinstr env behaviors =
-  let env = Env.set_annotation_kind env Constructor.Precondition in
-  let do_behavior env b =
-    let assumes_pred = assumes_predicate b in
-    List.fold_left
-      (fun env p ->
-         let do_it env =
-           if must_translate (Property.ip_of_requires kf kinstr b p) then
-             let loc = p.ip_content.pred_loc in
-             let p =
-               Logic_const.pimplies
-                 ~loc
-                 (assumes_pred,
-                  Logic_const.unamed ~loc p.ip_content.pred_content)
-             in
-             translate_named_predicate kf env p
-           else
-             env
-         in
-         handle_error do_it env)
-      env
-      b.b_requires
-  in
-  List.fold_left do_behavior env behaviors
-
-let translate_postconditions kf kinstr env behaviors =
-  let env = Env.set_annotation_kind env Constructor.Postcondition in
-  (* generate one guard by postcondition of each behavior *)
-  let do_behavior env b =
-    let env =
-      handle_error
-        (fun env ->
-           let active = [] in (* TODO: 'for' behaviors, e-acsl#109 *)
-           let ppt = Property.ip_assigns_of_behavior kf kinstr ~active b in
-           if b.b_assigns <> WritesAny && must_translate_opt ppt
-           then not_yet env "assigns clause in behavior";
-           (* ignore b.b_extended since we never translate them *)
-           env)
-        env
-    in
-    let assumes_pred = assumes_predicate b in
-    List.fold_left
-      (fun env ((t, p) as tp) ->
-         if must_translate (Property.ip_of_ensures kf kinstr b tp) then
-           let do_it env =
-             match t with
-             | Normal ->
-               let loc = p.ip_content.pred_loc in
-               let p = p.ip_content in
-               let p =
-                 Logic_const.pimplies
-                   ~loc
-                   (Logic_const.pold ~loc assumes_pred,
-                    Logic_const.unamed ~loc p.pred_content)
-               in
-               translate_named_predicate kf env p
-             | Exits | Breaks | Continues | Returns ->
-               not_yet env "abnormal termination case in behavior"
-           in
-           handle_error do_it env
-         else env)
-      env
-      b.b_post_cond
-  in
-  (* fix ordering of behaviors' iterations *)
-  let bhvs =
-    List.sort (fun b1 b2 -> String.compare b1.b_name b2.b_name) behaviors
-  in
-  List.fold_left do_behavior env bhvs
-
-let translate_pre_spec kf kinstr env spec =
-  let unsupported f x = ignore (handle_error (fun env -> f x; env) env) in
-  let convert_unsupported_clauses env =
-    unsupported
-      (fun spec ->
-         let ppt = Property.ip_decreases_of_spec kf kinstr spec in
-         if must_translate_opt ppt then not_yet env "variant clause")
-      spec;
-    (* TODO: spec.spec_terminates is not part of the E-ACSL subset *)
-    unsupported
-      (fun spec ->
-         let ppt = Property.ip_terminates_of_spec kf kinstr spec in
-         if must_translate_opt ppt then not_yet env "terminates clause")
-      spec;
-    let active = [] in (* TODO: 'for' behaviors, e-acsl#109 *)
-    let ppts = Property.ip_complete_of_spec kf kinstr ~active spec in
-    unsupported
-      (fun ppts ->
-         List.iter
-           (fun ppt ->
-              if must_translate ppt then not_yet env "complete behaviors")
-           ppts)
-      ppts;
-    let ppts = Property.ip_disjoint_of_spec kf kinstr ~active spec in
-    unsupported
-      (fun ppts ->
-         List.iter
-           (fun ppt ->
-              if must_translate ppt then not_yet env "disjoint behaviors")
-           ppts)
-      ppts;
-    env
-  in
-  let env = convert_unsupported_clauses env in
-  handle_error
-    (fun env -> translate_preconditions kf kinstr env spec.spec_behavior)
-    env
-
-let translate_post_spec kf kinstr env spec =
-  handle_error
-    (fun env -> translate_postconditions kf kinstr env spec.spec_behavior)
-    env
-
-let translate_pre_code_annotation kf stmt env annot =
-  let convert env = match annot.annot_content with
-    | AAssert(l, _, p) ->
-      if must_translate (Property.ip_of_code_annot_single kf stmt annot) then
-        let env = Env.set_annotation_kind env Constructor.Assertion in
-        if l <> [] then
-          not_yet env "@[assertion applied only on some behaviors@]";
-        translate_named_predicate kf env p
-      else
-        env
-    | AStmtSpec(l, spec) ->
-      if l <> [] then
-        not_yet env "@[statement contract applied only on some behaviors@]";
-      translate_pre_spec kf (Kstmt stmt) env spec ;
-    | AInvariant(l, loop_invariant, p) ->
-      if must_translate (Property.ip_of_code_annot_single kf stmt annot) then
-        let env = Env.set_annotation_kind env Constructor.Invariant in
-        if l <> [] then
-          not_yet env "@[invariant applied only on some behaviors@]";
-        let env = translate_named_predicate kf env p in
-        if loop_invariant then Env.add_loop_invariant env p else env
-      else
-        env
-    | AVariant _ ->
-      if must_translate (Property.ip_of_code_annot_single kf stmt annot)
-      then not_yet env "variant"
-      else env
-    | AAssigns _ ->
-      (* TODO: it is not a precondition --> should not be handled here,
-         to be fixed when implementing e-acsl#29 *)
-      let ppts = Property.ip_of_code_annot kf stmt annot in
-      List.iter
-        (fun ppt -> if must_translate ppt then not_yet env "assigns")
-        ppts;
-      env
-    | AAllocation _ ->
-      let ppts = Property.ip_of_code_annot kf stmt annot in
-      List.iter
-        (fun ppt -> if must_translate ppt then not_yet env "allocation")
-        ppts;
-      env
-    | APragma _ -> not_yet env "pragma"
-    | AExtended _ -> env (* never translate extensions. *)
-  in
-  handle_error convert env
-
-let translate_post_code_annotation kf stmt env annot =
-  let convert env = match annot.annot_content with
-    | AStmtSpec(_, spec) -> translate_post_spec kf (Kstmt stmt) env spec
-    | AAssert _
-    | AInvariant _
-    | AVariant _
-    | AAssigns _
-    | AAllocation _
-    | APragma _
-    | AExtended _ -> env
-  in
-  handle_error convert env
-
 (*
 Local Variables:
 compile-command: "make -C ../../../../.."
diff --git a/src/plugins/e-acsl/src/code_generator/translate.mli b/src/plugins/e-acsl/src/code_generator/translate.mli
index 64a83c76113bbe3e29142f4d4d6981e74ae81d00..c1e32fa28b950de4333737de8f9b1a4d8d257a8b 100644
--- a/src/plugins/e-acsl/src/code_generator/translate.mli
+++ b/src/plugins/e-acsl/src/code_generator/translate.mli
@@ -22,18 +22,32 @@
 
 open Cil_types
 
-(** [translate_*] translates a given ACSL annotation into the corresponding C
-    statement (if any) for runtime assertion checking. This C statements are
-    part of the resulting environment. *)
-
-val translate_pre_spec: kernel_function -> kinstr -> Env.t -> funspec -> Env.t
-val translate_post_spec: kernel_function -> kinstr -> Env.t -> funspec -> Env.t
-val translate_pre_code_annotation:
-  kernel_function -> stmt -> Env.t -> code_annotation -> Env.t
-val translate_post_code_annotation:
-  kernel_function -> stmt -> Env.t -> code_annotation -> Env.t
-val translate_named_predicate:
-  kernel_function -> Env.t -> predicate -> Env.t
+(** Generate C implementations of expressions. *)
+
+val predicate_to_exp:
+  ?name:string ->
+  kernel_function ->
+  ?rte:bool ->
+  Env.t ->
+  predicate ->
+  exp * Env.t
+(** Convert an ACSL predicate into a corresponding C expression. *)
+
+val generalized_untyped_predicate_to_exp:
+  ?name:string ->
+  kernel_function ->
+  ?rte:bool ->
+  ?must_clear_typing:bool ->
+  Env.t ->
+  predicate ->
+  exp * Env.t
+(** Convert an untyped ACSL predicate into a corresponding C expression. *)
+
+val translate_predicate:
+  ?pred_to_print:predicate -> kernel_function -> Env.t -> predicate -> Env.t
+(** Translate the given predicate to a runtime check in the given environment.
+    If [pred_to_print] is set, then the runtime check will use this predicate as
+    message. *)
 
 val translate_rte_annots:
   (Format.formatter -> 'a -> unit) ->
@@ -42,11 +56,23 @@ val translate_rte_annots:
   Env.t ->
   code_annotation list ->
   Env.t
+(** Translate the given RTE annotations into runtime checks in the given
+    environment. *)
+
+exception No_simple_term_translation of term
+(** Exceptin raised if [untyped_term_to_exp] would generate new statements in
+    the environment *)
+
+exception No_simple_predicate_translation of predicate
+(** Exceptin raised if [untyped_predicate_to_exp] would generate new statements
+    in the environment *)
 
-exception No_simple_translation of term
-val term_to_exp: typ option -> term -> exp
+val untyped_term_to_exp: typ option -> term -> exp
+(** Convert an untyped ACSL term into a corresponding C expression. *)
 
-val predicate_to_exp: kernel_function -> predicate -> exp
+val untyped_predicate_to_exp: predicate -> exp
+(** Convert an untyped ACSL predicate into a corresponding C expression. This
+    expression is valid only in certain contexts and shouldn't be used. *)
 
 (*
 Local Variables:
diff --git a/src/plugins/e-acsl/src/code_generator/translate_annots.ml b/src/plugins/e-acsl/src/code_generator/translate_annots.ml
new file mode 100644
index 0000000000000000000000000000000000000000..a65ac3567b95ad3ee2fc4b871ae4bf8dd681b526
--- /dev/null
+++ b/src/plugins/e-acsl/src/code_generator/translate_annots.ml
@@ -0,0 +1,145 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of the Frama-C's E-ACSL plug-in.                    *)
+(*                                                                        *)
+(*  Copyright (C) 2012-2020                                               *)
+(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
+(*         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 Cil_types
+open Cil_datatype
+
+(* ************************************************************************** *)
+(* Functions that translate a given ACSL annotation into the corresponding C
+   statements (if any) for runtime assertion checking. *)
+(* ************************************************************************** *)
+
+let must_translate ppt =
+  Options.Valid.get ()
+  || match Property_status.get ppt with
+  | Never_tried
+  | Inconsistent _
+  | Best ((False_if_reachable | False_and_reachable | Dont_know), _) ->
+    true
+  | Best (True, _) ->
+    (* [TODO] generating code for "valid under hypotheses" properties could be
+       useful for some use cases (in particular, when E-ACSL does not stop on
+       the very first error).
+       ==> introduce a new option or modify the behavior of -e-acsl-valid,
+       see e-acsl#35 *)
+    false
+
+let must_translate_opt = function
+  | None -> false
+  | Some ppt -> must_translate ppt
+
+let () =
+  Contract.must_translate_ppt_ref := must_translate;
+  Contract.must_translate_ppt_opt_ref := must_translate_opt
+
+let pre_funspec kf kinstr env funspec =
+  let unsupported f x = ignore (Env.handle_error (fun env -> f x; env) env) in
+  let convert_unsupported_clauses env =
+    unsupported
+      (fun spec ->
+         let ppt = Property.ip_decreases_of_spec kf kinstr spec in
+         if must_translate_opt ppt then Env.not_yet env "variant clause")
+      funspec;
+    (* TODO: spec.spec_terminates is not part of the E-ACSL subset *)
+    unsupported
+      (fun spec ->
+         let ppt = Property.ip_terminates_of_spec kf kinstr spec in
+         if must_translate_opt ppt then Env.not_yet env "terminates clause")
+      funspec;
+    env
+  in
+  let env = convert_unsupported_clauses env in
+  let loc = Kernel_function.get_location kf in
+  let contract = Contract.create ~loc funspec in
+  Contract.translate_preconditions kf kinstr env contract
+
+let post_funspec kf kinstr env =
+  Contract.translate_postconditions kf kinstr env
+
+let pre_code_annotation kf stmt env annot =
+  let convert env = match annot.annot_content with
+    | AAssert(l, p) ->
+      if must_translate (Property.ip_of_code_annot_single kf stmt annot) then
+        let env = Env.set_annotation_kind env Smart_stmt.Assertion in
+        if l <> [] then
+          Env.not_yet env "@[assertion applied only on some behaviors@]";
+        Translate.translate_predicate kf env p.tp_statement
+      else
+        env
+    | AStmtSpec(l, spec) ->
+      if l <> [] then
+        Env.not_yet env "@[statement contract applied only on some behaviors@]";
+      let loc = Stmt.loc stmt in
+      let contract = Contract.create ~loc spec in
+      Contract.translate_preconditions kf (Kstmt stmt) env contract
+    | AInvariant(l, loop_invariant, p) ->
+      if must_translate (Property.ip_of_code_annot_single kf stmt annot) then
+        let env = Env.set_annotation_kind env Smart_stmt.Invariant in
+        if l <> [] then
+          Env.not_yet env "@[invariant applied only on some behaviors@]";
+        let env = Translate.translate_predicate kf env p.tp_statement in
+        if loop_invariant then
+          Env.add_loop_invariant env p.tp_statement
+        else env
+      else
+        env
+    | AVariant _ ->
+      if must_translate (Property.ip_of_code_annot_single kf stmt annot)
+      then Env.not_yet env "variant"
+      else env
+    | AAssigns _ ->
+      (* TODO: it is not a precondition --> should not be handled here,
+         to be fixed when implementing e-acsl#29 *)
+      let ppts = Property.ip_of_code_annot kf stmt annot in
+      List.iter
+        (fun ppt -> if must_translate ppt then Env.not_yet env "assigns")
+        ppts;
+      env
+    | AAllocation _ ->
+      let ppts = Property.ip_of_code_annot kf stmt annot in
+      List.iter
+        (fun ppt -> if must_translate ppt then Env.not_yet env "allocation")
+        ppts;
+      env
+    | APragma _ -> Env.not_yet env "pragma"
+    | AExtended _ -> env (* never translate extensions. *)
+  in
+  Env.handle_error convert env
+
+let post_code_annotation kf stmt env annot =
+  let convert env = match annot.annot_content with
+    | AStmtSpec(_, _) -> Contract.translate_postconditions kf (Kstmt stmt) env
+    | AAssert _
+    | AInvariant _
+    | AVariant _
+    | AAssigns _
+    | AAllocation _
+    | APragma _
+    | AExtended _ -> env
+  in
+  Env.handle_error convert env
+
+(*
+Local Variables:
+compile-command: "make -C ../../../../.."
+End:
+*)
diff --git a/src/plugins/e-acsl/src/code_generator/translate_annots.mli b/src/plugins/e-acsl/src/code_generator/translate_annots.mli
new file mode 100644
index 0000000000000000000000000000000000000000..8e4504b2ddf8fa22e50ee5f36a9310879be96d85
--- /dev/null
+++ b/src/plugins/e-acsl/src/code_generator/translate_annots.mli
@@ -0,0 +1,77 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of the Frama-C's E-ACSL plug-in.                    *)
+(*                                                                        *)
+(*  Copyright (C) 2012-2020                                               *)
+(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
+(*         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 Cil_types
+
+(** Functions that translate a given ACSL annotation into the corresponding C
+    statements (if any) for runtime assertion checking. These C statements are
+    part of the resulting environment. *)
+
+val must_translate: Property.t -> bool
+(** Return true if the given property must be translated (ie. if the valid
+    properties must be translated or if its status is not [True]), false
+    otherwise. *)
+
+val must_translate_opt: Property.t option -> bool
+(** Same than [must_translate] but for [Property.t option]. Return false if the
+    option is [None]. *)
+
+val pre_funspec: kernel_function -> kinstr -> Env.t -> funspec -> Env.t
+(** Translate the preconditions of the given function contract in the
+    environment. The contract is attached to the kernel_function.
+
+    The function contract is pushed in the environment, some care should be
+    taken to call {!post_funspec} at the right time to pop the right
+    contract. *)
+
+val post_funspec: kernel_function -> kinstr -> Env.t -> Env.t
+(** Translate the postconditions of the current function contract in the
+    environment.
+
+    The function contract previously built by {!pre_funspec} is popped
+    from the environment. Some care should be taken to call this function at
+    the right time to pop the right contract. *)
+
+val pre_code_annotation:
+  kernel_function -> stmt -> Env.t -> code_annotation -> Env.t
+(** Translate the preconditions of the given code annotation in the
+    environment.
+
+    If available, the statement contract is pushed in the environment, some care
+    should be taken to call {!post_code_annotation} at the right time
+    to pop the right contract. *)
+
+val post_code_annotation:
+  kernel_function -> stmt -> Env.t -> code_annotation -> Env.t
+(** Translate the postconditions of the current code annotation in the
+    environment.
+
+    If necessarry, the statement contract previously built by
+    {!pre_code_annotation} is popped from the environment. Some care
+    should be taken to call this function at the right time to pop the right
+    contract. *)
+
+(*
+Local Variables:
+compile-command: "make -C ../.."
+End:
+*)
diff --git a/src/plugins/e-acsl/src/dependencies/dep_eva.disabled.ml b/src/plugins/e-acsl/src/dependencies/dep_eva.disabled.ml
new file mode 100644
index 0000000000000000000000000000000000000000..574d25ed1ab97726b75bbc3171c80783c81da567
--- /dev/null
+++ b/src/plugins/e-acsl/src/dependencies/dep_eva.disabled.ml
@@ -0,0 +1,23 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of the Frama-C's E-ACSL plug-in.                    *)
+(*                                                                        *)
+(*  Copyright (C) 2012-2020                                               *)
+(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
+(*         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).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+let use_builtin _ _ = ()
diff --git a/src/plugins/e-acsl/src/dependencies/dep_eva.enabled.ml b/src/plugins/e-acsl/src/dependencies/dep_eva.enabled.ml
new file mode 100644
index 0000000000000000000000000000000000000000..a1af5ca1cb0ee3d51fb0b83bd2cdbf9c9bdb0ba2
--- /dev/null
+++ b/src/plugins/e-acsl/src/dependencies/dep_eva.enabled.ml
@@ -0,0 +1,23 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of the Frama-C's E-ACSL plug-in.                    *)
+(*                                                                        *)
+(*  Copyright (C) 2012-2020                                               *)
+(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
+(*         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).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+let use_builtin = Eva.Value_parameters.use_builtin
diff --git a/src/plugins/e-acsl/src/dependencies/dep_eva.mli b/src/plugins/e-acsl/src/dependencies/dep_eva.mli
new file mode 100644
index 0000000000000000000000000000000000000000..a151c251eeb62727b283355f458cbbf03a5efb04
--- /dev/null
+++ b/src/plugins/e-acsl/src/dependencies/dep_eva.mli
@@ -0,0 +1,27 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of the Frama-C's E-ACSL plug-in.                    *)
+(*                                                                        *)
+(*  Copyright (C) 2012-2020                                               *)
+(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
+(*         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 Cil_types
+
+val use_builtin: kernel_function -> string -> unit
+(** Call the function Eva.Value_parameters.use_builtin if Eva is enabled,
+    do nothing otherwise. *)
diff --git a/src/plugins/e-acsl/src/libraries/error.ml b/src/plugins/e-acsl/src/libraries/error.ml
index a572ecdffc6a5fe67deeb48d7c080553f05e6174..5c8fec2f96bad497e2fc39ac54922c8cdae233e0 100644
--- a/src/plugins/e-acsl/src/libraries/error.ml
+++ b/src/plugins/e-acsl/src/libraries/error.ml
@@ -48,21 +48,28 @@ module Nb_not_yet =
 
 let nb_not_yet = Nb_not_yet.get
 
-let generic_handle f res x =
-  try
-    f x
-  with
+let process_error = function
   | Typing_error s ->
     let msg = Format.sprintf "@[invalid E-ACSL construct@ `%s'.@]" s in
     Options.warning ~once:true ~current:true "@[%s@ Ignoring annotation.@]" msg;
-    Nb_typing.set (Nb_typing.get () + 1);
-    res
+    Nb_typing.set (Nb_typing.get () + 1)
   | Not_yet s ->
     let msg =
       Format.sprintf "@[E-ACSL construct@ `%s'@ is not yet supported.@]" s
     in
     Options.warning ~once:true ~current:true "@[%s@ Ignoring annotation.@]" msg;
-    Nb_not_yet.set (Nb_not_yet.get () + 1);
+    Nb_not_yet.set (Nb_not_yet.get () + 1)
+  | exn ->
+    Options.fatal
+      "Unexpected error in `Error.process_error`: %s"
+      (Printexc.to_string exn)
+
+let generic_handle f res x =
+  try
+    f x
+  with
+  | exn ->
+    process_error exn;
     res
 
 let handle f x = generic_handle f x x
diff --git a/src/plugins/e-acsl/src/libraries/error.mli b/src/plugins/e-acsl/src/libraries/error.mli
index 34176dd34e93c7aebf4b0b244560fb0954c2ab98..2cbea96413ad43be6c127fb78694d697b6c86a7c 100644
--- a/src/plugins/e-acsl/src/libraries/error.mli
+++ b/src/plugins/e-acsl/src/libraries/error.mli
@@ -45,6 +45,13 @@ val nb_untypable: unit -> int
 val nb_not_yet: unit -> int
 (** Number of not-yet-supported annotations. *)
 
+val process_error: exn -> unit
+(** Process the given error.
+
+    Print a warning message and update the number of not-yet-supported and
+    untypable annotations. Print a fatal message and abort in case of unknown
+    errors. *)
+
 (*
 Local Variables:
 compile-command: "make"
diff --git a/src/plugins/e-acsl/src/libraries/misc.ml b/src/plugins/e-acsl/src/libraries/misc.ml
index 0b2cd0d3ad79f9a6f08f442da392e7013fd38041..284d57621d5e2f242f8ada787f1acc8c0d8648af 100644
--- a/src/plugins/e-acsl/src/libraries/misc.ml
+++ b/src/plugins/e-acsl/src/libraries/misc.ml
@@ -189,6 +189,15 @@ module Id_term =
       let mem_project = Datatype.never_any_project
     end)
 
+let extract_uncoerced_lval e =
+  let rec aux e =
+    match e.enode with
+    | Lval _ -> Some e
+    | CastE (_, e) -> aux e
+    | _ -> None
+  in
+  aux e
+
 (*
 Local Variables:
 compile-command: "make -C ../../../../.."
diff --git a/src/plugins/e-acsl/src/libraries/misc.mli b/src/plugins/e-acsl/src/libraries/misc.mli
index f9c92c19e8097a872a37edc83fa83301a79dd645..ca3f8fd00e6107a4ba74dba379519f1a6a9806e2 100644
--- a/src/plugins/e-acsl/src/libraries/misc.mli
+++ b/src/plugins/e-acsl/src/libraries/misc.mli
@@ -47,7 +47,7 @@ val cty: logic_type -> typ
 
 val ptr_index: ?loc:location -> ?index:exp -> exp
   -> Cil_types.exp * Cil_types.exp
-(** Split pointer-arithmetic expression of the type `p + i` into its
+(** Split pointer-arithmetic expression of the type [p + i] into its
     pointer and integer parts. *)
 
 val term_of_li: logic_info -> term
@@ -81,6 +81,13 @@ val finite_min_and_max: Ival.t -> Integer.t * Integer.t
 module Id_term: Datatype.S_with_collections with type t = term
 (** Datatype for terms that relies on physical equality. *)
 
+val extract_uncoerced_lval: exp -> exp option
+(** Unroll the [CastE] part of the expression until an [Lval] is found, and
+    return it.
+
+    If at some point the expression is neither a [CastE] nor an [Lval], then
+    return [None]. *)
+
 (*
 Local Variables:
 compile-command: "make -C ../../../../.."
diff --git a/src/plugins/e-acsl/src/main.ml b/src/plugins/e-acsl/src/main.ml
index 703ef6b8c0d8d8d7e6683ebf4a88a48c84c572ce..8de1804974e4fdc9aafd6f7efd79040884f7ccba 100644
--- a/src/plugins/e-acsl/src/main.ml
+++ b/src/plugins/e-acsl/src/main.ml
@@ -106,15 +106,6 @@ let generate_code =
     (Datatype.func Datatype.string Project.ty)
     generate_code
 
-let predicate_to_exp =
-  Dynamic.register
-    ~plugin:"E_ACSL"
-    ~journalize:false
-    "predicate_to_exp"
-    (Datatype.func2
-       Kernel_function.ty Cil_datatype.Predicate.ty Cil_datatype.Exp.ty)
-    Translate.predicate_to_exp
-
 (* The Frama-C standard library contains specific built-in variables prefixed by
    "__fc_" and declared as extern: they prevent the generated code to be
    linked. This modification of the default printer replaces them by their
diff --git a/src/plugins/e-acsl/src/options.ml b/src/plugins/e-acsl/src/options.ml
index 8c98ca1657933ca519eef73fa5697877efa50842..932ff7ea662055bb9bc6a51c4aff786fa7fce132 100644
--- a/src/plugins/e-acsl/src/options.ml
+++ b/src/plugins/e-acsl/src/options.ml
@@ -85,12 +85,13 @@ module Replace_libc_functions =
                   RTL alternatives"
     end)
 
-module Full_mmodel =
+module Full_mtracking =
   False
     (struct
-      let option_name = "-e-acsl-full-mmodel"
+      let option_name = "-e-acsl-full-mtracking"
       let help = "maximal memory-related instrumentation"
     end)
+let () = Full_mtracking.add_aliases ~deprecated:true [ "-e-acsl-full-mmodel" ]
 
 module Builtins =
   String_set
@@ -142,7 +143,7 @@ let () = Cmdline.run_after_configuring_stage version
 let parameter_states =
   [ Valid.self;
     Gmp_only.self;
-    Full_mmodel.self;
+    Full_mtracking.self;
     Builtins.self;
     Temporal_validity.self;
     Validate_format_strings.self;
diff --git a/src/plugins/e-acsl/src/options.mli b/src/plugins/e-acsl/src/options.mli
index d5065c6a51dbbade2b491b5cf91fea75d17e7f23..ca303e1b515642f0e7155dd195ebc6a5f62e929a 100644
--- a/src/plugins/e-acsl/src/options.mli
+++ b/src/plugins/e-acsl/src/options.mli
@@ -25,7 +25,7 @@ include Plugin.S (** implementation of Log.S for E-ACSL *)
 module Run: Parameter_sig.Bool
 module Valid: Parameter_sig.Bool
 module Gmp_only: Parameter_sig.Bool
-module Full_mmodel: Parameter_sig.Bool
+module Full_mtracking: Parameter_sig.Bool
 module Project_name: Parameter_sig.String
 module Builtins: Parameter_sig.String_set
 module Temporal_validity: Parameter_sig.Bool
diff --git a/src/plugins/e-acsl/src/project_initializer/rtl.ml b/src/plugins/e-acsl/src/project_initializer/rtl.ml
index 38f3fb5809f3adc1a37e721dbb726d3a46f31393..ee6ea93f43a2d2d564c12a518635989b55b589e3 100644
--- a/src/plugins/e-acsl/src/project_initializer/rtl.ml
+++ b/src/plugins/e-acsl/src/project_initializer/rtl.ml
@@ -23,11 +23,7 @@
 open Cil_types
 open Cil_datatype
 
-let rtl_files () =
-  List.map
-    (fun d -> Options.Share.get_file ~mode:`Must_exist d)
-    [ "e_acsl_gmp_api.h";
-      "e_acsl.h" ]
+let rtl_file () = Options.Share.get_file ~mode:`Must_exist "e_acsl.h"
 
 (* create the RTL AST in a fresh project *)
 let create_rtl_ast prj =
@@ -40,7 +36,7 @@ let create_rtl_ast prj =
        Kernel.Keep_unused_specified_functions.off ();
        Kernel.CppExtraArgs.add
          (Format.asprintf " -DE_ACSL_MACHDEP=%s" (Kernel.Machdep.get ()));
-       Kernel.Files.set (rtl_files ());
+       Kernel.Files.set [ rtl_file () ];
        Ast.get ())
     ()
 
diff --git a/src/plugins/e-acsl/tests/arith/array.i b/src/plugins/e-acsl/tests/arith/array.i
index 192094bfbdee5042d17c0e6225eb70a1cc87cbf1..4ef7b8e882fb2b7aa57e48eb425b5436fd70349b 100644
--- a/src/plugins/e-acsl/tests/arith/array.i
+++ b/src/plugins/e-acsl/tests/arith/array.i
@@ -1,6 +1,6 @@
 /* run.config_ci
    COMMENT: arrays
-   STDOPT: #"-slevel 5"
+   STDOPT: #"-eva-slevel 5"
 */
 
 int T1[3],T2[4];
@@ -113,4 +113,4 @@ int main(void) {
   vlas(3);
 
   return 0;
-}
\ No newline at end of file
+}
diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_arith.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_arith.c
index 249a2e3366637540cf22f0fbbc67c8468d49a72d..3431019cbc4f8793231f6b90f6ab869c3762ae82 100644
--- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_arith.c
+++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_arith.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_array.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_array.c
index b65d0e8fe7686a76b411ddaa1c26c7d331c15ce1..73ea4bf5ab15bfb8cdebf3895769ca0f0947ec9d 100644
--- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_array.c
+++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_array.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int T1[3];
 int T2[4];
 void arrays(void)
diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_at.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_at.c
index ee37178a854e61491d674d217859bdedbc1fa830..e6bc5c1484f8a7102929c7c731ffb0d2cee4cf7c 100644
--- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_at.c
+++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_at.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 int A = 0;
diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_at_on-purely-logic-variables.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_at_on-purely-logic-variables.c
index 17dee7105453488b730f112a3de0e6c604b8eeae..205c4799a854078e9477b9ef4546492c0726ef6b 100644
--- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_at_on-purely-logic-variables.c
+++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_at_on-purely-logic-variables.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 /*@ ensures
diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_bitwise.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_bitwise.c
index e96f4973e6c3c735ac875d125d378d469f0fd181..7d9adc9263454897905a9a96c35a0d6d3f8e8004 100644
--- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_bitwise.c
+++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_bitwise.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 void f_signed(int a, int b)
 {
   int c = a << 2;
diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_cast.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_cast.c
index c5a5d0cce531b902d925bd9b435b23ff6b64d963..d2d3f52aea0b8a803f2c0951334bc238227309dd 100644
--- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_cast.c
+++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_cast.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_comparison.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_comparison.c
index 08496d44c2396e09142e025ace2d5fe9aec84610..29e8ecabb565015063620d90d4e76d1ce3232cc4 100644
--- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_comparison.c
+++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_comparison.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_functions.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_functions.c
index 812ba798a39afad86acd699e1379e8641718a5bf..5dbab6510d7dff48a8506e74fd5d2d0e7cc013cc 100644
--- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_functions.c
+++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_functions.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 struct mystruct {
diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_functions_rec.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_functions_rec.c
index b9015c95933c865e01c9d365c7a3b2c73c8c4a4f..0bca2910d93fe3bc6c413c798d9a5a1a0dc27eb5 100644
--- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_functions_rec.c
+++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_functions_rec.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 /*@ logic ℤ f1(ℤ n) = n ≤ 0? 0: f1(n - 1) + n;
 
 */
diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_integer_constant.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_integer_constant.c
index 15a95e1655951a6ae8a649d80881877aff06af4b..ea0b303a88fe9578a4d1393ed1948681026723b4 100644
--- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_integer_constant.c
+++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_integer_constant.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_let.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_let.c
index 85b41bb2972fe22862a0cba068ff0c8c60df0bdb..dcaaaa3d9e96f463f5e8d8d198990277b59dc088 100644
--- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_let.c
+++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_let.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 struct __anonstruct_r_1 {
    int x ;
    int y ;
diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_longlong.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_longlong.c
index 0720b6503aa754f974b9df3eb49a3e708e503dd3..16cf4cd3b10ee8809887c59cb5cb0f660d0f38a0 100644
--- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_longlong.c
+++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_longlong.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 unsigned long long my_pow(unsigned int x, unsigned int n)
 {
   unsigned long long __retres;
diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_not.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_not.c
index 4ba24ca0879edf6173547ef7665fe0dfd3b135de..31c03d939acfbede317521fa9a87e793951a0025 100644
--- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_not.c
+++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_not.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_quantif.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_quantif.c
index d5e965010d24862b584dee905bc13b35828388af..e13edd15d57a19cfe1693bf1d92e7f6f5d0ec0a2 100644
--- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_quantif.c
+++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_quantif.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_rationals.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_rationals.c
index ab25e5f5395d1d1648a723cd7583b42285a50201..859f23f30709869281a2f4317c2e74ed93bccee6 100644
--- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_rationals.c
+++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_rationals.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 /*@ ensures \let delta = 1;
diff --git a/src/plugins/e-acsl/tests/bts/issue-eacsl-91.c b/src/plugins/e-acsl/tests/bts/issue-eacsl-91.c
index cc7640adddb94706ecf2548920699787ef11bf14..74b8476fdbf9b0c8e72eb96819d1157615fe6229 100644
--- a/src/plugins/e-acsl/tests/bts/issue-eacsl-91.c
+++ b/src/plugins/e-acsl/tests/bts/issue-eacsl-91.c
@@ -1,7 +1,7 @@
 /* run.config_ci
    COMMENT: frama-c/e-acsl#91, test for misplaced delete_block of local variable
    in switch.
-   STDOPT: #"-e-acsl-full-mmodel"
+   STDOPT: #"-e-acsl-full-mtracking"
 */
 short a;
 char b()
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/bts1307.res.oracle b/src/plugins/e-acsl/tests/bts/oracle_ci/bts1307.res.oracle
index 0491679011cca98bc2b52203673139ae77988bd6..ef84cf94d261391ff55db72a03f35a11bc6d6c40 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/bts1307.res.oracle
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/bts1307.res.oracle
@@ -3,7 +3,3 @@
   (warn-once: no further messages from category 'parser:decimal-float' will be emitted)
 [e-acsl] beginning translation.
 [e-acsl] translation done in project "e-acsl".
-[eva:alarm] tests/bts/bts1307.i:11: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva:alarm] tests/bts/bts1307.i:11: Warning: 
-  function __gen_e_acsl_foo, behavior OverEstimate_Motoring: postcondition got status invalid.
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/bts1324.res.oracle b/src/plugins/e-acsl/tests/bts/oracle_ci/bts1324.res.oracle
index 8a979d24b47fbca95ad85e05fbdfd4446a7fd8eb..efd026311297e55d8fefb674326118e6ece88624 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/bts1324.res.oracle
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/bts1324.res.oracle
@@ -1,4 +1,2 @@
 [e-acsl] beginning translation.
 [e-acsl] translation done in project "e-acsl".
-[eva:alarm] tests/bts/bts1324.i:6: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/bts1390.res.oracle b/src/plugins/e-acsl/tests/bts/oracle_ci/bts1390.res.oracle
index 929213a9cd28be0c159806a3a650b1cf7b651dfe..3731cb4dd09cd7786331ee6473a3a0fdf691a7c2 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/bts1390.res.oracle
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/bts1390.res.oracle
@@ -2,11 +2,3 @@
 [e-acsl] translation done in project "e-acsl".
 [eva:builtins:missing-spec] tests/bts/bts1390.c:13: Warning: 
   The builtin for function memchr will not be used, as its frama-c libc specification is not available.
-[eva:alarm] tests/bts/bts1390.c:11: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva:alarm] tests/bts/bts1390.c:8: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva:alarm] tests/bts/bts1390.c:12: Warning: 
-  function __gen_e_acsl_memchr, behavior not_exists: postcondition got status unknown. (Behavior may be inactive, no reduction performed.)
-[eva:alarm] tests/bts/bts1390.c:17: Warning: 
-  out of bounds read. assert \valid_read(s);
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/bts2192.res.oracle b/src/plugins/e-acsl/tests/bts/oracle_ci/bts2192.res.oracle
index f96be2395e669ee4f969c86a91991270c922660a..5e19b9d7d6eecf52c360612ac19e7e7406a776f2 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/bts2192.res.oracle
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/bts2192.res.oracle
@@ -2,7 +2,7 @@
 [e-acsl] Warning: annotating undefined function `atoi':
   the generated program may miss memory instrumentation
   if there are memory-related annotations.
-[e-acsl] FRAMAC_SHARE/libc/stdlib.h:78: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:77: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
 [e-acsl] translation done in project "e-acsl".
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/bts2252.res.oracle b/src/plugins/e-acsl/tests/bts/oracle_ci/bts2252.res.oracle
index c0d14a505d07b9519cd7815386d12346a4c15e42..994e5e176d8b6f2c1d0a276505cc9b85773538e7 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/bts2252.res.oracle
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/bts2252.res.oracle
@@ -4,19 +4,30 @@
   if there are memory-related annotations.
 [e-acsl] FRAMAC_SHARE/libc/string.h:362: Warning: 
   E-ACSL construct `\separated' is not yet supported. Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/string.h:372: Warning: 
+  E-ACSL construct `logic functions performing read accesses'
+  is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/string.h:375: Warning: 
+  E-ACSL construct `logic functions performing read accesses'
+  is not yet supported.
+  Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/string.h:363: Warning: 
   E-ACSL construct `logic functions with labels' is not yet supported.
   Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/string.h:366: Warning: 
   E-ACSL construct `\separated' is not yet supported. Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/string.h:372: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/string.h:362: Warning: 
+  Some assumes clauses couldn't be translated.
+  Ignoring complete and disjoint behaviors annotations.
+[e-acsl] FRAMAC_SHARE/libc/string.h:362: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/string.h:373: Warning: 
   E-ACSL construct `logic functions performing read accesses'
   is not yet supported.
   Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/string.h:372: Warning: 
-  E-ACSL construct `assigns clause in behavior' is not yet supported.
-  Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/string.h:375: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/string.h:376: Warning: 
   E-ACSL construct `logic functions performing read accesses'
   is not yet supported.
   Ignoring annotation.
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1304.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1304.c
index 69cf275ad871e22adade1febee237d73a55be2b0..adb3c8e3ab1ae9a9e9923207ad1fb14605e331b1 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1304.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1304.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 struct msgA {
    int type ;
    int a[2] ;
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1307.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1307.c
index 7ecbe49081f97141b4826d44f36fe9f8ff8e1acd..803635b65a0f4926d91013284a3f86351cf24aa9 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1307.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1307.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 /*@ requires \valid(Mtmax_in);
@@ -96,6 +96,7 @@ void __gen_e_acsl_bar(float *Mtmin_in, float *Mwmin, float *Mtmin_out)
   float *__gen_e_acsl_at_3;
   float *__gen_e_acsl_at_2;
   float *__gen_e_acsl_at;
+  __e_acsl_contract_t *__gen_e_acsl_contract;
   {
     int __gen_e_acsl_valid;
     int __gen_e_acsl_valid_2;
@@ -103,6 +104,8 @@ void __gen_e_acsl_bar(float *Mtmin_in, float *Mwmin, float *Mtmin_out)
     __e_acsl_store_block((void *)(& Mtmin_out),(size_t)8);
     __e_acsl_store_block((void *)(& Mwmin),(size_t)8);
     __e_acsl_store_block((void *)(& Mtmin_in),(size_t)8);
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)1);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,1);
     __gen_e_acsl_valid = __e_acsl_valid((void *)Mtmin_in,sizeof(float),
                                         (void *)Mtmin_in,
                                         (void *)(& Mtmin_in));
@@ -126,87 +129,93 @@ void __gen_e_acsl_bar(float *Mtmin_in, float *Mwmin, float *Mtmin_out)
   __gen_e_acsl_at = Mtmin_out;
   bar(Mtmin_in,Mwmin,Mtmin_out);
   {
-    int __gen_e_acsl_valid_read;
-    int __gen_e_acsl_valid_read_2;
-    int __gen_e_acsl_and;
-    int __gen_e_acsl_if;
-    __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)__gen_e_acsl_at_2,
-                                                  sizeof(float),
-                                                  (void *)__gen_e_acsl_at_2,
-                                                  (void *)(& __gen_e_acsl_at_2));
-    __e_acsl_assert(__gen_e_acsl_valid_read,"RTE","bar",
-                    "mem_access: \\valid_read(__gen_e_acsl_at_2)",
-                    "tests/bts/bts1307.i",26);
-    __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)__gen_e_acsl_at,
+    int __gen_e_acsl_assumes_value;
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value) {
+      int __gen_e_acsl_valid_read;
+      int __gen_e_acsl_valid_read_2;
+      int __gen_e_acsl_and;
+      int __gen_e_acsl_if;
+      __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)__gen_e_acsl_at_2,
                                                     sizeof(float),
-                                                    (void *)__gen_e_acsl_at,
-                                                    (void *)(& __gen_e_acsl_at));
-    __e_acsl_assert(__gen_e_acsl_valid_read_2,"RTE","bar",
-                    "mem_access: \\valid_read(__gen_e_acsl_at)",
-                    "tests/bts/bts1307.i",26);
-    if (*__gen_e_acsl_at == *__gen_e_acsl_at_2) {
-      __e_acsl_mpq_t __gen_e_acsl_;
-      __e_acsl_mpq_t __gen_e_acsl__2;
-      __e_acsl_mpq_t __gen_e_acsl_mul;
-      __e_acsl_mpq_t __gen_e_acsl__3;
-      int __gen_e_acsl_lt;
-      __gmpq_init(__gen_e_acsl_);
-      __gmpq_set_str(__gen_e_acsl_,"085/100",10);
-      __gmpq_init(__gen_e_acsl__2);
-      __gmpq_set_d(__gen_e_acsl__2,(double)*__gen_e_acsl_at_4);
-      __gmpq_init(__gen_e_acsl_mul);
-      __gmpq_mul(__gen_e_acsl_mul,
-                 (__e_acsl_mpq_struct const *)(__gen_e_acsl_),
-                 (__e_acsl_mpq_struct const *)(__gen_e_acsl__2));
-      __gmpq_init(__gen_e_acsl__3);
-      __gmpq_set_d(__gen_e_acsl__3,(double)*__gen_e_acsl_at_3);
-      __gen_e_acsl_lt = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__3),
-                                   (__e_acsl_mpq_struct const *)(__gen_e_acsl_mul));
-      __gen_e_acsl_and = __gen_e_acsl_lt < 0;
-      __gmpq_clear(__gen_e_acsl_);
-      __gmpq_clear(__gen_e_acsl__2);
-      __gmpq_clear(__gen_e_acsl_mul);
-      __gmpq_clear(__gen_e_acsl__3);
-    }
-    else __gen_e_acsl_and = 0;
-    if (__gen_e_acsl_and) {
-      int __gen_e_acsl_valid_read_3;
-      __gen_e_acsl_valid_read_3 = __e_acsl_valid_read((void *)__gen_e_acsl_at_5,
+                                                    (void *)__gen_e_acsl_at_2,
+                                                    (void *)(& __gen_e_acsl_at_2));
+      __e_acsl_assert(__gen_e_acsl_valid_read,"RTE","bar",
+                      "mem_access: \\valid_read(__gen_e_acsl_at_2)",
+                      "tests/bts/bts1307.i",26);
+      __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)__gen_e_acsl_at,
                                                       sizeof(float),
-                                                      (void *)__gen_e_acsl_at_5,
-                                                      (void *)(& __gen_e_acsl_at_5));
-      __e_acsl_assert(__gen_e_acsl_valid_read_3,"RTE","bar",
-                      "mem_access: \\valid_read(__gen_e_acsl_at_5)",
+                                                      (void *)__gen_e_acsl_at,
+                                                      (void *)(& __gen_e_acsl_at));
+      __e_acsl_assert(__gen_e_acsl_valid_read_2,"RTE","bar",
+                      "mem_access: \\valid_read(__gen_e_acsl_at)",
+                      "tests/bts/bts1307.i",26);
+      if (*__gen_e_acsl_at == *__gen_e_acsl_at_2) {
+        __e_acsl_mpq_t __gen_e_acsl_;
+        __e_acsl_mpq_t __gen_e_acsl__2;
+        __e_acsl_mpq_t __gen_e_acsl_mul;
+        __e_acsl_mpq_t __gen_e_acsl__3;
+        int __gen_e_acsl_lt;
+        __gmpq_init(__gen_e_acsl_);
+        __gmpq_set_str(__gen_e_acsl_,"085/100",10);
+        __gmpq_init(__gen_e_acsl__2);
+        __gmpq_set_d(__gen_e_acsl__2,(double)*__gen_e_acsl_at_4);
+        __gmpq_init(__gen_e_acsl_mul);
+        __gmpq_mul(__gen_e_acsl_mul,
+                   (__e_acsl_mpq_struct const *)(__gen_e_acsl_),
+                   (__e_acsl_mpq_struct const *)(__gen_e_acsl__2));
+        __gmpq_init(__gen_e_acsl__3);
+        __gmpq_set_d(__gen_e_acsl__3,(double)*__gen_e_acsl_at_3);
+        __gen_e_acsl_lt = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__3),
+                                     (__e_acsl_mpq_struct const *)(__gen_e_acsl_mul));
+        __gen_e_acsl_and = __gen_e_acsl_lt < 0;
+        __gmpq_clear(__gen_e_acsl_);
+        __gmpq_clear(__gen_e_acsl__2);
+        __gmpq_clear(__gen_e_acsl_mul);
+        __gmpq_clear(__gen_e_acsl__3);
+      }
+      else __gen_e_acsl_and = 0;
+      if (__gen_e_acsl_and) {
+        int __gen_e_acsl_valid_read_3;
+        __gen_e_acsl_valid_read_3 = __e_acsl_valid_read((void *)__gen_e_acsl_at_5,
+                                                        sizeof(float),
+                                                        (void *)__gen_e_acsl_at_5,
+                                                        (void *)(& __gen_e_acsl_at_5));
+        __e_acsl_assert(__gen_e_acsl_valid_read_3,"RTE","bar",
+                        "mem_access: \\valid_read(__gen_e_acsl_at_5)",
+                        "tests/bts/bts1307.i",26);
+        __gen_e_acsl_if = (double)*__gen_e_acsl_at_5 != 0.;
+      }
+      else {
+        __e_acsl_mpq_t __gen_e_acsl__4;
+        __e_acsl_mpq_t __gen_e_acsl__5;
+        __e_acsl_mpq_t __gen_e_acsl_mul_2;
+        __e_acsl_mpq_t __gen_e_acsl__6;
+        int __gen_e_acsl_ne;
+        __gmpq_init(__gen_e_acsl__4);
+        __gmpq_set_str(__gen_e_acsl__4,"085/100",10);
+        __gmpq_init(__gen_e_acsl__5);
+        __gmpq_set_d(__gen_e_acsl__5,(double)*__gen_e_acsl_at_6);
+        __gmpq_init(__gen_e_acsl_mul_2);
+        __gmpq_mul(__gen_e_acsl_mul_2,
+                   (__e_acsl_mpq_struct const *)(__gen_e_acsl__4),
+                   (__e_acsl_mpq_struct const *)(__gen_e_acsl__5));
+        __gmpq_init(__gen_e_acsl__6);
+        __gmpq_set_d(__gen_e_acsl__6,0.);
+        __gen_e_acsl_ne = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_mul_2),
+                                     (__e_acsl_mpq_struct const *)(__gen_e_acsl__6));
+        __gen_e_acsl_if = __gen_e_acsl_ne != 0;
+        __gmpq_clear(__gen_e_acsl__4);
+        __gmpq_clear(__gen_e_acsl__5);
+        __gmpq_clear(__gen_e_acsl_mul_2);
+        __gmpq_clear(__gen_e_acsl__6);
+      }
+      __e_acsl_assert(__gen_e_acsl_if,"Postcondition","bar",
+                      "UnderEstimate_Motoring:\n  *\\old(Mtmin_out) == *\\old(Mtmin_in) < 0.85 * *\\old(Mwmin)?\n    *\\old(Mtmin_in) != 0.:\n    0.85 * *\\old(Mwmin) != 0.",
                       "tests/bts/bts1307.i",26);
-      __gen_e_acsl_if = (double)*__gen_e_acsl_at_5 != 0.;
-    }
-    else {
-      __e_acsl_mpq_t __gen_e_acsl__4;
-      __e_acsl_mpq_t __gen_e_acsl__5;
-      __e_acsl_mpq_t __gen_e_acsl_mul_2;
-      __e_acsl_mpq_t __gen_e_acsl__6;
-      int __gen_e_acsl_ne;
-      __gmpq_init(__gen_e_acsl__4);
-      __gmpq_set_str(__gen_e_acsl__4,"085/100",10);
-      __gmpq_init(__gen_e_acsl__5);
-      __gmpq_set_d(__gen_e_acsl__5,(double)*__gen_e_acsl_at_6);
-      __gmpq_init(__gen_e_acsl_mul_2);
-      __gmpq_mul(__gen_e_acsl_mul_2,
-                 (__e_acsl_mpq_struct const *)(__gen_e_acsl__4),
-                 (__e_acsl_mpq_struct const *)(__gen_e_acsl__5));
-      __gmpq_init(__gen_e_acsl__6);
-      __gmpq_set_d(__gen_e_acsl__6,0.);
-      __gen_e_acsl_ne = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_mul_2),
-                                   (__e_acsl_mpq_struct const *)(__gen_e_acsl__6));
-      __gen_e_acsl_if = __gen_e_acsl_ne != 0;
-      __gmpq_clear(__gen_e_acsl__4);
-      __gmpq_clear(__gen_e_acsl__5);
-      __gmpq_clear(__gen_e_acsl_mul_2);
-      __gmpq_clear(__gen_e_acsl__6);
     }
-    __e_acsl_assert(__gen_e_acsl_if,"Postcondition","bar",
-                    "*\\old(Mtmin_out) == *\\old(Mtmin_in) < 0.85 * *\\old(Mwmin)?\n  *\\old(Mtmin_in) != 0.:\n  0.85 * *\\old(Mwmin) != 0.",
-                    "tests/bts/bts1307.i",26);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
     __e_acsl_delete_block((void *)(& Mtmin_out));
     __e_acsl_delete_block((void *)(& Mwmin));
     __e_acsl_delete_block((void *)(& Mtmin_in));
@@ -229,6 +238,7 @@ void __gen_e_acsl_foo(float *Mtmax_in, float *Mwmax, float *Mtmax_out)
   float *__gen_e_acsl_at_3;
   float *__gen_e_acsl_at_2;
   float *__gen_e_acsl_at;
+  __e_acsl_contract_t *__gen_e_acsl_contract;
   {
     int __gen_e_acsl_valid;
     int __gen_e_acsl_valid_2;
@@ -236,6 +246,8 @@ void __gen_e_acsl_foo(float *Mtmax_in, float *Mwmax, float *Mtmax_out)
     __e_acsl_store_block((void *)(& Mtmax_out),(size_t)8);
     __e_acsl_store_block((void *)(& Mwmax),(size_t)8);
     __e_acsl_store_block((void *)(& Mtmax_in),(size_t)8);
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)1);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,1);
     __gen_e_acsl_valid = __e_acsl_valid((void *)Mtmax_in,sizeof(float),
                                         (void *)Mtmax_in,
                                         (void *)(& Mtmax_in));
@@ -256,72 +268,79 @@ void __gen_e_acsl_foo(float *Mtmax_in, float *Mwmax, float *Mtmax_out)
   __gen_e_acsl_at = Mtmax_out;
   foo(Mtmax_in,Mwmax,Mtmax_out);
   {
-    __e_acsl_mpq_t __gen_e_acsl_;
-    __e_acsl_mpq_t __gen_e_acsl__2;
-    __e_acsl_mpq_t __gen_e_acsl__3;
-    __e_acsl_mpq_t __gen_e_acsl_div;
-    __e_acsl_mpq_t __gen_e_acsl__4;
-    __e_acsl_mpq_t __gen_e_acsl_mul;
-    __e_acsl_mpq_t __gen_e_acsl__5;
-    __e_acsl_mpq_t __gen_e_acsl_mul_2;
-    __e_acsl_mpq_t __gen_e_acsl_sub;
-    __e_acsl_mpq_t __gen_e_acsl__6;
-    __e_acsl_mpq_t __gen_e_acsl_add;
-    __e_acsl_mpq_t __gen_e_acsl__7;
-    int __gen_e_acsl_ne;
-    __gmpq_init(__gen_e_acsl_);
-    __gmpq_set_str(__gen_e_acsl_,"5",10);
-    __gmpq_init(__gen_e_acsl__2);
-    __gmpq_set_si(__gen_e_acsl__2,5L,1UL);
-    __gmpq_init(__gen_e_acsl__3);
-    __gmpq_set_si(__gen_e_acsl__3,80L,1UL);
-    __gmpq_init(__gen_e_acsl_div);
-    __gmpq_div(__gen_e_acsl_div,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__2),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__3));
-    __gmpq_init(__gen_e_acsl__4);
-    __gmpq_set_d(__gen_e_acsl__4,(double)*__gen_e_acsl_at_3);
-    __gmpq_init(__gen_e_acsl_mul);
-    __gmpq_mul(__gen_e_acsl_mul,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl_div),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__4));
-    __gmpq_init(__gen_e_acsl__5);
-    __gmpq_set_str(__gen_e_acsl__5,"04/10",10);
-    __gmpq_init(__gen_e_acsl_mul_2);
-    __gmpq_mul(__gen_e_acsl_mul_2,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl_mul),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__5));
-    __gmpq_init(__gen_e_acsl_sub);
-    __gmpq_sub(__gen_e_acsl_sub,(__e_acsl_mpq_struct const *)(__gen_e_acsl_),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl_mul_2));
-    __gmpq_init(__gen_e_acsl__6);
-    __gmpq_set_d(__gen_e_acsl__6,(double)*__gen_e_acsl_at_2);
-    __gmpq_init(__gen_e_acsl_add);
-    __gmpq_add(__gen_e_acsl_add,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__6),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl_sub));
-    __gmpq_init(__gen_e_acsl__7);
-    __gmpq_set_d(__gen_e_acsl__7,(double)*__gen_e_acsl_at);
-    __gen_e_acsl_ne = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__7),
-                                 (__e_acsl_mpq_struct const *)(__gen_e_acsl_add));
-    __e_acsl_assert(__gen_e_acsl_ne != 0,"Postcondition","foo",
-                    "*\\old(Mtmax_out) != *\\old(Mtmax_in) + (5 - ((5 / 80) * *\\old(Mwmax)) * 0.4)",
-                    "tests/bts/bts1307.i",11);
+    int __gen_e_acsl_assumes_value;
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value) {
+      __e_acsl_mpq_t __gen_e_acsl_;
+      __e_acsl_mpq_t __gen_e_acsl__2;
+      __e_acsl_mpq_t __gen_e_acsl__3;
+      __e_acsl_mpq_t __gen_e_acsl_div;
+      __e_acsl_mpq_t __gen_e_acsl__4;
+      __e_acsl_mpq_t __gen_e_acsl_mul;
+      __e_acsl_mpq_t __gen_e_acsl__5;
+      __e_acsl_mpq_t __gen_e_acsl_mul_2;
+      __e_acsl_mpq_t __gen_e_acsl_sub;
+      __e_acsl_mpq_t __gen_e_acsl__6;
+      __e_acsl_mpq_t __gen_e_acsl_add;
+      __e_acsl_mpq_t __gen_e_acsl__7;
+      int __gen_e_acsl_ne;
+      __gmpq_init(__gen_e_acsl_);
+      __gmpq_set_str(__gen_e_acsl_,"5",10);
+      __gmpq_init(__gen_e_acsl__2);
+      __gmpq_set_si(__gen_e_acsl__2,5L,1UL);
+      __gmpq_init(__gen_e_acsl__3);
+      __gmpq_set_si(__gen_e_acsl__3,80L,1UL);
+      __gmpq_init(__gen_e_acsl_div);
+      __gmpq_div(__gen_e_acsl_div,
+                 (__e_acsl_mpq_struct const *)(__gen_e_acsl__2),
+                 (__e_acsl_mpq_struct const *)(__gen_e_acsl__3));
+      __gmpq_init(__gen_e_acsl__4);
+      __gmpq_set_d(__gen_e_acsl__4,(double)*__gen_e_acsl_at_3);
+      __gmpq_init(__gen_e_acsl_mul);
+      __gmpq_mul(__gen_e_acsl_mul,
+                 (__e_acsl_mpq_struct const *)(__gen_e_acsl_div),
+                 (__e_acsl_mpq_struct const *)(__gen_e_acsl__4));
+      __gmpq_init(__gen_e_acsl__5);
+      __gmpq_set_str(__gen_e_acsl__5,"04/10",10);
+      __gmpq_init(__gen_e_acsl_mul_2);
+      __gmpq_mul(__gen_e_acsl_mul_2,
+                 (__e_acsl_mpq_struct const *)(__gen_e_acsl_mul),
+                 (__e_acsl_mpq_struct const *)(__gen_e_acsl__5));
+      __gmpq_init(__gen_e_acsl_sub);
+      __gmpq_sub(__gen_e_acsl_sub,
+                 (__e_acsl_mpq_struct const *)(__gen_e_acsl_),
+                 (__e_acsl_mpq_struct const *)(__gen_e_acsl_mul_2));
+      __gmpq_init(__gen_e_acsl__6);
+      __gmpq_set_d(__gen_e_acsl__6,(double)*__gen_e_acsl_at_2);
+      __gmpq_init(__gen_e_acsl_add);
+      __gmpq_add(__gen_e_acsl_add,
+                 (__e_acsl_mpq_struct const *)(__gen_e_acsl__6),
+                 (__e_acsl_mpq_struct const *)(__gen_e_acsl_sub));
+      __gmpq_init(__gen_e_acsl__7);
+      __gmpq_set_d(__gen_e_acsl__7,(double)*__gen_e_acsl_at);
+      __gen_e_acsl_ne = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__7),
+                                   (__e_acsl_mpq_struct const *)(__gen_e_acsl_add));
+      __e_acsl_assert(__gen_e_acsl_ne != 0,"Postcondition","foo",
+                      "OverEstimate_Motoring:\n  *\\old(Mtmax_out) != *\\old(Mtmax_in) + (5 - ((5 / 80) * *\\old(Mwmax)) * 0.4)",
+                      "tests/bts/bts1307.i",11);
+      __gmpq_clear(__gen_e_acsl_);
+      __gmpq_clear(__gen_e_acsl__2);
+      __gmpq_clear(__gen_e_acsl__3);
+      __gmpq_clear(__gen_e_acsl_div);
+      __gmpq_clear(__gen_e_acsl__4);
+      __gmpq_clear(__gen_e_acsl_mul);
+      __gmpq_clear(__gen_e_acsl__5);
+      __gmpq_clear(__gen_e_acsl_mul_2);
+      __gmpq_clear(__gen_e_acsl_sub);
+      __gmpq_clear(__gen_e_acsl__6);
+      __gmpq_clear(__gen_e_acsl_add);
+      __gmpq_clear(__gen_e_acsl__7);
+    }
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
     __e_acsl_delete_block((void *)(& Mtmax_out));
     __e_acsl_delete_block((void *)(& Mwmax));
     __e_acsl_delete_block((void *)(& Mtmax_in));
-    __gmpq_clear(__gen_e_acsl_);
-    __gmpq_clear(__gen_e_acsl__2);
-    __gmpq_clear(__gen_e_acsl__3);
-    __gmpq_clear(__gen_e_acsl_div);
-    __gmpq_clear(__gen_e_acsl__4);
-    __gmpq_clear(__gen_e_acsl_mul);
-    __gmpq_clear(__gen_e_acsl__5);
-    __gmpq_clear(__gen_e_acsl_mul_2);
-    __gmpq_clear(__gen_e_acsl_sub);
-    __gmpq_clear(__gen_e_acsl__6);
-    __gmpq_clear(__gen_e_acsl_add);
-    __gmpq_clear(__gen_e_acsl__7);
     return;
   }
 }
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1324.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1324.c
index c0a299e37edcf2fcbadc801ccd3b5d5fa45a8482..5e4a49720f5feeb37d719e78341692224a12d81f 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1324.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1324.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 /*@ behavior yes:
@@ -52,12 +52,13 @@ int main(void)
  */
 int __gen_e_acsl_sorted(int *t, int n)
 {
-  int __gen_e_acsl_at;
+  __e_acsl_contract_t *__gen_e_acsl_contract;
   int __retres;
-  __e_acsl_store_block((void *)(& t),(size_t)8);
   {
     int __gen_e_acsl_forall;
     int __gen_e_acsl_i;
+    __e_acsl_store_block((void *)(& t),(size_t)8);
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)1);
     __gen_e_acsl_forall = 1;
     __gen_e_acsl_i = 0 + 1;
     while (1) {
@@ -88,16 +89,19 @@ int __gen_e_acsl_sorted(int *t, int n)
       __gen_e_acsl_i ++;
     }
     e_acsl_end_loop1: ;
-    __gen_e_acsl_at = __gen_e_acsl_forall;
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                           __gen_e_acsl_forall);
   }
   __retres = sorted(t,n);
   {
-    int __gen_e_acsl_implies;
-    if (! __gen_e_acsl_at) __gen_e_acsl_implies = 1;
-    else __gen_e_acsl_implies = __retres == 1;
-    __e_acsl_assert(__gen_e_acsl_implies,"Postcondition","sorted",
-                    "\\old(\\forall int i; 0 < i < n ==> *(t + (i - 1)) <= *(t + i)) ==>\n\\result == 1",
-                    "tests/bts/bts1324.i",7);
+    int __gen_e_acsl_assumes_value;
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(__retres == 1,
+                                                    "Postcondition","sorted",
+                                                    "yes: \\result == 1",
+                                                    "tests/bts/bts1324.i",7);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
     __e_acsl_delete_block((void *)(& t));
     return __retres;
   }
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1326.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1326.c
index 315f754cee7e3ea352066552a50e7559e8dcf1ff..ed0e31eeef3722d85e285e8dea7b1d52f8c2b71a 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1326.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1326.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 typedef int ArrayInt[5];
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1386_complex_flowgraph.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1386_complex_flowgraph.c
index b3d1e5df6a10a1ce8fb80e3003fc4f942cdff13b..be6316c86be622b7091172ee88711dbc77e3c620 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1386_complex_flowgraph.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1386_complex_flowgraph.c
@@ -1,7 +1,6 @@
 /* Generated by Frama-C */
 #include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 void duffcopy(char *to, char *from, int count)
 {
   __e_acsl_store_block((void *)(& from),(size_t)8);
@@ -273,7 +272,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(target));
   __e_acsl_delete_block((void *)(source));
@@ -287,7 +286,7 @@ int main(void)
   initialize(source,100);
   duffcopy(source,target,43);
   __retres = 0;
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1390.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1390.c
index 0dd57437ec161e0e7621b04820c1ce9dbab3a169..c771114ecdc191d1419d51435dab70942430b47f 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1390.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1390.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 char *__gen_e_acsl_literal_string;
@@ -29,7 +30,6 @@ void *memchr(void const *buf, int c, size_t n)
   __e_acsl_full_init((void *)(& s));
   i = 0;
   while ((size_t)i < n) {
-    /*@ assert Eva: mem_access: \valid_read(s); */
     if ((int)*s == c) {
       __e_acsl_full_init((void *)(& __retres));
       __retres = (void *)s;
@@ -63,46 +63,18 @@ void *memchr(void const *buf, int c, size_t n)
  */
 void *__gen_e_acsl_memchr(void const *buf, int c, size_t n)
 {
-  int __gen_e_acsl_at_4;
-  int __gen_e_acsl_at_3;
-  void const *__gen_e_acsl_at_2;
-  int __gen_e_acsl_at;
+  int __gen_e_acsl_at_2;
+  void const *__gen_e_acsl_at;
+  __e_acsl_contract_t *__gen_e_acsl_contract;
   void *__retres;
   __e_acsl_store_block((void *)(& __retres),(size_t)8);
-  __e_acsl_store_block((void *)(& buf),(size_t)8);
-  {
-    int __gen_e_acsl_forall_2;
-    unsigned int __gen_e_acsl_k;
-    __gen_e_acsl_forall_2 = 1;
-    __gen_e_acsl_k = 0U;
-    while (1) {
-      if (__gen_e_acsl_k < (unsigned int)((int)((unsigned int)n))) ;
-      else break;
-      {
-        int __gen_e_acsl_valid_read_3;
-        __gen_e_acsl_valid_read_3 = __e_acsl_valid_read((void *)((char *)buf + __gen_e_acsl_k),
-                                                        sizeof(char),
-                                                        (void *)buf,
-                                                        (void *)(& buf));
-        __e_acsl_assert(__gen_e_acsl_valid_read_3,"RTE","memchr",
-                        "mem_access: \\valid_read((char *)buf + __gen_e_acsl_k)",
-                        "tests/bts/bts1390.c",11);
-        if ((int)*((char *)buf + __gen_e_acsl_k) != c) ;
-        else {
-          __gen_e_acsl_forall_2 = 0;
-          goto e_acsl_end_loop3;
-        }
-      }
-      __gen_e_acsl_k ++;
-    }
-    e_acsl_end_loop3: ;
-    __gen_e_acsl_at_4 = __gen_e_acsl_forall_2;
-  }
-  __gen_e_acsl_at_3 = c;
-  __gen_e_acsl_at_2 = buf;
   {
     int __gen_e_acsl_exists;
     unsigned int __gen_e_acsl_i;
+    int __gen_e_acsl_forall;
+    unsigned int __gen_e_acsl_k;
+    __e_acsl_store_block((void *)(& buf),(size_t)8);
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
     __gen_e_acsl_exists = 0;
     __gen_e_acsl_i = 0U;
     while (1) {
@@ -126,17 +98,45 @@ void *__gen_e_acsl_memchr(void const *buf, int c, size_t n)
       __gen_e_acsl_i ++;
     }
     e_acsl_end_loop1: ;
-    __gen_e_acsl_at = __gen_e_acsl_exists;
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                           __gen_e_acsl_exists);
+    __gen_e_acsl_forall = 1;
+    __gen_e_acsl_k = 0U;
+    while (1) {
+      if (__gen_e_acsl_k < (unsigned int)((int)((unsigned int)n))) ;
+      else break;
+      {
+        int __gen_e_acsl_valid_read_2;
+        __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)((char *)buf + __gen_e_acsl_k),
+                                                        sizeof(char),
+                                                        (void *)buf,
+                                                        (void *)(& buf));
+        __e_acsl_assert(__gen_e_acsl_valid_read_2,"RTE","memchr",
+                        "mem_access: \\valid_read((char *)buf + __gen_e_acsl_k)",
+                        "tests/bts/bts1390.c",11);
+        if ((int)*((char *)buf + __gen_e_acsl_k) != c) ;
+        else {
+          __gen_e_acsl_forall = 0;
+          goto e_acsl_end_loop2;
+        }
+      }
+      __gen_e_acsl_k ++;
+    }
+    e_acsl_end_loop2: ;
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,
+                                           __gen_e_acsl_forall);
   }
+  __gen_e_acsl_at_2 = c;
+  __gen_e_acsl_at = buf;
   __retres = memchr(buf,c,n);
   {
-    int __gen_e_acsl_implies;
-    int __gen_e_acsl_implies_2;
-    if (! __gen_e_acsl_at) __gen_e_acsl_implies = 1;
-    else {
-      int __gen_e_acsl_forall;
+    int __gen_e_acsl_assumes_value;
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value) {
+      int __gen_e_acsl_forall_2;
       unsigned int __gen_e_acsl_j;
-      __gen_e_acsl_forall = 1;
+      __gen_e_acsl_forall_2 = 1;
       __gen_e_acsl_j = 0;
       while (1) {
         {
@@ -147,34 +147,35 @@ void *__gen_e_acsl_memchr(void const *buf, int c, size_t n)
           else break;
         }
         {
-          int __gen_e_acsl_valid_read_2;
-          __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)((char *)__gen_e_acsl_at_2 + __gen_e_acsl_j),
+          int __gen_e_acsl_valid_read_3;
+          __gen_e_acsl_valid_read_3 = __e_acsl_valid_read((void *)((char *)__gen_e_acsl_at + __gen_e_acsl_j),
                                                           sizeof(char),
-                                                          (void *)__gen_e_acsl_at_2,
-                                                          (void *)(& __gen_e_acsl_at_2));
-          __e_acsl_assert(__gen_e_acsl_valid_read_2,"RTE","memchr",
-                          "mem_access: \\valid_read((char *)__gen_e_acsl_at_2 + __gen_e_acsl_j)",
+                                                          (void *)__gen_e_acsl_at,
+                                                          (void *)(& __gen_e_acsl_at));
+          __e_acsl_assert(__gen_e_acsl_valid_read_3,"RTE","memchr",
+                          "mem_access: \\valid_read((char *)__gen_e_acsl_at + __gen_e_acsl_j)",
                           "tests/bts/bts1390.c",9);
-          if ((int)*((char *)__gen_e_acsl_at_2 + __gen_e_acsl_j) != __gen_e_acsl_at_3) 
+          if ((int)*((char *)__gen_e_acsl_at + __gen_e_acsl_j) != __gen_e_acsl_at_2) 
             ;
           else {
-            __gen_e_acsl_forall = 0;
-            goto e_acsl_end_loop2;
+            __gen_e_acsl_forall_2 = 0;
+            goto e_acsl_end_loop3;
           }
         }
         __gen_e_acsl_j ++;
       }
-      e_acsl_end_loop2: ;
-      __gen_e_acsl_implies = __gen_e_acsl_forall;
+      e_acsl_end_loop3: ;
+      __e_acsl_assert(__gen_e_acsl_forall_2,"Postcondition","memchr",
+                      "exists:\n  \\forall int j;\n    0 <= j < (int)\\offset((char *)\\result) ==>\n    (int)*((char *)\\old(buf) + j) != \\old(c)",
+                      "tests/bts/bts1390.c",9);
     }
-    __e_acsl_assert(__gen_e_acsl_implies,"Postcondition","memchr",
-                    "\\old(\\exists integer i; 0 <= i < (int)n && (int)*((char *)buf + i) == c) ==>\n(\\forall int j;\n   0 <= j < (int)\\offset((char *)\\result) ==>\n   (int)*((char *)\\old(buf) + j) != \\old(c))",
-                    "tests/bts/bts1390.c",9);
-    if (! __gen_e_acsl_at_4) __gen_e_acsl_implies_2 = 1;
-    else __gen_e_acsl_implies_2 = __retres == (void *)0;
-    __e_acsl_assert(__gen_e_acsl_implies_2,"Postcondition","memchr",
-                    "\\old(\\forall integer k; 0 <= k < (int)n ==> (int)*((char *)buf + k) != c) ==>\n\\result == (void *)0",
-                    "tests/bts/bts1390.c",12);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(__retres == (void *)0,
+                                                    "Postcondition","memchr",
+                                                    "not_exists: \\result == (void *)0",
+                                                    "tests/bts/bts1390.c",12);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
     __e_acsl_delete_block((void *)(& buf));
     __e_acsl_delete_block((void *)(& __retres));
     return __retres;
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1395.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1395.c
index 66f0d9080e4c01efc18f40664b68ffd58b5a5119..27c7fe2e2f55c67c6099adb6a3335993e2178674 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1395.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1395.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 /*@ requires n > 0; */
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1398.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1398.c
index 8f4aa78a77722c4c1bc7163cc8680bf7cc800d3a..38075f91be9c362dc3751df207f631511135b0ae 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1398.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1398.c
@@ -1,7 +1,6 @@
 /* Generated by Frama-C */
 #include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 char *__gen_e_acsl_literal_string;
 void __e_acsl_globals_init(void)
 {
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1399.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1399.c
index 2168cfcf29b80a91829c36d6eaf3f2811853f641..ec3cb262ed2fe6298f17ac2bb415ef2aa95dc129 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1399.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1399.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 struct spongeStateStruct {
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1478.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1478.c
index 6dddd2a40459ae418afc2b9a752964fe125984dc..8597f7d23ee7d071eda0d71e93d5f6a31b63d6ae 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1478.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1478.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 int global_i;
@@ -53,7 +53,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& global_i_ptr));
   __e_acsl_delete_block((void *)(& global_i));
@@ -66,7 +66,7 @@ int main(void)
   __e_acsl_globals_init();
   __gen_e_acsl_loop();
   __retres = 0;
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1700.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1700.c
index 7343c2d33895d60c6567598d3324905e16bd2c7a..d9d891542f630ba8bd2ec97ca42c921ec09d6183 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1700.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1700.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 struct toto {
    
 };
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1717.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1717.c
index decb020884bd9905b3b7585220261037c6239991..979cba719c40a53c167df4b7425345a65ff1dfad 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1717.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1717.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1718.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1718.c
index a076c7789a3df7ff28f98fcd7749a198275c2bbf..e0dbf835f6d8beb792e774bbff50f2ee37565157 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1718.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1718.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1740.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1740.c
index ee8220d206ce297f6049fabbac14c0083640be76..9c79509d1f7d27490d5dbd13b9f5b138b3ec1ff3 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1740.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1740.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1837.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1837.c
index 0c35a1254beda7c48905f510b8cd0b0ae4af49f9..fc9046840ed4ca86df28bb7a865d2e7edc1ae2b7 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1837.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts1837.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 char *__gen_e_acsl_literal_string_3;
 char *__gen_e_acsl_literal_string;
 char *__gen_e_acsl_literal_string_2;
@@ -88,7 +88,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& S));
 }
@@ -149,7 +149,7 @@ int main(void)
   }
   f();
   __retres = 0;
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2191.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2191.c
index 41b668706f86030c287a11992ef37b9fd3328d1c..0786c95e01ee021b0812c0200cf26953106efdbb 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2191.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2191.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 char *__gen_e_acsl_literal_string;
 char *__gen_e_acsl_literal_string_2;
 struct ST {
@@ -31,7 +31,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(_G));
 }
@@ -60,7 +60,7 @@ int main(int argc, char **argv)
   }
   /*@ assert \valid_read(_G[0].str); */ ;
   __retres = 0;
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2192.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2192.c
index a33b19b9e42be188eaabb80ce398cd9370323f9b..5ade9142b8f3038322176beddc25f6e675b371f6 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2192.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2192.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 char *__gen_e_acsl_literal_string;
@@ -49,7 +50,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& n));
 }
@@ -62,7 +63,7 @@ int main(int argc, char **argv)
   argc = __gen_e_acsl_atoi((char const *)n);
   a = argc;
   __retres = 0;
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2231.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2231.c
index e3887d10a705e41beb1f739df200ac7a574232ae..84abbc44f8308b525e2959d9eae37e99773823e3 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2231.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2231.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 long A = (long)0;
 int main(void)
 {
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2252.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2252.c
index 989bcb1766bd17886c7cc66d06c696124849a70f..58c0df1de84e4233601befe38ea728af74dfe708 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2252.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2252.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 #include "string.h"
@@ -52,6 +53,7 @@ char *__gen_e_acsl_strncpy(char * __restrict dest,
   __e_acsl_mpz_t __gen_e_acsl_at_3;
   char *__gen_e_acsl_at_2;
   char *__gen_e_acsl_at;
+  __e_acsl_contract_t *__gen_e_acsl_contract;
   char *__retres;
   {
     __e_acsl_mpz_t __gen_e_acsl_n;
@@ -63,6 +65,7 @@ char *__gen_e_acsl_strncpy(char * __restrict dest,
     unsigned long __gen_e_acsl__3;
     int __gen_e_acsl_valid;
     __e_acsl_store_block((void *)(& dest),(size_t)8);
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
     __gmpz_init_set_ui(__gen_e_acsl_n,n);
     __gmpz_init_set_si(__gen_e_acsl_,1L);
     __gmpz_init(__gen_e_acsl_sub);
@@ -134,6 +137,7 @@ char *__gen_e_acsl_strncpy(char * __restrict dest,
     __e_acsl_assert(__gen_e_acsl_initialized,"Postcondition","strncpy",
                     "\\initialized(\\old(dest) + (0 .. \\old(n) - 1))",
                     "FRAMAC_SHARE/libc/string.h",370);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
     __e_acsl_delete_block((void *)(& dest));
     __gmpz_clear(__gen_e_acsl__4);
     __gmpz_clear(__gen_e_acsl_sub_3);
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2305.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2305.c
index 55454d5d36b67f3bfc10e27db0a1244dc5b64ba7..2ce056ec2aefa8069a191eef62e02a29706b39cf 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2305.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2305.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 struct bitfields {
    int i : 2 ;
    _Bool j : 1 ;
@@ -24,7 +24,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& t));
 }
@@ -40,7 +40,7 @@ int main(int argc, char **argv)
   t.j = (_Bool)1;
   /*@ assert \initialized(&t.j); */ ;
   tmp = test(& t);
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return tmp;
 }
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2386.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2386.c
index bcaacac3a1ea3e50b3528a9f355f040e4a9b7a69..3ae4f0709cfc864381f38ed4794f9feba91ce7d0 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2386.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2386.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 char *__gen_e_acsl_literal_string;
 void f(void const *s, int c, unsigned long n)
 {
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2406.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2406.c
index 90b370c4f2cd506313c73d515bb600fe16deb609..3c48bb9e56162ba5522dfccc4ab3b1564e640cad 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2406.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2406.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 char const tab[];
 char t[10];
 void __e_acsl_globals_init(void)
@@ -14,7 +14,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(t));
 }
@@ -45,7 +45,7 @@ int main(void)
   /*@ assert \valid(&t[0 .. 9]); */ ;
   __retres = 0;
   __e_acsl_delete_block((void *)(& p));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue-eacsl-105.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue-eacsl-105.c
index 8ad1e10fa53fcb05e3e4ce4bc9b1fd53785a94fc..e6ab7d016e17c216d6c6a4937ed7a24dc9cdad63 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue-eacsl-105.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue-eacsl-105.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int f(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue-eacsl-91.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue-eacsl-91.c
index 14dd1ab575af5a0d4560ecc5a1ac7ae3bc49a5d3..c3248c722e31367998e848cf0df89ea8db9c7fd4 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue-eacsl-91.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue-eacsl-91.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 short a;
 char b(void)
 {
@@ -40,7 +40,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& b));
   __e_acsl_delete_block((void *)(& a));
@@ -56,7 +56,7 @@ int main(void)
   __e_acsl_full_init((void *)(& __retres));
   __retres = 0;
   __e_acsl_delete_block((void *)(& __retres));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue69.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue69.c
index 44cfac328f8ff8637b0acf5384c359fa86b3ea1b..b49b9ee26da2e1fdbd108bc6dbd1390fe7e5dfc0 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue69.c
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue69.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/constructs/function_contract.i b/src/plugins/e-acsl/tests/constructs/function_contract.i
index 90eca5e7829d3e1e7911aca5d02d25ff4b61a872..512c41f6474f048d0bf26e64360764d289df8b21 100644
--- a/src/plugins/e-acsl/tests/constructs/function_contract.i
+++ b/src/plugins/e-acsl/tests/constructs/function_contract.i
@@ -45,9 +45,9 @@ void k(void) { X += Y; }
 
 // mix ensures + contract on return
 /*@ ensures X == 5; */
-int l() { 
+int l() {
   /*@ assert Y == 2; */
-  return X; 
+  return X;
 }
 
 // mix ensures and assumes
@@ -72,6 +72,40 @@ void m(void) { X += Y; }
   @   ensures X == 98; */
 void n(void) { X ++; }
 
+// several complete and disjoint clauses
+/*@
+    requires X > -1000;
+    ensures X == \old(Y);
+
+    behavior neg:
+        assumes Y < 0;
+        requires Y < 1;
+        ensures X == \old(Y);
+
+    behavior pos:
+        assumes Y >= 0;
+        requires Y > -1;
+        ensures X == \old(Y);
+
+    behavior odd:
+        assumes Y % 2 == 1;
+        requires (Y % 2) - 1 == 0;
+        ensures X == \old(Y);
+
+    behavior even:
+        assumes Y % 2 == 0;
+        requires (Y % 2) + 1 == 1;
+        ensures X == \old(Y);
+
+    complete behaviors neg, pos;
+    complete behaviors odd, even;
+    complete behaviors;
+
+    disjoint behaviors neg, pos;
+    disjoint behaviors odd, even;
+*/
+void o(void) { X = Y; }
+
 int main(void) {
   f();
   g();
@@ -82,5 +116,6 @@ int main(void) {
   l();
   m();
   n();
+  o();
   return 0;
 }
diff --git a/src/plugins/e-acsl/tests/constructs/invariant.i b/src/plugins/e-acsl/tests/constructs/invariant.i
index 76cbdb63c7169236217d0cb3a519aea09562eafd..8bc1eeee091a422a69c6b9ad3d8f2454f1b6e7c8 100644
--- a/src/plugins/e-acsl/tests/constructs/invariant.i
+++ b/src/plugins/e-acsl/tests/constructs/invariant.i
@@ -1,6 +1,6 @@
 /* run.config_ci
    COMMENT: invariant
-   STDOPT: +"-slevel 11"
+   STDOPT: +"-eva-slevel 11"
 */
 
 int main(void) {
diff --git a/src/plugins/e-acsl/tests/constructs/loop.i b/src/plugins/e-acsl/tests/constructs/loop.i
index 4b0b3193ee1d889a17180daf26e085cd7a67cd0c..bbab3b09f21b67d29a1dda970db34f0b93f9f35b 100644
--- a/src/plugins/e-acsl/tests/constructs/loop.i
+++ b/src/plugins/e-acsl/tests/constructs/loop.i
@@ -1,6 +1,6 @@
 /* run.config_ci
    COMMENT: loop invariants
-   STDOPT: +"-slevel 160"
+   STDOPT: +"-eva-slevel 160"
 */
 
 void simple_loop() {
diff --git a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_false.c b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_false.c
index 7c2dc5ed4699cd1b21b3a8a1a2b331de709d4da0..ed65d0c6f152703aa95225d8cb26588573cc0522 100644
--- a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_false.c
+++ b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_false.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_function_contract.c b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_function_contract.c
index 9e7f63becc8b260a7c45ea04dcb5d33350f77fdd..6a00983f31056b0fcd24ff0e3cfd5c23ef11b549 100644
--- a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_function_contract.c
+++ b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_function_contract.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 int X = 0;
@@ -126,6 +126,43 @@ void n(void)
   return;
 }
 
+/*@ requires X > -1000;
+    ensures X ≡ \old(Y);
+    
+    behavior neg:
+      assumes Y < 0;
+      requires Y < 1;
+      ensures X ≡ \old(Y);
+    
+    behavior pos:
+      assumes Y ≥ 0;
+      requires Y > -1;
+      ensures X ≡ \old(Y);
+    
+    behavior odd:
+      assumes Y % 2 ≡ 1;
+      requires Y % 2 - 1 ≡ 0;
+      ensures X ≡ \old(Y);
+    
+    behavior even:
+      assumes Y % 2 ≡ 0;
+      requires Y % 2 + 1 ≡ 1;
+      ensures X ≡ \old(Y);
+    
+    complete behaviors even, odd, pos, neg;
+    complete behaviors odd, even;
+    complete behaviors neg, pos;
+    disjoint behaviors odd, even;
+    disjoint behaviors neg, pos;
+ */
+void __gen_e_acsl_o(void);
+
+void o(void)
+{
+  X = Y;
+  return;
+}
+
 int main(void)
 {
   int __retres;
@@ -138,10 +175,157 @@ int main(void)
   __gen_e_acsl_l();
   __gen_e_acsl_m();
   __gen_e_acsl_n();
+  __gen_e_acsl_o();
   __retres = 0;
   return __retres;
 }
 
+/*@ requires X > -1000;
+    ensures X ≡ \old(Y);
+    
+    behavior neg:
+      assumes Y < 0;
+      requires Y < 1;
+      ensures X ≡ \old(Y);
+    
+    behavior pos:
+      assumes Y ≥ 0;
+      requires Y > -1;
+      ensures X ≡ \old(Y);
+    
+    behavior odd:
+      assumes Y % 2 ≡ 1;
+      requires Y % 2 - 1 ≡ 0;
+      ensures X ≡ \old(Y);
+    
+    behavior even:
+      assumes Y % 2 ≡ 0;
+      requires Y % 2 + 1 ≡ 1;
+      ensures X ≡ \old(Y);
+    
+    complete behaviors even, odd, pos, neg;
+    complete behaviors odd, even;
+    complete behaviors neg, pos;
+    disjoint behaviors odd, even;
+    disjoint behaviors neg, pos;
+ */
+void __gen_e_acsl_o(void)
+{
+  int __gen_e_acsl_at_5;
+  int __gen_e_acsl_at_4;
+  int __gen_e_acsl_at_3;
+  int __gen_e_acsl_at_2;
+  int __gen_e_acsl_at;
+  __e_acsl_contract_t *__gen_e_acsl_contract;
+  {
+    int __gen_e_acsl_assumes_value;
+    int __gen_e_acsl_active_bhvrs;
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)4);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                           Y < 0);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,
+                                           Y >= 0);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)2,
+                                           Y % 2 == 1);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)3,
+                                           Y % 2 == 0);
+    __e_acsl_assert(X > -1000,"Precondition","o","X > -1000",
+                    "tests/constructs/function_contract.i",77);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(Y < 1,"Precondition","o",
+                                                    "neg: Y < 1",
+                                                    "tests/constructs/function_contract.i",
+                                                    82);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(Y > -1,"Precondition",
+                                                    "o","pos: Y > -1",
+                                                    "tests/constructs/function_contract.i",
+                                                    87);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)2);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(Y % 2 - 1 == 0,
+                                                    "Precondition","o",
+                                                    "odd: Y % 2 - 1 == 0",
+                                                    "tests/constructs/function_contract.i",
+                                                    92);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)3);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(Y % 2 + 1 == 1,
+                                                    "Precondition","o",
+                                                    "even: Y % 2 + 1 == 1",
+                                                    "tests/constructs/function_contract.i",
+                                                    97);
+    __gen_e_acsl_active_bhvrs = __e_acsl_contract_partial_count_behaviors
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)2,1,0);
+    if (__gen_e_acsl_active_bhvrs != 1) {
+      __e_acsl_assert(__gen_e_acsl_active_bhvrs >= 1,"Precondition","o",
+                      "complete behaviors pos, neg",
+                      "tests/constructs/function_contract.i",107);
+      __e_acsl_assert(__gen_e_acsl_active_bhvrs <= 1,"Precondition","o",
+                      "disjoint behaviors pos, neg",
+                      "tests/constructs/function_contract.i",107);
+    }
+    __gen_e_acsl_active_bhvrs = __e_acsl_contract_partial_count_behaviors
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)2,2,3);
+    if (__gen_e_acsl_active_bhvrs != 1) {
+      __e_acsl_assert(__gen_e_acsl_active_bhvrs >= 1,"Precondition","o",
+                      "complete behaviors odd, even",
+                      "tests/constructs/function_contract.i",107);
+      __e_acsl_assert(__gen_e_acsl_active_bhvrs <= 1,"Precondition","o",
+                      "disjoint behaviors odd, even",
+                      "tests/constructs/function_contract.i",107);
+    }
+    __gen_e_acsl_active_bhvrs = __e_acsl_contract_partial_count_all_behaviors
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract);
+    __e_acsl_assert(__gen_e_acsl_active_bhvrs >= 1,"Precondition","o",
+                    "all behaviors complete",
+                    "tests/constructs/function_contract.i",107);
+  }
+  __gen_e_acsl_at_5 = Y;
+  __gen_e_acsl_at_4 = Y;
+  __gen_e_acsl_at_3 = Y;
+  __gen_e_acsl_at_2 = Y;
+  __gen_e_acsl_at = Y;
+  o();
+  {
+    int __gen_e_acsl_assumes_value_2;
+    __e_acsl_assert(X == __gen_e_acsl_at,"Postcondition","o","X == \\old(Y)",
+                    "tests/constructs/function_contract.i",78);
+    __gen_e_acsl_assumes_value_2 = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value_2) __e_acsl_assert(X == __gen_e_acsl_at_2,
+                                                      "Postcondition","o",
+                                                      "neg: X == \\old(Y)",
+                                                      "tests/constructs/function_contract.i",
+                                                      83);
+    __gen_e_acsl_assumes_value_2 = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value_2) __e_acsl_assert(X == __gen_e_acsl_at_3,
+                                                      "Postcondition","o",
+                                                      "pos: X == \\old(Y)",
+                                                      "tests/constructs/function_contract.i",
+                                                      88);
+    __gen_e_acsl_assumes_value_2 = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)2);
+    if (__gen_e_acsl_assumes_value_2) __e_acsl_assert(X == __gen_e_acsl_at_4,
+                                                      "Postcondition","o",
+                                                      "odd: X == \\old(Y)",
+                                                      "tests/constructs/function_contract.i",
+                                                      93);
+    __gen_e_acsl_assumes_value_2 = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)3);
+    if (__gen_e_acsl_assumes_value_2) __e_acsl_assert(X == __gen_e_acsl_at_5,
+                                                      "Postcondition","o",
+                                                      "even: X == \\old(Y)",
+                                                      "tests/constructs/function_contract.i",
+                                                      98);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
+    return;
+  }
+}
+
 /*@ requires X > 0;
     requires X < 10;
     
@@ -155,28 +339,32 @@ int main(void)
  */
 void __gen_e_acsl_n(void)
 {
-  int __gen_e_acsl_at_2;
-  int __gen_e_acsl_at;
+  __e_acsl_contract_t *__gen_e_acsl_contract;
+  __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
+  __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                         X == 7);
+  __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,
+                                         X == 5);
   __e_acsl_assert(X > 0,"Precondition","n","X > 0",
                   "tests/constructs/function_contract.i",65);
   __e_acsl_assert(X < 10,"Precondition","n","X < 10",
                   "tests/constructs/function_contract.i",66);
-  __gen_e_acsl_at_2 = X == 5;
-  __gen_e_acsl_at = X == 7;
   n();
   {
-    int __gen_e_acsl_implies;
-    int __gen_e_acsl_implies_2;
-    if (! __gen_e_acsl_at) __gen_e_acsl_implies = 1;
-    else __gen_e_acsl_implies = X == 8;
-    __e_acsl_assert(__gen_e_acsl_implies,"Postcondition","n",
-                    "\\old(X == 7) ==> X == 8",
-                    "tests/constructs/function_contract.i",69);
-    if (! __gen_e_acsl_at_2) __gen_e_acsl_implies_2 = 1;
-    else __gen_e_acsl_implies_2 = X == 98;
-    __e_acsl_assert(__gen_e_acsl_implies_2,"Postcondition","n",
-                    "\\old(X == 5) ==> X == 98",
-                    "tests/constructs/function_contract.i",72);
+    int __gen_e_acsl_assumes_value;
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(X == 8,"Postcondition",
+                                                    "n","b1: X == 8",
+                                                    "tests/constructs/function_contract.i",
+                                                    69);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(X == 98,"Postcondition",
+                                                    "n","b2: X == 98",
+                                                    "tests/constructs/function_contract.i",
+                                                    72);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
     return;
   }
 }
@@ -193,42 +381,37 @@ void __gen_e_acsl_n(void)
  */
 void __gen_e_acsl_m(void)
 {
-  long __gen_e_acsl_at_4;
-  int __gen_e_acsl_at_3;
-  int __gen_e_acsl_at_2;
-  int __gen_e_acsl_at;
-  __gen_e_acsl_at_4 = (long)X;
-  {
-    int __gen_e_acsl_and_2;
-    if (X == 5) __gen_e_acsl_and_2 = Y == 2; else __gen_e_acsl_and_2 = 0;
-    __gen_e_acsl_at_3 = __gen_e_acsl_and_2;
-  }
+  long __gen_e_acsl_at;
+  __e_acsl_contract_t *__gen_e_acsl_contract;
   {
     int __gen_e_acsl_and;
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                           X == 7);
     if (X == 5) __gen_e_acsl_and = Y == 2; else __gen_e_acsl_and = 0;
-    __gen_e_acsl_at_2 = __gen_e_acsl_and;
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,
+                                           __gen_e_acsl_and);
   }
-  __gen_e_acsl_at = X == 7;
+  __gen_e_acsl_at = (long)X;
   m();
   {
-    int __gen_e_acsl_implies;
-    int __gen_e_acsl_implies_2;
-    int __gen_e_acsl_implies_3;
-    if (! __gen_e_acsl_at) __gen_e_acsl_implies = 1;
-    else __gen_e_acsl_implies = X == 95;
-    __e_acsl_assert(__gen_e_acsl_implies,"Postcondition","m",
-                    "\\old(X == 7) ==> X == 95",
-                    "tests/constructs/function_contract.i",56);
-    if (! __gen_e_acsl_at_2) __gen_e_acsl_implies_2 = 1;
-    else __gen_e_acsl_implies_2 = X == 7;
-    __e_acsl_assert(__gen_e_acsl_implies_2,"Postcondition","m",
-                    "\\old(X == 5 && Y == 2) ==> X == 7",
-                    "tests/constructs/function_contract.i",60);
-    if (! __gen_e_acsl_at_3) __gen_e_acsl_implies_3 = 1;
-    else __gen_e_acsl_implies_3 = (long)X == __gen_e_acsl_at_4 + Y;
-    __e_acsl_assert(__gen_e_acsl_implies_3,"Postcondition","m",
-                    "\\old(X == 5 && Y == 2) ==> X == \\old(X) + Y",
-                    "tests/constructs/function_contract.i",61);
+    int __gen_e_acsl_assumes_value;
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(X == 95,"Postcondition",
+                                                    "m","b1: X == 95",
+                                                    "tests/constructs/function_contract.i",
+                                                    56);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value) {
+      __e_acsl_assert((long)X == __gen_e_acsl_at + Y,"Postcondition","m",
+                      "b2: X == \\old(X) + Y",
+                      "tests/constructs/function_contract.i",61);
+      __e_acsl_assert(X == 7,"Postcondition","m","b2: X == 7",
+                      "tests/constructs/function_contract.i",60);
+    }
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
     return;
   }
 }
@@ -255,31 +438,33 @@ int __gen_e_acsl_l(void)
  */
 void __gen_e_acsl_k(void)
 {
+  __e_acsl_contract_t *__gen_e_acsl_contract;
   {
-    int __gen_e_acsl_implies;
     int __gen_e_acsl_and;
-    int __gen_e_acsl_implies_2;
-    int __gen_e_acsl_and_2;
-    int __gen_e_acsl_implies_3;
-    if (! (X == 1)) __gen_e_acsl_implies = 1;
-    else __gen_e_acsl_implies = X == 0;
-    __e_acsl_assert(__gen_e_acsl_implies,"Precondition","k",
-                    "X == 1 ==> X == 0",
-                    "tests/constructs/function_contract.i",38);
+    int __gen_e_acsl_assumes_value;
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                           X == 1);
     if (X == 3) __gen_e_acsl_and = Y == 2; else __gen_e_acsl_and = 0;
-    if (! __gen_e_acsl_and) __gen_e_acsl_implies_2 = 1;
-    else __gen_e_acsl_implies_2 = X == 3;
-    __e_acsl_assert(__gen_e_acsl_implies_2,"Precondition","k",
-                    "X == 3 && Y == 2 ==> X == 3",
-                    "tests/constructs/function_contract.i",42);
-    if (X == 3) __gen_e_acsl_and_2 = Y == 2; else __gen_e_acsl_and_2 = 0;
-    if (! __gen_e_acsl_and_2) __gen_e_acsl_implies_3 = 1;
-    else __gen_e_acsl_implies_3 = X + (long)Y == 5L;
-    __e_acsl_assert(__gen_e_acsl_implies_3,"Precondition","k",
-                    "X == 3 && Y == 2 ==> X + Y == 5",
-                    "tests/constructs/function_contract.i",43);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,
+                                           __gen_e_acsl_and);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(X == 0,"Precondition",
+                                                    "k","b1: X == 0",
+                                                    "tests/constructs/function_contract.i",
+                                                    38);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value) {
+      __e_acsl_assert(X + (long)Y == 5L,"Precondition","k","b2: X + Y == 5",
+                      "tests/constructs/function_contract.i",43);
+      __e_acsl_assert(X == 3,"Precondition","k","b2: X == 3",
+                      "tests/constructs/function_contract.i",42);
+    }
   }
   k();
+  __e_acsl_contract_clean(__gen_e_acsl_contract);
   return;
 }
 
@@ -294,18 +479,46 @@ void __gen_e_acsl_k(void)
  */
 void __gen_e_acsl_j(void)
 {
-  __e_acsl_assert(X == 5,"Precondition","j","X == 5",
-                  "tests/constructs/function_contract.i",27);
-  __e_acsl_assert((long)X == 3L + Y,"Precondition","j","X == 3 + Y",
-                  "tests/constructs/function_contract.i",30);
-  __e_acsl_assert(Y == 2,"Precondition","j","Y == 2",
-                  "tests/constructs/function_contract.i",31);
+  __e_acsl_contract_t *__gen_e_acsl_contract;
+  {
+    int __gen_e_acsl_assumes_value;
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,1);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,1);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(X == 5,"Precondition",
+                                                    "j","b1: X == 5",
+                                                    "tests/constructs/function_contract.i",
+                                                    27);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value) {
+      __e_acsl_assert(Y == 2,"Precondition","j","b2: Y == 2",
+                      "tests/constructs/function_contract.i",31);
+      __e_acsl_assert((long)X == 3L + Y,"Precondition","j","b2: X == 3 + Y",
+                      "tests/constructs/function_contract.i",30);
+    }
+  }
   j();
-  __e_acsl_assert(X == 3,"Postcondition","j","X == 3",
-                  "tests/constructs/function_contract.i",28);
-  __e_acsl_assert((long)X == Y + 1L,"Postcondition","j","X == Y + 1",
-                  "tests/constructs/function_contract.i",32);
-  return;
+  {
+    int __gen_e_acsl_assumes_value_2;
+    __gen_e_acsl_assumes_value_2 = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value_2) __e_acsl_assert(X == 3,"Postcondition",
+                                                      "j","b1: X == 3",
+                                                      "tests/constructs/function_contract.i",
+                                                      28);
+    __gen_e_acsl_assumes_value_2 = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value_2) __e_acsl_assert((long)X == Y + 1L,
+                                                      "Postcondition","j",
+                                                      "b2: X == Y + 1",
+                                                      "tests/constructs/function_contract.i",
+                                                      32);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
+    return;
+  }
 }
 
 /*@ requires X ≡ 3;
diff --git a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_ghost.c b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_ghost.c
index ab2bc7b703821eac9e38b82846f04b971497d3c5..d1e84e229ba0f4ce85097cf6267cb5637fd10bda 100644
--- a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_ghost.c
+++ b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_ghost.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int G = 0;
 int *P;
 void __e_acsl_globals_init(void)
@@ -16,7 +16,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& P));
   __e_acsl_delete_block((void *)(& G));
@@ -74,7 +74,7 @@ int main(void)
   }
   __retres = 0;
   __e_acsl_delete_block((void *)(& q));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_invariant.c b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_invariant.c
index 803e14a2914f164781f4cd2324420ffc2567e370..f662b924a1e3ff944d227867fab63649b277aa43 100644
--- a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_invariant.c
+++ b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_invariant.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_labeled_stmt.c b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_labeled_stmt.c
index 06a5de92573cd1f63bb730d2872ce69f3432a319..4e43bc9fabffbbf5663023222f137159cc599b87 100644
--- a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_labeled_stmt.c
+++ b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_labeled_stmt.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 int X = 0;
diff --git a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_lazy.c b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_lazy.c
index b9ba06467be864939e8f22b5f52bfe826b1b814e..d21ef113d761fe2047214836277f8f3fde8b0f8c 100644
--- a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_lazy.c
+++ b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_lazy.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_loop.c b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_loop.c
index 879d1ee52a8ea1608999651843b866fc15f8f381..c1944d903d8b2b3d7492251900b5c76206f8d22f 100644
--- a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_loop.c
+++ b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_loop.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 void simple_loop(void)
 {
   int sum = 0;
diff --git a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_nested_code_annot.c b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_nested_code_annot.c
index 252046ac3c885a76d1db75b9e766725b2a12340b..07c6bff2ea6b1420cfefc2f7e86cc515bc286ac8 100644
--- a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_nested_code_annot.c
+++ b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_nested_code_annot.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_result.c b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_result.c
index 6b0f6fcf6b200810222c7a03b36bd41a2d2b6526..dccbec78338d13c8cc8351af5f78cf4110fb24cd 100644
--- a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_result.c
+++ b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_result.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 /*@ ensures \result ≡ (int)(\old(x) - \old(x)); */
diff --git a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_stmt_contract.c b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_stmt_contract.c
index b9942c443b734d7b8125e9eb9632e5a9e0a1cd03..af5ff59ccca7697363bb104e4ea13add52b0d793 100644
--- a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_stmt_contract.c
+++ b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_stmt_contract.c
@@ -1,9 +1,13 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
+  __e_acsl_contract_t *__gen_e_acsl_contract_3;
+  __e_acsl_contract_t *__gen_e_acsl_contract_2;
+  __e_acsl_contract_t *__gen_e_acsl_contract;
   int __retres;
+  int z;
   int x = 0;
   int y = 2;
   /*@ ensures x ≡ 1; */
@@ -35,49 +39,79 @@ int main(void)
   /*@ requires x ≡ 3;
       requires y ≡ 2; */
   x += y;
-  __e_acsl_assert(x == 5,"Precondition","main","x == 5",
-                  "tests/constructs/stmt_contract.i",25);
-  __e_acsl_assert((long)x == 3L + y,"Precondition","main","x == 3 + y",
-                  "tests/constructs/stmt_contract.i",28);
-  __e_acsl_assert(y == 2,"Precondition","main","y == 2",
-                  "tests/constructs/stmt_contract.i",29);
-  /*@ behavior b1:
-        requires x ≡ 5;
-        ensures x ≡ 3;
-      
-      behavior b2:
-        requires x ≡ 3 + y;
-        requires y ≡ 2;
-        ensures x ≡ y + 1;
-  */
-  x = 3;
-  __e_acsl_assert(x == 3,"Postcondition","main","x == 3",
-                  "tests/constructs/stmt_contract.i",26);
-  __e_acsl_assert((long)x == y + 1L,"Postcondition","main","x == y + 1",
-                  "tests/constructs/stmt_contract.i",30);
   {
-    int __gen_e_acsl_implies;
+    int __gen_e_acsl_assumes_value_2;
+    {
+      int __gen_e_acsl_assumes_value;
+      __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
+      __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                             1);
+      __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,
+                                             1);
+      __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+      ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+      if (__gen_e_acsl_assumes_value) __e_acsl_assert(x == 5,"Precondition",
+                                                      "main","b1: x == 5",
+                                                      "tests/constructs/stmt_contract.i",
+                                                      25);
+      __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+      ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+      if (__gen_e_acsl_assumes_value) {
+        __e_acsl_assert(y == 2,"Precondition","main","b2: y == 2",
+                        "tests/constructs/stmt_contract.i",29);
+        __e_acsl_assert((long)x == 3L + y,"Precondition","main",
+                        "b2: x == 3 + y","tests/constructs/stmt_contract.i",
+                        28);
+      }
+    }
+    /*@ behavior b1:
+          requires x ≡ 5;
+          ensures x ≡ 3;
+        
+        behavior b2:
+          requires x ≡ 3 + y;
+          requires y ≡ 2;
+          ensures x ≡ y + 1;
+    */
+    x = 3;
+    __gen_e_acsl_assumes_value_2 = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value_2) __e_acsl_assert(x == 3,"Postcondition",
+                                                      "main","b1: x == 3",
+                                                      "tests/constructs/stmt_contract.i",
+                                                      26);
+    __gen_e_acsl_assumes_value_2 = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value_2) __e_acsl_assert((long)x == y + 1L,
+                                                      "Postcondition","main",
+                                                      "b2: x == y + 1",
+                                                      "tests/constructs/stmt_contract.i",
+                                                      30);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
+  }
+  {
     int __gen_e_acsl_and_2;
-    int __gen_e_acsl_implies_2;
-    int __gen_e_acsl_and_3;
-    int __gen_e_acsl_implies_3;
-    if (! (x == 1)) __gen_e_acsl_implies = 1;
-    else __gen_e_acsl_implies = x == 0;
-    __e_acsl_assert(__gen_e_acsl_implies,"Precondition","main",
-                    "x == 1 ==> x == 0","tests/constructs/stmt_contract.i",
-                    35);
+    int __gen_e_acsl_assumes_value_3;
+    __gen_e_acsl_contract_2 = __e_acsl_contract_init((size_t)2);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract_2,(size_t)0,
+                                           x == 1);
     if (x == 3) __gen_e_acsl_and_2 = y == 2; else __gen_e_acsl_and_2 = 0;
-    if (! __gen_e_acsl_and_2) __gen_e_acsl_implies_2 = 1;
-    else __gen_e_acsl_implies_2 = x == 3;
-    __e_acsl_assert(__gen_e_acsl_implies_2,"Precondition","main",
-                    "x == 3 && y == 2 ==> x == 3",
-                    "tests/constructs/stmt_contract.i",39);
-    if (x == 3) __gen_e_acsl_and_3 = y == 2; else __gen_e_acsl_and_3 = 0;
-    if (! __gen_e_acsl_and_3) __gen_e_acsl_implies_3 = 1;
-    else __gen_e_acsl_implies_3 = x + (long)y == 5L;
-    __e_acsl_assert(__gen_e_acsl_implies_3,"Precondition","main",
-                    "x == 3 && y == 2 ==> x + y == 5",
-                    "tests/constructs/stmt_contract.i",40);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract_2,(size_t)1,
+                                           __gen_e_acsl_and_2);
+    __gen_e_acsl_assumes_value_3 = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract_2,(size_t)0);
+    if (__gen_e_acsl_assumes_value_3) __e_acsl_assert(x == 0,"Precondition",
+                                                      "main","b1: x == 0",
+                                                      "tests/constructs/stmt_contract.i",
+                                                      35);
+    __gen_e_acsl_assumes_value_3 = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract_2,(size_t)1);
+    if (__gen_e_acsl_assumes_value_3) {
+      __e_acsl_assert(x + (long)y == 5L,"Precondition","main",
+                      "b2: x + y == 5","tests/constructs/stmt_contract.i",40);
+      __e_acsl_assert(x == 3,"Precondition","main","b2: x == 3",
+                      "tests/constructs/stmt_contract.i",39);
+    }
   }
   /*@ behavior b1:
         assumes x ≡ 1;
@@ -90,6 +124,7 @@ int main(void)
         requires x + y ≡ 5;
   */
   x += y;
+  __e_acsl_contract_clean(__gen_e_acsl_contract_2);
   __e_acsl_assert(x == 5,"Precondition","main","x == 5",
                   "tests/constructs/stmt_contract.i",43);
   /*@ requires x ≡ 5; */
@@ -99,8 +134,63 @@ int main(void)
     /*@ requires y ≡ 2; */
     x += y;
   }
+  {
+    int __gen_e_acsl_assumes_value_4;
+    {
+      int __gen_e_acsl_active_bhvrs;
+      __gen_e_acsl_contract_3 = __e_acsl_contract_init((size_t)2);
+      __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract_3,
+                                             (size_t)0,x >= 0);
+      __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract_3,
+                                             (size_t)1,x < 0);
+      __e_acsl_assert(x > -1000,"Precondition","main","x > -1000",
+                      "tests/constructs/stmt_contract.i",49);
+      __gen_e_acsl_active_bhvrs = __e_acsl_contract_partial_count_all_behaviors
+      ((__e_acsl_contract_t const *)__gen_e_acsl_contract_3);
+      if (__gen_e_acsl_active_bhvrs != 1) {
+        __e_acsl_assert(__gen_e_acsl_active_bhvrs >= 1,"Precondition","main",
+                        "all behaviors complete",
+                        "tests/constructs/stmt_contract.i",64);
+        __e_acsl_assert(__gen_e_acsl_active_bhvrs <= 1,"Precondition","main",
+                        "all behaviors disjoint",
+                        "tests/constructs/stmt_contract.i",64);
+      }
+    }
+    /*@ requires x > -1000;
+        ensures z ≥ 0;
+        assigns x;
+        
+        behavior pos:
+          assumes x ≥ 0;
+          ensures z ≡ x;
+        
+        behavior neg:
+          assumes x < 0;
+          ensures z ≡ -x;
+        
+        complete behaviors neg, pos;
+        disjoint behaviors neg, pos;
+    */
+    if (x < 0) z = - x; else z = x;
+    __e_acsl_assert(z >= 0,"Postcondition","main","z >= 0",
+                    "tests/constructs/stmt_contract.i",51);
+    __gen_e_acsl_assumes_value_4 = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract_3,(size_t)0);
+    if (__gen_e_acsl_assumes_value_4) __e_acsl_assert(z == x,"Postcondition",
+                                                      "main","pos: z == x",
+                                                      "tests/constructs/stmt_contract.i",
+                                                      55);
+    __gen_e_acsl_assumes_value_4 = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract_3,(size_t)1);
+    if (__gen_e_acsl_assumes_value_4) __e_acsl_assert((long)z == - ((long)x),
+                                                      "Postcondition","main",
+                                                      "neg: z == -x",
+                                                      "tests/constructs/stmt_contract.i",
+                                                      59);
+    __e_acsl_contract_clean(__gen_e_acsl_contract_3);
+  }
   __e_acsl_assert(x == 7,"Precondition","main","x == 7",
-                  "tests/constructs/stmt_contract.i",47);
+                  "tests/constructs/stmt_contract.i",70);
   /*@ requires x ≡ 7;
       ensures x ≡ 7; */
   {
@@ -108,7 +198,7 @@ int main(void)
     goto return_label;
   }
   __e_acsl_assert(x == 7,"Postcondition","main","x == 7",
-                  "tests/constructs/stmt_contract.i",48);
+                  "tests/constructs/stmt_contract.i",71);
   return_label: return __retres;
 }
 
diff --git a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_true.c b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_true.c
index 243f60598a1d7058fdac1047fc7513c4dea1bc85..819a2b7a157a92588d7890015ab49a9ee329b1b9 100644
--- a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_true.c
+++ b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_true.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_typedef.c b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_typedef.c
index 92e02166357ca38676b0a54bdfe18e6b4a1015b6..8b62fcfca7246451c4e19c78ff282458a54e0704 100644
--- a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_typedef.c
+++ b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_typedef.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 typedef unsigned char uint8;
 int main(void)
 {
diff --git a/src/plugins/e-acsl/tests/constructs/oracle_ci/stmt_contract.res.oracle b/src/plugins/e-acsl/tests/constructs/oracle_ci/stmt_contract.res.oracle
index efd026311297e55d8fefb674326118e6ece88624..b1c4f6eb72229f64ba5bf67742a6f9968e207c4c 100644
--- a/src/plugins/e-acsl/tests/constructs/oracle_ci/stmt_contract.res.oracle
+++ b/src/plugins/e-acsl/tests/constructs/oracle_ci/stmt_contract.res.oracle
@@ -1,2 +1,5 @@
 [e-acsl] beginning translation.
+[e-acsl] tests/constructs/stmt_contract.i:64: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
 [e-acsl] translation done in project "e-acsl".
diff --git a/src/plugins/e-acsl/tests/constructs/stmt_contract.i b/src/plugins/e-acsl/tests/constructs/stmt_contract.i
index 3d105913dedf80485537533a730982636ee6ac4b..a8d4595526c599e502c9aa55f92111d6b38b2e31 100644
--- a/src/plugins/e-acsl/tests/constructs/stmt_contract.i
+++ b/src/plugins/e-acsl/tests/constructs/stmt_contract.i
@@ -3,7 +3,7 @@
 */
 
 int main(void) {
-  int x = 0, y = 2;
+  int x = 0, y = 2, z;
   // one ensures
   /*@ ensures x == 1; */
   x = 1;
@@ -21,9 +21,9 @@ int main(void) {
     @ requires y == 2; */
   x = x + y;
   // several behaviors
-  /*@ behavior b1: 
+  /*@ behavior b1:
     @   requires x == 5;
-    @   ensures x == 3; 
+    @   ensures x == 3;
     @ behavior b2:
     @   requires x == 3+y;
     @   requires y == 2;
@@ -32,7 +32,7 @@ int main(void) {
   // mix requires and assumes
   /*@ behavior b1:
     @   assumes x == 1;
-    @   requires x == 0; 
+    @   requires x == 0;
     @ behavior b2:
     @   assumes x == 3;
     @   assumes y == 2;
@@ -44,7 +44,30 @@ int main(void) {
   /*@ requires y == 2; */
   x = x + y;
 
-  /*@ requires x == 7; 
+  // complete and disjoint behaviors
+  /*@
+    requires x > -1000;
+    assigns x;
+    ensures z >= 0;
+
+    behavior pos:
+      assumes x >= 0;
+      ensures z == x;
+
+    behavior neg:
+      assumes x < 0;
+      ensures z == -x;
+
+    complete behaviors;
+    disjoint behaviors;
+  */
+  if (x < 0) {
+    z = -x;
+  } else {
+    z = x;
+  }
+
+  /*@ requires x == 7;
     @ ensures x == 7; */
   return 0;
 }
diff --git a/src/plugins/e-acsl/tests/examples/oracle_ci/gen_functions_contiki.c b/src/plugins/e-acsl/tests/examples/oracle_ci/gen_functions_contiki.c
index 47e55d3fc12d7dc4c433a4048dc6a87d3fe16138..84a91929a6160d6724e7ddbb1b25c723d7e60da7 100644
--- a/src/plugins/e-acsl/tests/examples/oracle_ci/gen_functions_contiki.c
+++ b/src/plugins/e-acsl/tests/examples/oracle_ci/gen_functions_contiki.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 struct list {
diff --git a/src/plugins/e-acsl/tests/examples/oracle_ci/gen_linear_search.c b/src/plugins/e-acsl/tests/examples/oracle_ci/gen_linear_search.c
index 6657c1ae8ee2ab44422f5fe7bf30ed3f45503d99..421fdfe0f58470d21711a0f432e2e77add1b2f4e 100644
--- a/src/plugins/e-acsl/tests/examples/oracle_ci/gen_linear_search.c
+++ b/src/plugins/e-acsl/tests/examples/oracle_ci/gen_linear_search.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 int A[10];
@@ -133,44 +133,37 @@ int main(void)
  */
 int __gen_e_acsl_search(int elt)
 {
-  int __gen_e_acsl_at_2;
-  int __gen_e_acsl_at;
+  __e_acsl_contract_t *__gen_e_acsl_contract;
   int __retres;
   {
+    int __gen_e_acsl_exists;
+    int __gen_e_acsl_j;
     int __gen_e_acsl_forall;
+    int __gen_e_acsl_j_2;
+    int __gen_e_acsl_forall_2;
     int __gen_e_acsl_i;
-    __gen_e_acsl_forall = 1;
-    __gen_e_acsl_i = 0;
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
+    __gen_e_acsl_exists = 0;
+    __gen_e_acsl_j = 0;
     while (1) {
-      if (__gen_e_acsl_i < 9) ; else break;
-      __e_acsl_assert((int)(__gen_e_acsl_i + 1L) < 10,"RTE","search",
-                      "index_bound: (int)(__gen_e_acsl_i + 1) < 10",
-                      "tests/examples/linear_search.i",7);
-      __e_acsl_assert(0 <= (int)(__gen_e_acsl_i + 1L),"RTE","search",
-                      "index_bound: 0 <= (int)(__gen_e_acsl_i + 1)",
-                      "tests/examples/linear_search.i",7);
-      __e_acsl_assert(__gen_e_acsl_i < 10,"RTE","search",
-                      "index_bound: __gen_e_acsl_i < 10",
-                      "tests/examples/linear_search.i",7);
-      __e_acsl_assert(0 <= __gen_e_acsl_i,"RTE","search",
-                      "index_bound: 0 <= __gen_e_acsl_i",
-                      "tests/examples/linear_search.i",7);
-      if (A[__gen_e_acsl_i] <= A[__gen_e_acsl_i + 1]) ;
+      if (__gen_e_acsl_j < 10) ; else break;
+      __e_acsl_assert(__gen_e_acsl_j < 10,"RTE","search",
+                      "index_bound: __gen_e_acsl_j < 10",
+                      "tests/examples/linear_search.i",9);
+      __e_acsl_assert(0 <= __gen_e_acsl_j,"RTE","search",
+                      "index_bound: 0 <= __gen_e_acsl_j",
+                      "tests/examples/linear_search.i",9);
+      if (! (A[__gen_e_acsl_j] == elt)) ;
       else {
-        __gen_e_acsl_forall = 0;
+        __gen_e_acsl_exists = 1;
         goto e_acsl_end_loop3;
       }
-      __gen_e_acsl_i ++;
+      __gen_e_acsl_j ++;
     }
     e_acsl_end_loop3: ;
-    __e_acsl_assert(__gen_e_acsl_forall,"Precondition","search",
-                    "\\forall integer i; 0 <= i < 9 ==> A[i] <= A[i + 1]",
-                    "tests/examples/linear_search.i",7);
-  }
-  {
-    int __gen_e_acsl_forall_2;
-    int __gen_e_acsl_j_2;
-    __gen_e_acsl_forall_2 = 1;
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                           __gen_e_acsl_exists);
+    __gen_e_acsl_forall = 1;
     __gen_e_acsl_j_2 = 0;
     while (1) {
       if (__gen_e_acsl_j_2 < 10) ; else break;
@@ -182,51 +175,60 @@ int __gen_e_acsl_search(int elt)
                       "tests/examples/linear_search.i",12);
       if (A[__gen_e_acsl_j_2] != elt) ;
       else {
-        __gen_e_acsl_forall_2 = 0;
-        goto e_acsl_end_loop5;
+        __gen_e_acsl_forall = 0;
+        goto e_acsl_end_loop4;
       }
       __gen_e_acsl_j_2 ++;
     }
-    e_acsl_end_loop5: ;
-    __gen_e_acsl_at_2 = __gen_e_acsl_forall_2;
-  }
-  {
-    int __gen_e_acsl_exists;
-    int __gen_e_acsl_j;
-    __gen_e_acsl_exists = 0;
-    __gen_e_acsl_j = 0;
+    e_acsl_end_loop4: ;
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,
+                                           __gen_e_acsl_forall);
+    __gen_e_acsl_forall_2 = 1;
+    __gen_e_acsl_i = 0;
     while (1) {
-      if (__gen_e_acsl_j < 10) ; else break;
-      __e_acsl_assert(__gen_e_acsl_j < 10,"RTE","search",
-                      "index_bound: __gen_e_acsl_j < 10",
-                      "tests/examples/linear_search.i",9);
-      __e_acsl_assert(0 <= __gen_e_acsl_j,"RTE","search",
-                      "index_bound: 0 <= __gen_e_acsl_j",
-                      "tests/examples/linear_search.i",9);
-      if (! (A[__gen_e_acsl_j] == elt)) ;
+      if (__gen_e_acsl_i < 9) ; else break;
+      __e_acsl_assert((int)(__gen_e_acsl_i + 1L) < 10,"RTE","search",
+                      "index_bound: (int)(__gen_e_acsl_i + 1) < 10",
+                      "tests/examples/linear_search.i",7);
+      __e_acsl_assert(0 <= (int)(__gen_e_acsl_i + 1L),"RTE","search",
+                      "index_bound: 0 <= (int)(__gen_e_acsl_i + 1)",
+                      "tests/examples/linear_search.i",7);
+      __e_acsl_assert(__gen_e_acsl_i < 10,"RTE","search",
+                      "index_bound: __gen_e_acsl_i < 10",
+                      "tests/examples/linear_search.i",7);
+      __e_acsl_assert(0 <= __gen_e_acsl_i,"RTE","search",
+                      "index_bound: 0 <= __gen_e_acsl_i",
+                      "tests/examples/linear_search.i",7);
+      if (A[__gen_e_acsl_i] <= A[__gen_e_acsl_i + 1]) ;
       else {
-        __gen_e_acsl_exists = 1;
-        goto e_acsl_end_loop4;
+        __gen_e_acsl_forall_2 = 0;
+        goto e_acsl_end_loop5;
       }
-      __gen_e_acsl_j ++;
+      __gen_e_acsl_i ++;
     }
-    e_acsl_end_loop4: ;
-    __gen_e_acsl_at = __gen_e_acsl_exists;
+    e_acsl_end_loop5: ;
+    __e_acsl_assert(__gen_e_acsl_forall_2,"Precondition","search",
+                    "\\forall integer i; 0 <= i < 9 ==> A[i] <= A[i + 1]",
+                    "tests/examples/linear_search.i",7);
   }
   __retres = search(elt);
   {
-    int __gen_e_acsl_implies;
-    int __gen_e_acsl_implies_2;
-    if (! __gen_e_acsl_at) __gen_e_acsl_implies = 1;
-    else __gen_e_acsl_implies = __retres == 1;
-    __e_acsl_assert(__gen_e_acsl_implies,"Postcondition","search",
-                    "\\old(\\exists integer j; 0 <= j < 10 && A[j] == elt) ==> \\result == 1",
-                    "tests/examples/linear_search.i",10);
-    if (! __gen_e_acsl_at_2) __gen_e_acsl_implies_2 = 1;
-    else __gen_e_acsl_implies_2 = __retres == 0;
-    __e_acsl_assert(__gen_e_acsl_implies_2,"Postcondition","search",
-                    "\\old(\\forall integer j; 0 <= j < 10 ==> A[j] != elt) ==> \\result == 0",
-                    "tests/examples/linear_search.i",13);
+    int __gen_e_acsl_assumes_value;
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(__retres == 1,
+                                                    "Postcondition","search",
+                                                    "exists: \\result == 1",
+                                                    "tests/examples/linear_search.i",
+                                                    10);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(__retres == 0,
+                                                    "Postcondition","search",
+                                                    "not_exists: \\result == 0",
+                                                    "tests/examples/linear_search.i",
+                                                    13);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
     return __retres;
   }
 }
diff --git a/src/plugins/e-acsl/tests/examples/oracle_ci/linear_search.res.oracle b/src/plugins/e-acsl/tests/examples/oracle_ci/linear_search.res.oracle
index 99a62eef221249385b08dee71e0d519b78fc0716..7440543ece019a5c93a6944f9668cd7afbe7aa64 100644
--- a/src/plugins/e-acsl/tests/examples/oracle_ci/linear_search.res.oracle
+++ b/src/plugins/e-acsl/tests/examples/oracle_ci/linear_search.res.oracle
@@ -2,23 +2,3 @@
 [e-acsl] translation done in project "e-acsl".
 [eva:alarm] tests/examples/linear_search.i:30: Warning: 
   function __gen_e_acsl_search: precondition got status unknown.
-[eva:alarm] tests/examples/linear_search.i:7: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva:alarm] tests/examples/linear_search.i:18: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva:alarm] tests/examples/linear_search.i:18: Warning: 
-  loop invariant got status unknown.
-[eva:alarm] tests/examples/linear_search.i:10: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva:alarm] tests/examples/linear_search.i:13: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva:alarm] tests/examples/linear_search.i:10: Warning: 
-  function __gen_e_acsl_search, behavior exists: postcondition got status unknown. (Behavior may be inactive, no reduction performed.)
-[eva:alarm] tests/examples/linear_search.i:13: Warning: 
-  function __gen_e_acsl_search, behavior not_exists: postcondition got status unknown. (Behavior may be inactive, no reduction performed.)
-[eva:alarm] tests/examples/linear_search.i:31: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva:alarm] tests/examples/linear_search.i:33: Warning: 
-  function __gen_e_acsl_search: precondition got status unknown.
-[eva:alarm] tests/examples/linear_search.i:34: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
diff --git a/src/plugins/e-acsl/tests/format/oracle_ci/fprintf.res.oracle b/src/plugins/e-acsl/tests/format/oracle_ci/fprintf.res.oracle
index 7f687e99ca53151fcccbd49e94c070fa184416b3..161e12fd16ae235aa8141ba0bb62f4d4a33703e0 100644
--- a/src/plugins/e-acsl/tests/format/oracle_ci/fprintf.res.oracle
+++ b/src/plugins/e-acsl/tests/format/oracle_ci/fprintf.res.oracle
@@ -14,29 +14,29 @@
 [e-acsl] Warning: annotating undefined function `fork':
   the generated program may miss memory instrumentation
   if there are memory-related annotations.
-[e-acsl] tests/format/fprintf.c:10: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/unistd.h:854: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:92: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:79: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/sys/wait.h:86: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/stdio.h:120: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/stdio.h:118: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/stdio.h:122: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/stdio.h:94: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/stdio.h:97: Warning: 
   E-ACSL construct `predicate with no definition nor reads clause'
   is not yet supported.
   Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/stdio.h:97: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:470: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/stdio.h:97: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:472: Warning: 
   E-ACSL construct `abnormal termination case in behavior'
   is not yet supported.
   Ignoring annotation.
@@ -47,65 +47,3 @@
   function __gen_e_acsl_fork: postcondition 'result_ok_child_or_error' got status unknown.
 [kernel:annot:missing-spec] tests/format/fprintf.c:15: Warning: 
   Neither code nor specification for function __e_acsl_builtin_fprintf, generating default assigns from the prototype
-[eva:alarm] FRAMAC_SHARE/libc/sys/wait.h:86: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva:alarm] FRAMAC_SHARE/libc/sys/wait.h:86: Warning: 
-  function __gen_e_acsl_waitpid: postcondition 'initialization,stat_loc_init_on_success' got status unknown.
-[eva:alarm] tests/format/fprintf.c:15: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status);
-[eva:invalid-assigns] tests/format/fprintf.c:16: 
-  Completely invalid destination for assigns clause *stream. Ignoring.
-[eva:alarm] tests/format/fprintf.c:16: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_0);
-[eva:alarm] tests/format/fprintf.c:19: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_1);
-[eva:alarm] FRAMAC_SHARE/libc/stdio.h:120: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva:alarm] tests/format/fprintf.c:21: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_2);
-[eva:invalid-assigns] tests/format/fprintf.c:22: 
-  Completely invalid destination for assigns clause *stream. Ignoring.
-[eva:alarm] tests/format/fprintf.c:22: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_3);
-[kernel:annot:missing-spec] tests/format/fprintf.c:27: Warning: 
-  Neither code nor specification for function __e_acsl_builtin_dprintf, generating default assigns from the prototype
-[eva:alarm] tests/format/fprintf.c:27: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_4);
-[eva:alarm] tests/format/fprintf.c:28: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_5);
-[kernel:annot:missing-spec] tests/format/fprintf.c:34: Warning: 
-  Neither code nor specification for function __e_acsl_builtin_sprintf, generating default assigns from the prototype
-[eva:alarm] tests/format/fprintf.c:34: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_6);
-[eva:alarm] tests/format/fprintf.c:35: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_7);
-[eva:alarm] tests/format/fprintf.c:36: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_8);
-[eva:invalid-assigns] tests/format/fprintf.c:37: 
-  Completely invalid destination for assigns clause *(str + (0 ..)). Ignoring.
-[eva:alarm] tests/format/fprintf.c:37: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_9);
-[eva:invalid-assigns] tests/format/fprintf.c:38: 
-  Completely invalid destination for assigns clause *(str + (0 ..)). Ignoring.
-[eva:alarm] tests/format/fprintf.c:38: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_10);
-[kernel:annot:missing-spec] tests/format/fprintf.c:41: Warning: 
-  Neither code nor specification for function __e_acsl_builtin_snprintf, generating default assigns from the prototype
-[eva:alarm] tests/format/fprintf.c:41: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_11);
-[eva:alarm] tests/format/fprintf.c:42: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_12);
-[eva:invalid-assigns] tests/format/fprintf.c:43: 
-  Completely invalid destination for assigns clause *(str + (0 ..)). Ignoring.
-[eva:alarm] tests/format/fprintf.c:43: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_13);
-[eva:alarm] tests/format/fprintf.c:44: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_14);
-[eva:invalid-assigns] tests/format/fprintf.c:45: 
-  Completely invalid destination for assigns clause *(str + (0 ..)). Ignoring.
-[eva:alarm] tests/format/fprintf.c:45: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_15);
-[eva:invalid-assigns] tests/format/fprintf.c:46: 
-  Completely invalid destination for assigns clause *(str + (0 ..)). Ignoring.
-[eva:alarm] tests/format/fprintf.c:46: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_16);
diff --git a/src/plugins/e-acsl/tests/format/oracle_ci/gen_fprintf.c b/src/plugins/e-acsl/tests/format/oracle_ci/gen_fprintf.c
index c93c673e181c678d2b5003c6087e2b55dbe56f3a..4df6d3c070c6019f667faceb9916a9efb8740000 100644
--- a/src/plugins/e-acsl/tests/format/oracle_ci/gen_fprintf.c
+++ b/src/plugins/e-acsl/tests/format/oracle_ci/gen_fprintf.c
@@ -1,5 +1,6 @@
 /* Generated by Frama-C */
 #include "signal.h"
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 #include "sys/select.h"
@@ -136,21 +137,27 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options)
 {
   int *__gen_e_acsl_at_2;
   int *__gen_e_acsl_at;
+  __e_acsl_contract_t *__gen_e_acsl_contract;
   pid_t __retres;
   {
-    int __gen_e_acsl_implies;
+    int __gen_e_acsl_assumes_value;
     __e_acsl_store_block((void *)(& stat_loc),(size_t)8);
-    if (! (stat_loc != (int *)0)) __gen_e_acsl_implies = 1;
-    else {
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                           stat_loc == (int *)0);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,
+                                           stat_loc != (int *)0);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value) {
       int __gen_e_acsl_valid;
       __gen_e_acsl_valid = __e_acsl_valid((void *)stat_loc,sizeof(int),
                                           (void *)stat_loc,
                                           (void *)(& stat_loc));
-      __gen_e_acsl_implies = __gen_e_acsl_valid;
+      __e_acsl_assert(__gen_e_acsl_valid,"Precondition","waitpid",
+                      "stat_loc_non_null: \\valid(stat_loc)",
+                      "FRAMAC_SHARE/libc/sys/wait.h",92);
     }
-    __e_acsl_assert(__gen_e_acsl_implies,"Precondition","waitpid",
-                    "stat_loc != \\null ==> \\valid(stat_loc)",
-                    "FRAMAC_SHARE/libc/sys/wait.h",92);
   }
   __gen_e_acsl_at_2 = stat_loc;
   __gen_e_acsl_at = stat_loc;
@@ -158,7 +165,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options)
   {
     int __gen_e_acsl_or;
     int __gen_e_acsl_and;
-    int __gen_e_acsl_implies_2;
+    int __gen_e_acsl_implies;
     if (__retres == -1) __gen_e_acsl_or = 1;
     else __gen_e_acsl_or = __retres >= 0;
     __e_acsl_assert(__gen_e_acsl_or,"Postcondition","waitpid",
@@ -166,16 +173,17 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options)
                     "FRAMAC_SHARE/libc/sys/wait.h",84);
     if (__retres >= 0) __gen_e_acsl_and = __gen_e_acsl_at != (int *)0;
     else __gen_e_acsl_and = 0;
-    if (! __gen_e_acsl_and) __gen_e_acsl_implies_2 = 1;
+    if (! __gen_e_acsl_and) __gen_e_acsl_implies = 1;
     else {
       int __gen_e_acsl_initialized;
       __gen_e_acsl_initialized = __e_acsl_initialized((void *)__gen_e_acsl_at_2,
                                                       sizeof(int));
-      __gen_e_acsl_implies_2 = __gen_e_acsl_initialized;
+      __gen_e_acsl_implies = __gen_e_acsl_initialized;
     }
-    __e_acsl_assert(__gen_e_acsl_implies_2,"Postcondition","waitpid",
+    __e_acsl_assert(__gen_e_acsl_implies,"Postcondition","waitpid",
                     "\\result >= 0 && \\old(stat_loc) != \\null ==> \\initialized(\\old(stat_loc))",
                     "FRAMAC_SHARE/libc/sys/wait.h",86);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
     __e_acsl_delete_block((void *)(& stat_loc));
     return __retres;
   }
@@ -418,7 +426,6 @@ int main(int argc, char const **argv)
       int process_status;
       __e_acsl_store_block((void *)(& process_status),(size_t)4);
       __gen_e_acsl_waitpid(pid,& process_status,0);
-      /*@ assert Eva: initialization: \initialized(&process_status); */
       signal_eval(process_status,0,__gen_e_acsl_literal_string_8);
       __e_acsl_delete_block((void *)(& process_status));
     }
@@ -433,7 +440,6 @@ int main(int argc, char const **argv)
       int process_status_0;
       __e_acsl_store_block((void *)(& process_status_0),(size_t)4);
       __gen_e_acsl_waitpid(pid_0,& process_status_0,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_0); */
       signal_eval(process_status_0,1,__gen_e_acsl_literal_string_9);
       __e_acsl_delete_block((void *)(& process_status_0));
     }
@@ -453,7 +459,6 @@ int main(int argc, char const **argv)
         int process_status_1;
         __e_acsl_store_block((void *)(& process_status_1),(size_t)4);
         __gen_e_acsl_waitpid(pid_1,& process_status_1,0);
-        /*@ assert Eva: initialization: \initialized(&process_status_1); */
         signal_eval(process_status_1,0,__gen_e_acsl_literal_string_12);
         __e_acsl_delete_block((void *)(& process_status_1));
       }
@@ -470,7 +475,6 @@ int main(int argc, char const **argv)
         int process_status_2;
         __e_acsl_store_block((void *)(& process_status_2),(size_t)4);
         __gen_e_acsl_waitpid(pid_2,& process_status_2,0);
-        /*@ assert Eva: initialization: \initialized(&process_status_2); */
         signal_eval(process_status_2,1,__gen_e_acsl_literal_string_13);
         __e_acsl_delete_block((void *)(& process_status_2));
       }
@@ -487,7 +491,6 @@ int main(int argc, char const **argv)
         int process_status_3;
         __e_acsl_store_block((void *)(& process_status_3),(size_t)4);
         __gen_e_acsl_waitpid(pid_3,& process_status_3,0);
-        /*@ assert Eva: initialization: \initialized(&process_status_3); */
         signal_eval(process_status_3,1,__gen_e_acsl_literal_string_14);
         __e_acsl_delete_block((void *)(& process_status_3));
       }
@@ -503,7 +506,6 @@ int main(int argc, char const **argv)
       int process_status_4;
       __e_acsl_store_block((void *)(& process_status_4),(size_t)4);
       __gen_e_acsl_waitpid(pid_4,& process_status_4,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_4); */
       signal_eval(process_status_4,0,__gen_e_acsl_literal_string_15);
       __e_acsl_delete_block((void *)(& process_status_4));
     }
@@ -518,7 +520,6 @@ int main(int argc, char const **argv)
       int process_status_5;
       __e_acsl_store_block((void *)(& process_status_5),(size_t)4);
       __gen_e_acsl_waitpid(pid_5,& process_status_5,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_5); */
       signal_eval(process_status_5,1,__gen_e_acsl_literal_string_16);
       __e_acsl_delete_block((void *)(& process_status_5));
     }
@@ -534,7 +535,6 @@ int main(int argc, char const **argv)
       int process_status_6;
       __e_acsl_store_block((void *)(& process_status_6),(size_t)4);
       __gen_e_acsl_waitpid(pid_6,& process_status_6,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_6); */
       signal_eval(process_status_6,0,__gen_e_acsl_literal_string_19);
       __e_acsl_delete_block((void *)(& process_status_6));
     }
@@ -550,7 +550,6 @@ int main(int argc, char const **argv)
       int process_status_7;
       __e_acsl_store_block((void *)(& process_status_7),(size_t)4);
       __gen_e_acsl_waitpid(pid_7,& process_status_7,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_7); */
       signal_eval(process_status_7,0,__gen_e_acsl_literal_string_21);
       __e_acsl_delete_block((void *)(& process_status_7));
     }
@@ -566,7 +565,6 @@ int main(int argc, char const **argv)
       int process_status_8;
       __e_acsl_store_block((void *)(& process_status_8),(size_t)4);
       __gen_e_acsl_waitpid(pid_8,& process_status_8,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_8); */
       signal_eval(process_status_8,1,__gen_e_acsl_literal_string_23);
       __e_acsl_delete_block((void *)(& process_status_8));
     }
@@ -582,7 +580,6 @@ int main(int argc, char const **argv)
       int process_status_9;
       __e_acsl_store_block((void *)(& process_status_9),(size_t)4);
       __gen_e_acsl_waitpid(pid_9,& process_status_9,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_9); */
       signal_eval(process_status_9,1,__gen_e_acsl_literal_string_24);
       __e_acsl_delete_block((void *)(& process_status_9));
     }
@@ -598,7 +595,6 @@ int main(int argc, char const **argv)
       int process_status_10;
       __e_acsl_store_block((void *)(& process_status_10),(size_t)4);
       __gen_e_acsl_waitpid(pid_10,& process_status_10,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_10); */
       signal_eval(process_status_10,1,__gen_e_acsl_literal_string_25);
       __e_acsl_delete_block((void *)(& process_status_10));
     }
@@ -615,7 +611,6 @@ int main(int argc, char const **argv)
       int process_status_11;
       __e_acsl_store_block((void *)(& process_status_11),(size_t)4);
       __gen_e_acsl_waitpid(pid_11,& process_status_11,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_11); */
       signal_eval(process_status_11,0,__gen_e_acsl_literal_string_26);
       __e_acsl_delete_block((void *)(& process_status_11));
     }
@@ -632,7 +627,6 @@ int main(int argc, char const **argv)
       int process_status_12;
       __e_acsl_store_block((void *)(& process_status_12),(size_t)4);
       __gen_e_acsl_waitpid(pid_12,& process_status_12,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_12); */
       signal_eval(process_status_12,0,__gen_e_acsl_literal_string_27);
       __e_acsl_delete_block((void *)(& process_status_12));
     }
@@ -649,7 +643,6 @@ int main(int argc, char const **argv)
       int process_status_13;
       __e_acsl_store_block((void *)(& process_status_13),(size_t)4);
       __gen_e_acsl_waitpid(pid_13,& process_status_13,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_13); */
       signal_eval(process_status_13,1,__gen_e_acsl_literal_string_28);
       __e_acsl_delete_block((void *)(& process_status_13));
     }
@@ -666,7 +659,6 @@ int main(int argc, char const **argv)
       int process_status_14;
       __e_acsl_store_block((void *)(& process_status_14),(size_t)4);
       __gen_e_acsl_waitpid(pid_14,& process_status_14,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_14); */
       signal_eval(process_status_14,1,__gen_e_acsl_literal_string_29);
       __e_acsl_delete_block((void *)(& process_status_14));
     }
@@ -683,7 +675,6 @@ int main(int argc, char const **argv)
       int process_status_15;
       __e_acsl_store_block((void *)(& process_status_15),(size_t)4);
       __gen_e_acsl_waitpid(pid_15,& process_status_15,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_15); */
       signal_eval(process_status_15,1,__gen_e_acsl_literal_string_30);
       __e_acsl_delete_block((void *)(& process_status_15));
     }
@@ -700,7 +691,6 @@ int main(int argc, char const **argv)
       int process_status_16;
       __e_acsl_store_block((void *)(& process_status_16),(size_t)4);
       __gen_e_acsl_waitpid(pid_16,& process_status_16,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_16); */
       signal_eval(process_status_16,0,__gen_e_acsl_literal_string_31);
       __e_acsl_delete_block((void *)(& process_status_16));
     }
diff --git a/src/plugins/e-acsl/tests/format/oracle_ci/gen_printf.c b/src/plugins/e-acsl/tests/format/oracle_ci/gen_printf.c
index e5b082351a5170c1e916b87a198f257a9341d039..86a8665ee99080f618094bcf2f7a7024b80ca31f 100644
--- a/src/plugins/e-acsl/tests/format/oracle_ci/gen_printf.c
+++ b/src/plugins/e-acsl/tests/format/oracle_ci/gen_printf.c
@@ -552,9 +552,6 @@ void test_specifier_application(char const *allowed, char const *fmt,
                 int process_status;
                 __e_acsl_store_block((void *)(& process_status),(size_t)4);
                 __gen_e_acsl_waitpid(pid,& process_status,0);
-                /*@ assert
-                    Eva: initialization: \initialized(&process_status);
-                */
                 signal_eval(process_status,0,(char const *)at);
                 __e_acsl_delete_block((void *)(& process_status));
               }
@@ -572,9 +569,6 @@ void test_specifier_application(char const *allowed, char const *fmt,
               int process_status_0;
               __e_acsl_store_block((void *)(& process_status_0),(size_t)4);
               __gen_e_acsl_waitpid(pid_0,& process_status_0,0);
-              /*@ assert
-                  Eva: initialization: \initialized(&process_status_0);
-              */
               signal_eval(process_status_0,1,(char const *)at);
               __e_acsl_delete_block((void *)(& process_status_0));
             }
@@ -614,21 +608,27 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options)
 {
   int *__gen_e_acsl_at_2;
   int *__gen_e_acsl_at;
+  __e_acsl_contract_t *__gen_e_acsl_contract;
   pid_t __retres;
   {
-    int __gen_e_acsl_implies;
+    int __gen_e_acsl_assumes_value;
     __e_acsl_store_block((void *)(& stat_loc),(size_t)8);
-    if (! (stat_loc != (int *)0)) __gen_e_acsl_implies = 1;
-    else {
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                           stat_loc == (int *)0);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,
+                                           stat_loc != (int *)0);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value) {
       int __gen_e_acsl_valid;
       __gen_e_acsl_valid = __e_acsl_valid((void *)stat_loc,sizeof(int),
                                           (void *)stat_loc,
                                           (void *)(& stat_loc));
-      __gen_e_acsl_implies = __gen_e_acsl_valid;
+      __e_acsl_assert(__gen_e_acsl_valid,"Precondition","waitpid",
+                      "stat_loc_non_null: \\valid(stat_loc)",
+                      "FRAMAC_SHARE/libc/sys/wait.h",92);
     }
-    __e_acsl_assert(__gen_e_acsl_implies,"Precondition","waitpid",
-                    "stat_loc != \\null ==> \\valid(stat_loc)",
-                    "FRAMAC_SHARE/libc/sys/wait.h",92);
   }
   __gen_e_acsl_at_2 = stat_loc;
   __gen_e_acsl_at = stat_loc;
@@ -636,7 +636,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options)
   {
     int __gen_e_acsl_or;
     int __gen_e_acsl_and;
-    int __gen_e_acsl_implies_2;
+    int __gen_e_acsl_implies;
     if (__retres == -1) __gen_e_acsl_or = 1;
     else __gen_e_acsl_or = __retres >= 0;
     __e_acsl_assert(__gen_e_acsl_or,"Postcondition","waitpid",
@@ -644,16 +644,17 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options)
                     "FRAMAC_SHARE/libc/sys/wait.h",84);
     if (__retres >= 0) __gen_e_acsl_and = __gen_e_acsl_at != (int *)0;
     else __gen_e_acsl_and = 0;
-    if (! __gen_e_acsl_and) __gen_e_acsl_implies_2 = 1;
+    if (! __gen_e_acsl_and) __gen_e_acsl_implies = 1;
     else {
       int __gen_e_acsl_initialized;
       __gen_e_acsl_initialized = __e_acsl_initialized((void *)__gen_e_acsl_at_2,
                                                       sizeof(int));
-      __gen_e_acsl_implies_2 = __gen_e_acsl_initialized;
+      __gen_e_acsl_implies = __gen_e_acsl_initialized;
     }
-    __e_acsl_assert(__gen_e_acsl_implies_2,"Postcondition","waitpid",
+    __e_acsl_assert(__gen_e_acsl_implies,"Postcondition","waitpid",
                     "\\result >= 0 && \\old(stat_loc) != \\null ==> \\initialized(\\old(stat_loc))",
                     "FRAMAC_SHARE/libc/sys/wait.h",86);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
     __e_acsl_delete_block((void *)(& stat_loc));
     return __retres;
   }
@@ -735,25 +736,77 @@ char *__gen_e_acsl_strcpy(char * __restrict dest, char const * __restrict src)
  */
 char *__gen_e_acsl_strchr(char const *s, int c)
 {
-  char const *__gen_e_acsl_at;
+  char const *__gen_e_acsl_at_3;
+  char const *__gen_e_acsl_at_2;
+  int __gen_e_acsl_at;
+  __e_acsl_contract_t *__gen_e_acsl_contract;
   char *__retres;
   __e_acsl_store_block((void *)(& __retres),(size_t)8);
   __e_acsl_store_block((void *)(& s),(size_t)8);
-  __gen_e_acsl_at = s;
+  __gen_e_acsl_contract = __e_acsl_contract_init((size_t)3);
+  __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)2,1);
+  __gen_e_acsl_at_3 = s;
+  __gen_e_acsl_at_2 = s;
+  __gen_e_acsl_at = c;
   __retres = strchr(s,c);
   {
-    int __gen_e_acsl_or;
-    if (__retres == (char *)0) __gen_e_acsl_or = 1;
-    else {
+    int __gen_e_acsl_assumes_value;
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value) {
+      int __gen_e_acsl_initialized;
+      int __gen_e_acsl_and;
       void *__gen_e_acsl_base_addr;
       void *__gen_e_acsl_base_addr_2;
+      __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& __retres),
+                                                      sizeof(char *));
+      if (__gen_e_acsl_initialized) {
+        int __gen_e_acsl_valid_read;
+        __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)__retres,
+                                                      sizeof(char),
+                                                      (void *)__retres,
+                                                      (void *)(& __retres));
+        __gen_e_acsl_and = __gen_e_acsl_valid_read;
+      }
+      else __gen_e_acsl_and = 0;
+      __e_acsl_assert(__gen_e_acsl_and,"RTE","strchr",
+                      "mem_access: \\valid_read(__retres)",
+                      "FRAMAC_SHARE/libc/string.h",161);
       __gen_e_acsl_base_addr = __e_acsl_base_addr((void *)__retres);
-      __gen_e_acsl_base_addr_2 = __e_acsl_base_addr((void *)__gen_e_acsl_at);
-      __gen_e_acsl_or = __gen_e_acsl_base_addr == __gen_e_acsl_base_addr_2;
+      __gen_e_acsl_base_addr_2 = __e_acsl_base_addr((void *)__gen_e_acsl_at_2);
+      __e_acsl_assert(__gen_e_acsl_base_addr == __gen_e_acsl_base_addr_2,
+                      "Postcondition","strchr",
+                      "found: \\base_addr(\\result) == \\base_addr(\\old(s))",
+                      "FRAMAC_SHARE/libc/string.h",162);
+      __e_acsl_assert((int)*__retres == (int)((char)__gen_e_acsl_at),
+                      "Postcondition","strchr",
+                      "found: *\\result == (char)\\old(c)",
+                      "FRAMAC_SHARE/libc/string.h",161);
+    }
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(__retres == (char *)0,
+                                                    "Postcondition","strchr",
+                                                    "not_found: \\result == \\null",
+                                                    "FRAMAC_SHARE/libc/string.h",
+                                                    168);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)2);
+    if (__gen_e_acsl_assumes_value) {
+      int __gen_e_acsl_or;
+      if (__retres == (char *)0) __gen_e_acsl_or = 1;
+      else {
+        void *__gen_e_acsl_base_addr_3;
+        void *__gen_e_acsl_base_addr_4;
+        __gen_e_acsl_base_addr_3 = __e_acsl_base_addr((void *)__retres);
+        __gen_e_acsl_base_addr_4 = __e_acsl_base_addr((void *)__gen_e_acsl_at_3);
+        __gen_e_acsl_or = __gen_e_acsl_base_addr_3 == __gen_e_acsl_base_addr_4;
+      }
+      __e_acsl_assert(__gen_e_acsl_or,"Postcondition","strchr",
+                      "default: \\result == \\null || \\base_addr(\\result) == \\base_addr(\\old(s))",
+                      "FRAMAC_SHARE/libc/string.h",171);
     }
-    __e_acsl_assert(__gen_e_acsl_or,"Postcondition","strchr",
-                    "\\result == \\null || \\base_addr(\\result) == \\base_addr(\\old(s))",
-                    "FRAMAC_SHARE/libc/string.h",171);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
     __e_acsl_delete_block((void *)(& s));
     __e_acsl_delete_block((void *)(& __retres));
     return __retres;
@@ -2486,7 +2539,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& __fc_p_time_tm));
   __e_acsl_delete_block((void *)(& __fc_time_tm));
@@ -2545,7 +2598,6 @@ int main(int argc, char const **argv)
       int process_status;
       __e_acsl_store_block((void *)(& process_status),(size_t)4);
       __gen_e_acsl_waitpid(pid,& process_status,0);
-      /*@ assert Eva: initialization: \initialized(&process_status); */
       signal_eval(process_status,0,__gen_e_acsl_literal_string_12);
       __e_acsl_delete_block((void *)(& process_status));
     }
@@ -2561,7 +2613,6 @@ int main(int argc, char const **argv)
       int process_status_0;
       __e_acsl_store_block((void *)(& process_status_0),(size_t)4);
       __gen_e_acsl_waitpid(pid_0,& process_status_0,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_0); */
       signal_eval(process_status_0,0,__gen_e_acsl_literal_string_14);
       __e_acsl_delete_block((void *)(& process_status_0));
     }
@@ -2577,7 +2628,6 @@ int main(int argc, char const **argv)
       int process_status_1;
       __e_acsl_store_block((void *)(& process_status_1),(size_t)4);
       __gen_e_acsl_waitpid(pid_1,& process_status_1,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_1); */
       signal_eval(process_status_1,1,__gen_e_acsl_literal_string_16);
       __e_acsl_delete_block((void *)(& process_status_1));
     }
@@ -2593,7 +2643,6 @@ int main(int argc, char const **argv)
       int process_status_2;
       __e_acsl_store_block((void *)(& process_status_2),(size_t)4);
       __gen_e_acsl_waitpid(pid_2,& process_status_2,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_2); */
       signal_eval(process_status_2,0,__gen_e_acsl_literal_string_18);
       __e_acsl_delete_block((void *)(& process_status_2));
     }
@@ -2617,7 +2666,6 @@ int main(int argc, char const **argv)
       int process_status_3;
       __e_acsl_store_block((void *)(& process_status_3),(size_t)4);
       __gen_e_acsl_waitpid(pid_3,& process_status_3,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_3); */
       signal_eval(process_status_3,1,__gen_e_acsl_literal_string_19);
       __e_acsl_delete_block((void *)(& process_status_3));
     }
@@ -2632,7 +2680,6 @@ int main(int argc, char const **argv)
       int process_status_4;
       __e_acsl_store_block((void *)(& process_status_4),(size_t)4);
       __gen_e_acsl_waitpid(pid_4,& process_status_4,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_4); */
       signal_eval(process_status_4,0,__gen_e_acsl_literal_string_21);
       __e_acsl_delete_block((void *)(& process_status_4));
     }
@@ -2647,7 +2694,6 @@ int main(int argc, char const **argv)
       int process_status_5;
       __e_acsl_store_block((void *)(& process_status_5),(size_t)4);
       __gen_e_acsl_waitpid(pid_5,& process_status_5,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_5); */
       signal_eval(process_status_5,1,__gen_e_acsl_literal_string_23);
       __e_acsl_delete_block((void *)(& process_status_5));
     }
@@ -2662,7 +2708,6 @@ int main(int argc, char const **argv)
       int process_status_6;
       __e_acsl_store_block((void *)(& process_status_6),(size_t)4);
       __gen_e_acsl_waitpid(pid_6,& process_status_6,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_6); */
       signal_eval(process_status_6,1,__gen_e_acsl_literal_string_25);
       __e_acsl_delete_block((void *)(& process_status_6));
     }
@@ -2677,7 +2722,6 @@ int main(int argc, char const **argv)
       int process_status_7;
       __e_acsl_store_block((void *)(& process_status_7),(size_t)4);
       __gen_e_acsl_waitpid(pid_7,& process_status_7,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_7); */
       signal_eval(process_status_7,1,__gen_e_acsl_literal_string_27);
       __e_acsl_delete_block((void *)(& process_status_7));
     }
@@ -2692,7 +2736,6 @@ int main(int argc, char const **argv)
       int process_status_8;
       __e_acsl_store_block((void *)(& process_status_8),(size_t)4);
       __gen_e_acsl_waitpid(pid_8,& process_status_8,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_8); */
       signal_eval(process_status_8,0,__gen_e_acsl_literal_string_29);
       __e_acsl_delete_block((void *)(& process_status_8));
     }
@@ -2716,7 +2759,6 @@ int main(int argc, char const **argv)
       int process_status_9;
       __e_acsl_store_block((void *)(& process_status_9),(size_t)4);
       __gen_e_acsl_waitpid(pid_9,& process_status_9,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_9); */
       signal_eval(process_status_9,0,__gen_e_acsl_literal_string_40);
       __e_acsl_delete_block((void *)(& process_status_9));
     }
@@ -2731,7 +2773,6 @@ int main(int argc, char const **argv)
       int process_status_10;
       __e_acsl_store_block((void *)(& process_status_10),(size_t)4);
       __gen_e_acsl_waitpid(pid_10,& process_status_10,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_10); */
       signal_eval(process_status_10,0,__gen_e_acsl_literal_string_42);
       __e_acsl_delete_block((void *)(& process_status_10));
     }
@@ -2746,7 +2787,6 @@ int main(int argc, char const **argv)
       int process_status_11;
       __e_acsl_store_block((void *)(& process_status_11),(size_t)4);
       __gen_e_acsl_waitpid(pid_11,& process_status_11,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_11); */
       signal_eval(process_status_11,1,__gen_e_acsl_literal_string_44);
       __e_acsl_delete_block((void *)(& process_status_11));
     }
@@ -2764,7 +2804,6 @@ int main(int argc, char const **argv)
       int process_status_12;
       __e_acsl_store_block((void *)(& process_status_12),(size_t)4);
       __gen_e_acsl_waitpid(pid_12,& process_status_12,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_12); */
       signal_eval(process_status_12,0,__gen_e_acsl_literal_string_49);
       __e_acsl_delete_block((void *)(& process_status_12));
     }
@@ -2779,7 +2818,6 @@ int main(int argc, char const **argv)
       int process_status_13;
       __e_acsl_store_block((void *)(& process_status_13),(size_t)4);
       __gen_e_acsl_waitpid(pid_13,& process_status_13,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_13); */
       signal_eval(process_status_13,0,__gen_e_acsl_literal_string_49);
       __e_acsl_delete_block((void *)(& process_status_13));
     }
@@ -2794,7 +2832,6 @@ int main(int argc, char const **argv)
       int process_status_14;
       __e_acsl_store_block((void *)(& process_status_14),(size_t)4);
       __gen_e_acsl_waitpid(pid_14,& process_status_14,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_14); */
       signal_eval(process_status_14,0,__gen_e_acsl_literal_string_52);
       __e_acsl_delete_block((void *)(& process_status_14));
     }
@@ -2809,7 +2846,6 @@ int main(int argc, char const **argv)
       int process_status_15;
       __e_acsl_store_block((void *)(& process_status_15),(size_t)4);
       __gen_e_acsl_waitpid(pid_15,& process_status_15,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_15); */
       signal_eval(process_status_15,0,__gen_e_acsl_literal_string_52);
       __e_acsl_delete_block((void *)(& process_status_15));
     }
@@ -2824,7 +2860,6 @@ int main(int argc, char const **argv)
       int process_status_16;
       __e_acsl_store_block((void *)(& process_status_16),(size_t)4);
       __gen_e_acsl_waitpid(pid_16,& process_status_16,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_16); */
       signal_eval(process_status_16,0,__gen_e_acsl_literal_string_55);
       __e_acsl_delete_block((void *)(& process_status_16));
     }
@@ -2839,7 +2874,6 @@ int main(int argc, char const **argv)
       int process_status_17;
       __e_acsl_store_block((void *)(& process_status_17),(size_t)4);
       __gen_e_acsl_waitpid(pid_17,& process_status_17,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_17); */
       signal_eval(process_status_17,0,__gen_e_acsl_literal_string_55);
       __e_acsl_delete_block((void *)(& process_status_17));
     }
@@ -2854,7 +2888,6 @@ int main(int argc, char const **argv)
       int process_status_18;
       __e_acsl_store_block((void *)(& process_status_18),(size_t)4);
       __gen_e_acsl_waitpid(pid_18,& process_status_18,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_18); */
       signal_eval(process_status_18,0,__gen_e_acsl_literal_string_55);
       __e_acsl_delete_block((void *)(& process_status_18));
     }
@@ -2872,7 +2905,6 @@ int main(int argc, char const **argv)
       int process_status_19;
       __e_acsl_store_block((void *)(& process_status_19),(size_t)4);
       __gen_e_acsl_waitpid(pid_19,& process_status_19,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_19); */
       signal_eval(process_status_19,0,__gen_e_acsl_literal_string_60);
       __e_acsl_delete_block((void *)(& process_status_19));
     }
@@ -2887,7 +2919,6 @@ int main(int argc, char const **argv)
       int process_status_20;
       __e_acsl_store_block((void *)(& process_status_20),(size_t)4);
       __gen_e_acsl_waitpid(pid_20,& process_status_20,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_20); */
       signal_eval(process_status_20,0,__gen_e_acsl_literal_string_60);
       __e_acsl_delete_block((void *)(& process_status_20));
     }
@@ -2902,7 +2933,6 @@ int main(int argc, char const **argv)
       int process_status_21;
       __e_acsl_store_block((void *)(& process_status_21),(size_t)4);
       __gen_e_acsl_waitpid(pid_21,& process_status_21,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_21); */
       signal_eval(process_status_21,0,__gen_e_acsl_literal_string_63);
       __e_acsl_delete_block((void *)(& process_status_21));
     }
@@ -2917,7 +2947,6 @@ int main(int argc, char const **argv)
       int process_status_22;
       __e_acsl_store_block((void *)(& process_status_22),(size_t)4);
       __gen_e_acsl_waitpid(pid_22,& process_status_22,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_22); */
       signal_eval(process_status_22,0,__gen_e_acsl_literal_string_63);
       __e_acsl_delete_block((void *)(& process_status_22));
     }
@@ -2932,7 +2961,6 @@ int main(int argc, char const **argv)
       int process_status_23;
       __e_acsl_store_block((void *)(& process_status_23),(size_t)4);
       __gen_e_acsl_waitpid(pid_23,& process_status_23,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_23); */
       signal_eval(process_status_23,0,__gen_e_acsl_literal_string_66);
       __e_acsl_delete_block((void *)(& process_status_23));
     }
@@ -2947,7 +2975,6 @@ int main(int argc, char const **argv)
       int process_status_24;
       __e_acsl_store_block((void *)(& process_status_24),(size_t)4);
       __gen_e_acsl_waitpid(pid_24,& process_status_24,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_24); */
       signal_eval(process_status_24,0,__gen_e_acsl_literal_string_66);
       __e_acsl_delete_block((void *)(& process_status_24));
     }
@@ -2962,7 +2989,6 @@ int main(int argc, char const **argv)
       int process_status_25;
       __e_acsl_store_block((void *)(& process_status_25),(size_t)4);
       __gen_e_acsl_waitpid(pid_25,& process_status_25,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_25); */
       signal_eval(process_status_25,0,__gen_e_acsl_literal_string_66);
       __e_acsl_delete_block((void *)(& process_status_25));
     }
@@ -2980,7 +3006,6 @@ int main(int argc, char const **argv)
       int process_status_26;
       __e_acsl_store_block((void *)(& process_status_26),(size_t)4);
       __gen_e_acsl_waitpid(pid_26,& process_status_26,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_26); */
       signal_eval(process_status_26,0,__gen_e_acsl_literal_string_72);
       __e_acsl_delete_block((void *)(& process_status_26));
     }
@@ -2995,7 +3020,6 @@ int main(int argc, char const **argv)
       int process_status_27;
       __e_acsl_store_block((void *)(& process_status_27),(size_t)4);
       __gen_e_acsl_waitpid(pid_27,& process_status_27,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_27); */
       signal_eval(process_status_27,0,__gen_e_acsl_literal_string_72);
       __e_acsl_delete_block((void *)(& process_status_27));
     }
@@ -3010,7 +3034,6 @@ int main(int argc, char const **argv)
       int process_status_28;
       __e_acsl_store_block((void *)(& process_status_28),(size_t)4);
       __gen_e_acsl_waitpid(pid_28,& process_status_28,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_28); */
       signal_eval(process_status_28,0,__gen_e_acsl_literal_string_75);
       __e_acsl_delete_block((void *)(& process_status_28));
     }
@@ -3025,7 +3048,6 @@ int main(int argc, char const **argv)
       int process_status_29;
       __e_acsl_store_block((void *)(& process_status_29),(size_t)4);
       __gen_e_acsl_waitpid(pid_29,& process_status_29,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_29); */
       signal_eval(process_status_29,0,__gen_e_acsl_literal_string_75);
       __e_acsl_delete_block((void *)(& process_status_29));
     }
@@ -3040,7 +3062,6 @@ int main(int argc, char const **argv)
       int process_status_30;
       __e_acsl_store_block((void *)(& process_status_30),(size_t)4);
       __gen_e_acsl_waitpid(pid_30,& process_status_30,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_30); */
       signal_eval(process_status_30,0,__gen_e_acsl_literal_string_78);
       __e_acsl_delete_block((void *)(& process_status_30));
     }
@@ -3055,7 +3076,6 @@ int main(int argc, char const **argv)
       int process_status_31;
       __e_acsl_store_block((void *)(& process_status_31),(size_t)4);
       __gen_e_acsl_waitpid(pid_31,& process_status_31,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_31); */
       signal_eval(process_status_31,0,__gen_e_acsl_literal_string_78);
       __e_acsl_delete_block((void *)(& process_status_31));
     }
@@ -3070,7 +3090,6 @@ int main(int argc, char const **argv)
       int process_status_32;
       __e_acsl_store_block((void *)(& process_status_32),(size_t)4);
       __gen_e_acsl_waitpid(pid_32,& process_status_32,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_32); */
       signal_eval(process_status_32,0,__gen_e_acsl_literal_string_80);
       __e_acsl_delete_block((void *)(& process_status_32));
     }
@@ -3085,7 +3104,6 @@ int main(int argc, char const **argv)
       int process_status_33;
       __e_acsl_store_block((void *)(& process_status_33),(size_t)4);
       __gen_e_acsl_waitpid(pid_33,& process_status_33,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_33); */
       signal_eval(process_status_33,0,__gen_e_acsl_literal_string_80);
       __e_acsl_delete_block((void *)(& process_status_33));
     }
@@ -3100,7 +3118,6 @@ int main(int argc, char const **argv)
       int process_status_34;
       __e_acsl_store_block((void *)(& process_status_34),(size_t)4);
       __gen_e_acsl_waitpid(pid_34,& process_status_34,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_34); */
       signal_eval(process_status_34,0,__gen_e_acsl_literal_string_83);
       __e_acsl_delete_block((void *)(& process_status_34));
     }
@@ -3115,7 +3132,6 @@ int main(int argc, char const **argv)
       int process_status_35;
       __e_acsl_store_block((void *)(& process_status_35),(size_t)4);
       __gen_e_acsl_waitpid(pid_35,& process_status_35,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_35); */
       signal_eval(process_status_35,0,__gen_e_acsl_literal_string_83);
       __e_acsl_delete_block((void *)(& process_status_35));
     }
@@ -3130,7 +3146,6 @@ int main(int argc, char const **argv)
       int process_status_36;
       __e_acsl_store_block((void *)(& process_status_36),(size_t)4);
       __gen_e_acsl_waitpid(pid_36,& process_status_36,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_36); */
       signal_eval(process_status_36,0,__gen_e_acsl_literal_string_86);
       __e_acsl_delete_block((void *)(& process_status_36));
     }
@@ -3145,7 +3160,6 @@ int main(int argc, char const **argv)
       int process_status_37;
       __e_acsl_store_block((void *)(& process_status_37),(size_t)4);
       __gen_e_acsl_waitpid(pid_37,& process_status_37,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_37); */
       signal_eval(process_status_37,0,__gen_e_acsl_literal_string_86);
       __e_acsl_delete_block((void *)(& process_status_37));
     }
@@ -3160,7 +3174,6 @@ int main(int argc, char const **argv)
       int process_status_38;
       __e_acsl_store_block((void *)(& process_status_38),(size_t)4);
       __gen_e_acsl_waitpid(pid_38,& process_status_38,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_38); */
       signal_eval(process_status_38,0,__gen_e_acsl_literal_string_89);
       __e_acsl_delete_block((void *)(& process_status_38));
     }
@@ -3175,7 +3188,6 @@ int main(int argc, char const **argv)
       int process_status_39;
       __e_acsl_store_block((void *)(& process_status_39),(size_t)4);
       __gen_e_acsl_waitpid(pid_39,& process_status_39,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_39); */
       signal_eval(process_status_39,0,__gen_e_acsl_literal_string_89);
       __e_acsl_delete_block((void *)(& process_status_39));
     }
@@ -3190,7 +3202,6 @@ int main(int argc, char const **argv)
       int process_status_40;
       __e_acsl_store_block((void *)(& process_status_40),(size_t)4);
       __gen_e_acsl_waitpid(pid_40,& process_status_40,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_40); */
       signal_eval(process_status_40,0,__gen_e_acsl_literal_string_92);
       __e_acsl_delete_block((void *)(& process_status_40));
     }
@@ -3205,7 +3216,6 @@ int main(int argc, char const **argv)
       int process_status_41;
       __e_acsl_store_block((void *)(& process_status_41),(size_t)4);
       __gen_e_acsl_waitpid(pid_41,& process_status_41,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_41); */
       signal_eval(process_status_41,0,__gen_e_acsl_literal_string_94);
       __e_acsl_delete_block((void *)(& process_status_41));
     }
@@ -3220,7 +3230,6 @@ int main(int argc, char const **argv)
       int process_status_42;
       __e_acsl_store_block((void *)(& process_status_42),(size_t)4);
       __gen_e_acsl_waitpid(pid_42,& process_status_42,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_42); */
       signal_eval(process_status_42,0,__gen_e_acsl_literal_string_96);
       __e_acsl_delete_block((void *)(& process_status_42));
     }
@@ -3235,7 +3244,6 @@ int main(int argc, char const **argv)
       int process_status_43;
       __e_acsl_store_block((void *)(& process_status_43),(size_t)4);
       __gen_e_acsl_waitpid(pid_43,& process_status_43,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_43); */
       signal_eval(process_status_43,0,__gen_e_acsl_literal_string_96);
       __e_acsl_delete_block((void *)(& process_status_43));
     }
@@ -3250,7 +3258,6 @@ int main(int argc, char const **argv)
       int process_status_44;
       __e_acsl_store_block((void *)(& process_status_44),(size_t)4);
       __gen_e_acsl_waitpid(pid_44,& process_status_44,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_44); */
       signal_eval(process_status_44,0,__gen_e_acsl_literal_string_99);
       __e_acsl_delete_block((void *)(& process_status_44));
     }
@@ -3265,7 +3272,6 @@ int main(int argc, char const **argv)
       int process_status_45;
       __e_acsl_store_block((void *)(& process_status_45),(size_t)4);
       __gen_e_acsl_waitpid(pid_45,& process_status_45,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_45); */
       signal_eval(process_status_45,0,__gen_e_acsl_literal_string_99);
       __e_acsl_delete_block((void *)(& process_status_45));
     }
@@ -3280,7 +3286,6 @@ int main(int argc, char const **argv)
       int process_status_46;
       __e_acsl_store_block((void *)(& process_status_46),(size_t)4);
       __gen_e_acsl_waitpid(pid_46,& process_status_46,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_46); */
       signal_eval(process_status_46,0,__gen_e_acsl_literal_string_102);
       __e_acsl_delete_block((void *)(& process_status_46));
     }
@@ -3295,7 +3300,6 @@ int main(int argc, char const **argv)
       int process_status_47;
       __e_acsl_store_block((void *)(& process_status_47),(size_t)4);
       __gen_e_acsl_waitpid(pid_47,& process_status_47,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_47); */
       signal_eval(process_status_47,0,__gen_e_acsl_literal_string_102);
       __e_acsl_delete_block((void *)(& process_status_47));
     }
@@ -3310,7 +3314,6 @@ int main(int argc, char const **argv)
       int process_status_48;
       __e_acsl_store_block((void *)(& process_status_48),(size_t)4);
       __gen_e_acsl_waitpid(pid_48,& process_status_48,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_48); */
       signal_eval(process_status_48,0,__gen_e_acsl_literal_string_102);
       __e_acsl_delete_block((void *)(& process_status_48));
     }
@@ -3328,7 +3331,6 @@ int main(int argc, char const **argv)
       int process_status_49;
       __e_acsl_store_block((void *)(& process_status_49),(size_t)4);
       __gen_e_acsl_waitpid(pid_49,& process_status_49,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_49); */
       signal_eval(process_status_49,0,__gen_e_acsl_literal_string_108);
       __e_acsl_delete_block((void *)(& process_status_49));
     }
@@ -3343,7 +3345,6 @@ int main(int argc, char const **argv)
       int process_status_50;
       __e_acsl_store_block((void *)(& process_status_50),(size_t)4);
       __gen_e_acsl_waitpid(pid_50,& process_status_50,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_50); */
       signal_eval(process_status_50,0,__gen_e_acsl_literal_string_108);
       __e_acsl_delete_block((void *)(& process_status_50));
     }
@@ -3358,7 +3359,6 @@ int main(int argc, char const **argv)
       int process_status_51;
       __e_acsl_store_block((void *)(& process_status_51),(size_t)4);
       __gen_e_acsl_waitpid(pid_51,& process_status_51,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_51); */
       signal_eval(process_status_51,0,__gen_e_acsl_literal_string_111);
       __e_acsl_delete_block((void *)(& process_status_51));
     }
@@ -3373,7 +3373,6 @@ int main(int argc, char const **argv)
       int process_status_52;
       __e_acsl_store_block((void *)(& process_status_52),(size_t)4);
       __gen_e_acsl_waitpid(pid_52,& process_status_52,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_52); */
       signal_eval(process_status_52,0,__gen_e_acsl_literal_string_111);
       __e_acsl_delete_block((void *)(& process_status_52));
     }
@@ -3388,7 +3387,6 @@ int main(int argc, char const **argv)
       int process_status_53;
       __e_acsl_store_block((void *)(& process_status_53),(size_t)4);
       __gen_e_acsl_waitpid(pid_53,& process_status_53,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_53); */
       signal_eval(process_status_53,0,__gen_e_acsl_literal_string_114);
       __e_acsl_delete_block((void *)(& process_status_53));
     }
@@ -3403,7 +3401,6 @@ int main(int argc, char const **argv)
       int process_status_54;
       __e_acsl_store_block((void *)(& process_status_54),(size_t)4);
       __gen_e_acsl_waitpid(pid_54,& process_status_54,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_54); */
       signal_eval(process_status_54,0,__gen_e_acsl_literal_string_114);
       __e_acsl_delete_block((void *)(& process_status_54));
     }
@@ -3418,7 +3415,6 @@ int main(int argc, char const **argv)
       int process_status_55;
       __e_acsl_store_block((void *)(& process_status_55),(size_t)4);
       __gen_e_acsl_waitpid(pid_55,& process_status_55,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_55); */
       signal_eval(process_status_55,0,__gen_e_acsl_literal_string_114);
       __e_acsl_delete_block((void *)(& process_status_55));
     }
@@ -3436,7 +3432,6 @@ int main(int argc, char const **argv)
       int process_status_56;
       __e_acsl_store_block((void *)(& process_status_56),(size_t)4);
       __gen_e_acsl_waitpid(pid_56,& process_status_56,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_56); */
       signal_eval(process_status_56,0,__gen_e_acsl_literal_string_119);
       __e_acsl_delete_block((void *)(& process_status_56));
     }
@@ -3451,7 +3446,6 @@ int main(int argc, char const **argv)
       int process_status_57;
       __e_acsl_store_block((void *)(& process_status_57),(size_t)4);
       __gen_e_acsl_waitpid(pid_57,& process_status_57,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_57); */
       signal_eval(process_status_57,0,__gen_e_acsl_literal_string_119);
       __e_acsl_delete_block((void *)(& process_status_57));
     }
@@ -3466,7 +3460,6 @@ int main(int argc, char const **argv)
       int process_status_58;
       __e_acsl_store_block((void *)(& process_status_58),(size_t)4);
       __gen_e_acsl_waitpid(pid_58,& process_status_58,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_58); */
       signal_eval(process_status_58,0,__gen_e_acsl_literal_string_122);
       __e_acsl_delete_block((void *)(& process_status_58));
     }
@@ -3481,7 +3474,6 @@ int main(int argc, char const **argv)
       int process_status_59;
       __e_acsl_store_block((void *)(& process_status_59),(size_t)4);
       __gen_e_acsl_waitpid(pid_59,& process_status_59,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_59); */
       signal_eval(process_status_59,0,__gen_e_acsl_literal_string_122);
       __e_acsl_delete_block((void *)(& process_status_59));
     }
@@ -3496,7 +3488,6 @@ int main(int argc, char const **argv)
       int process_status_60;
       __e_acsl_store_block((void *)(& process_status_60),(size_t)4);
       __gen_e_acsl_waitpid(pid_60,& process_status_60,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_60); */
       signal_eval(process_status_60,0,__gen_e_acsl_literal_string_125);
       __e_acsl_delete_block((void *)(& process_status_60));
     }
@@ -3511,7 +3502,6 @@ int main(int argc, char const **argv)
       int process_status_61;
       __e_acsl_store_block((void *)(& process_status_61),(size_t)4);
       __gen_e_acsl_waitpid(pid_61,& process_status_61,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_61); */
       signal_eval(process_status_61,0,__gen_e_acsl_literal_string_125);
       __e_acsl_delete_block((void *)(& process_status_61));
     }
@@ -3526,7 +3516,6 @@ int main(int argc, char const **argv)
       int process_status_62;
       __e_acsl_store_block((void *)(& process_status_62),(size_t)4);
       __gen_e_acsl_waitpid(pid_62,& process_status_62,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_62); */
       signal_eval(process_status_62,0,__gen_e_acsl_literal_string_125);
       __e_acsl_delete_block((void *)(& process_status_62));
     }
@@ -3544,7 +3533,6 @@ int main(int argc, char const **argv)
       int process_status_63;
       __e_acsl_store_block((void *)(& process_status_63),(size_t)4);
       __gen_e_acsl_waitpid(pid_63,& process_status_63,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_63); */
       signal_eval(process_status_63,0,__gen_e_acsl_literal_string_130);
       __e_acsl_delete_block((void *)(& process_status_63));
     }
@@ -3559,7 +3547,6 @@ int main(int argc, char const **argv)
       int process_status_64;
       __e_acsl_store_block((void *)(& process_status_64),(size_t)4);
       __gen_e_acsl_waitpid(pid_64,& process_status_64,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_64); */
       signal_eval(process_status_64,0,__gen_e_acsl_literal_string_130);
       __e_acsl_delete_block((void *)(& process_status_64));
     }
@@ -3574,7 +3561,6 @@ int main(int argc, char const **argv)
       int process_status_65;
       __e_acsl_store_block((void *)(& process_status_65),(size_t)4);
       __gen_e_acsl_waitpid(pid_65,& process_status_65,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_65); */
       signal_eval(process_status_65,0,__gen_e_acsl_literal_string_133);
       __e_acsl_delete_block((void *)(& process_status_65));
     }
@@ -3589,7 +3575,6 @@ int main(int argc, char const **argv)
       int process_status_66;
       __e_acsl_store_block((void *)(& process_status_66),(size_t)4);
       __gen_e_acsl_waitpid(pid_66,& process_status_66,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_66); */
       signal_eval(process_status_66,0,__gen_e_acsl_literal_string_133);
       __e_acsl_delete_block((void *)(& process_status_66));
     }
@@ -3604,7 +3589,6 @@ int main(int argc, char const **argv)
       int process_status_67;
       __e_acsl_store_block((void *)(& process_status_67),(size_t)4);
       __gen_e_acsl_waitpid(pid_67,& process_status_67,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_67); */
       signal_eval(process_status_67,0,__gen_e_acsl_literal_string_135);
       __e_acsl_delete_block((void *)(& process_status_67));
     }
@@ -3619,7 +3603,6 @@ int main(int argc, char const **argv)
       int process_status_68;
       __e_acsl_store_block((void *)(& process_status_68),(size_t)4);
       __gen_e_acsl_waitpid(pid_68,& process_status_68,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_68); */
       signal_eval(process_status_68,0,__gen_e_acsl_literal_string_135);
       __e_acsl_delete_block((void *)(& process_status_68));
     }
@@ -3634,7 +3617,6 @@ int main(int argc, char const **argv)
       int process_status_69;
       __e_acsl_store_block((void *)(& process_status_69),(size_t)4);
       __gen_e_acsl_waitpid(pid_69,& process_status_69,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_69); */
       signal_eval(process_status_69,0,__gen_e_acsl_literal_string_138);
       __e_acsl_delete_block((void *)(& process_status_69));
     }
@@ -3652,7 +3634,6 @@ int main(int argc, char const **argv)
       int process_status_70;
       __e_acsl_store_block((void *)(& process_status_70),(size_t)4);
       __gen_e_acsl_waitpid(pid_70,& process_status_70,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_70); */
       signal_eval(process_status_70,0,__gen_e_acsl_literal_string_143);
       __e_acsl_delete_block((void *)(& process_status_70));
     }
@@ -3667,7 +3648,6 @@ int main(int argc, char const **argv)
       int process_status_71;
       __e_acsl_store_block((void *)(& process_status_71),(size_t)4);
       __gen_e_acsl_waitpid(pid_71,& process_status_71,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_71); */
       signal_eval(process_status_71,0,__gen_e_acsl_literal_string_143);
       __e_acsl_delete_block((void *)(& process_status_71));
     }
@@ -3682,7 +3662,6 @@ int main(int argc, char const **argv)
       int process_status_72;
       __e_acsl_store_block((void *)(& process_status_72),(size_t)4);
       __gen_e_acsl_waitpid(pid_72,& process_status_72,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_72); */
       signal_eval(process_status_72,0,__gen_e_acsl_literal_string_146);
       __e_acsl_delete_block((void *)(& process_status_72));
     }
@@ -3697,7 +3676,6 @@ int main(int argc, char const **argv)
       int process_status_73;
       __e_acsl_store_block((void *)(& process_status_73),(size_t)4);
       __gen_e_acsl_waitpid(pid_73,& process_status_73,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_73); */
       signal_eval(process_status_73,0,__gen_e_acsl_literal_string_146);
       __e_acsl_delete_block((void *)(& process_status_73));
     }
@@ -3712,7 +3690,6 @@ int main(int argc, char const **argv)
       int process_status_74;
       __e_acsl_store_block((void *)(& process_status_74),(size_t)4);
       __gen_e_acsl_waitpid(pid_74,& process_status_74,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_74); */
       signal_eval(process_status_74,0,__gen_e_acsl_literal_string_149);
       __e_acsl_delete_block((void *)(& process_status_74));
     }
@@ -3727,7 +3704,6 @@ int main(int argc, char const **argv)
       int process_status_75;
       __e_acsl_store_block((void *)(& process_status_75),(size_t)4);
       __gen_e_acsl_waitpid(pid_75,& process_status_75,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_75); */
       signal_eval(process_status_75,0,__gen_e_acsl_literal_string_149);
       __e_acsl_delete_block((void *)(& process_status_75));
     }
@@ -3742,7 +3718,6 @@ int main(int argc, char const **argv)
       int process_status_76;
       __e_acsl_store_block((void *)(& process_status_76),(size_t)4);
       __gen_e_acsl_waitpid(pid_76,& process_status_76,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_76); */
       signal_eval(process_status_76,0,__gen_e_acsl_literal_string_152);
       __e_acsl_delete_block((void *)(& process_status_76));
     }
@@ -3757,7 +3732,6 @@ int main(int argc, char const **argv)
       int process_status_77;
       __e_acsl_store_block((void *)(& process_status_77),(size_t)4);
       __gen_e_acsl_waitpid(pid_77,& process_status_77,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_77); */
       signal_eval(process_status_77,0,__gen_e_acsl_literal_string_152);
       __e_acsl_delete_block((void *)(& process_status_77));
     }
@@ -3772,7 +3746,6 @@ int main(int argc, char const **argv)
       int process_status_78;
       __e_acsl_store_block((void *)(& process_status_78),(size_t)4);
       __gen_e_acsl_waitpid(pid_78,& process_status_78,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_78); */
       signal_eval(process_status_78,1,__gen_e_acsl_literal_string_155);
       __e_acsl_delete_block((void *)(& process_status_78));
     }
@@ -3787,7 +3760,6 @@ int main(int argc, char const **argv)
       int process_status_79;
       __e_acsl_store_block((void *)(& process_status_79),(size_t)4);
       __gen_e_acsl_waitpid(pid_79,& process_status_79,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_79); */
       signal_eval(process_status_79,1,__gen_e_acsl_literal_string_157);
       __e_acsl_delete_block((void *)(& process_status_79));
     }
@@ -3802,7 +3774,6 @@ int main(int argc, char const **argv)
       int process_status_80;
       __e_acsl_store_block((void *)(& process_status_80),(size_t)4);
       __gen_e_acsl_waitpid(pid_80,& process_status_80,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_80); */
       signal_eval(process_status_80,1,__gen_e_acsl_literal_string_159);
       __e_acsl_delete_block((void *)(& process_status_80));
     }
@@ -3817,7 +3788,6 @@ int main(int argc, char const **argv)
       int process_status_81;
       __e_acsl_store_block((void *)(& process_status_81),(size_t)4);
       __gen_e_acsl_waitpid(pid_81,& process_status_81,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_81); */
       signal_eval(process_status_81,0,__gen_e_acsl_literal_string_161);
       __e_acsl_delete_block((void *)(& process_status_81));
     }
@@ -3832,7 +3802,6 @@ int main(int argc, char const **argv)
       int process_status_82;
       __e_acsl_store_block((void *)(& process_status_82),(size_t)4);
       __gen_e_acsl_waitpid(pid_82,& process_status_82,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_82); */
       signal_eval(process_status_82,0,__gen_e_acsl_literal_string_161);
       __e_acsl_delete_block((void *)(& process_status_82));
     }
@@ -3847,7 +3816,6 @@ int main(int argc, char const **argv)
       int process_status_83;
       __e_acsl_store_block((void *)(& process_status_83),(size_t)4);
       __gen_e_acsl_waitpid(pid_83,& process_status_83,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_83); */
       signal_eval(process_status_83,0,__gen_e_acsl_literal_string_163);
       __e_acsl_delete_block((void *)(& process_status_83));
     }
@@ -3862,7 +3830,6 @@ int main(int argc, char const **argv)
       int process_status_84;
       __e_acsl_store_block((void *)(& process_status_84),(size_t)4);
       __gen_e_acsl_waitpid(pid_84,& process_status_84,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_84); */
       signal_eval(process_status_84,0,__gen_e_acsl_literal_string_163);
       __e_acsl_delete_block((void *)(& process_status_84));
     }
@@ -3877,7 +3844,6 @@ int main(int argc, char const **argv)
       int process_status_85;
       __e_acsl_store_block((void *)(& process_status_85),(size_t)4);
       __gen_e_acsl_waitpid(pid_85,& process_status_85,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_85); */
       signal_eval(process_status_85,0,__gen_e_acsl_literal_string_164);
       __e_acsl_delete_block((void *)(& process_status_85));
     }
@@ -3892,7 +3858,6 @@ int main(int argc, char const **argv)
       int process_status_86;
       __e_acsl_store_block((void *)(& process_status_86),(size_t)4);
       __gen_e_acsl_waitpid(pid_86,& process_status_86,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_86); */
       signal_eval(process_status_86,0,__gen_e_acsl_literal_string_164);
       __e_acsl_delete_block((void *)(& process_status_86));
     }
@@ -3907,7 +3872,6 @@ int main(int argc, char const **argv)
       int process_status_87;
       __e_acsl_store_block((void *)(& process_status_87),(size_t)4);
       __gen_e_acsl_waitpid(pid_87,& process_status_87,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_87); */
       signal_eval(process_status_87,1,__gen_e_acsl_literal_string_165);
       __e_acsl_delete_block((void *)(& process_status_87));
     }
@@ -3922,7 +3886,6 @@ int main(int argc, char const **argv)
       int process_status_88;
       __e_acsl_store_block((void *)(& process_status_88),(size_t)4);
       __gen_e_acsl_waitpid(pid_88,& process_status_88,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_88); */
       signal_eval(process_status_88,1,__gen_e_acsl_literal_string_165);
       __e_acsl_delete_block((void *)(& process_status_88));
     }
@@ -3937,7 +3900,6 @@ int main(int argc, char const **argv)
       int process_status_89;
       __e_acsl_store_block((void *)(& process_status_89),(size_t)4);
       __gen_e_acsl_waitpid(pid_89,& process_status_89,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_89); */
       signal_eval(process_status_89,1,__gen_e_acsl_literal_string_166);
       __e_acsl_delete_block((void *)(& process_status_89));
     }
@@ -3952,7 +3914,6 @@ int main(int argc, char const **argv)
       int process_status_90;
       __e_acsl_store_block((void *)(& process_status_90),(size_t)4);
       __gen_e_acsl_waitpid(pid_90,& process_status_90,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_90); */
       signal_eval(process_status_90,1,__gen_e_acsl_literal_string_166);
       __e_acsl_delete_block((void *)(& process_status_90));
     }
@@ -3967,7 +3928,6 @@ int main(int argc, char const **argv)
       int process_status_91;
       __e_acsl_store_block((void *)(& process_status_91),(size_t)4);
       __gen_e_acsl_waitpid(pid_91,& process_status_91,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_91); */
       signal_eval(process_status_91,1,__gen_e_acsl_literal_string_167);
       __e_acsl_delete_block((void *)(& process_status_91));
     }
@@ -3982,7 +3942,6 @@ int main(int argc, char const **argv)
       int process_status_92;
       __e_acsl_store_block((void *)(& process_status_92),(size_t)4);
       __gen_e_acsl_waitpid(pid_92,& process_status_92,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_92); */
       signal_eval(process_status_92,1,__gen_e_acsl_literal_string_167);
       __e_acsl_delete_block((void *)(& process_status_92));
     }
@@ -3998,7 +3957,6 @@ int main(int argc, char const **argv)
       int process_status_93;
       __e_acsl_store_block((void *)(& process_status_93),(size_t)4);
       __gen_e_acsl_waitpid(pid_93,& process_status_93,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_93); */
       signal_eval(process_status_93,1,__gen_e_acsl_literal_string_168);
       __e_acsl_delete_block((void *)(& process_status_93));
     }
@@ -4014,7 +3972,6 @@ int main(int argc, char const **argv)
       int process_status_94;
       __e_acsl_store_block((void *)(& process_status_94),(size_t)4);
       __gen_e_acsl_waitpid(pid_94,& process_status_94,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_94); */
       signal_eval(process_status_94,1,__gen_e_acsl_literal_string_168);
       __e_acsl_delete_block((void *)(& process_status_94));
     }
@@ -4029,7 +3986,6 @@ int main(int argc, char const **argv)
       int process_status_95;
       __e_acsl_store_block((void *)(& process_status_95),(size_t)4);
       __gen_e_acsl_waitpid(pid_95,& process_status_95,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_95); */
       signal_eval(process_status_95,0,__gen_e_acsl_literal_string_170);
       __e_acsl_delete_block((void *)(& process_status_95));
     }
@@ -4044,7 +4000,6 @@ int main(int argc, char const **argv)
       int process_status_96;
       __e_acsl_store_block((void *)(& process_status_96),(size_t)4);
       __gen_e_acsl_waitpid(pid_96,& process_status_96,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_96); */
       signal_eval(process_status_96,0,__gen_e_acsl_literal_string_170);
       __e_acsl_delete_block((void *)(& process_status_96));
     }
@@ -4059,7 +4014,6 @@ int main(int argc, char const **argv)
       int process_status_97;
       __e_acsl_store_block((void *)(& process_status_97),(size_t)4);
       __gen_e_acsl_waitpid(pid_97,& process_status_97,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_97); */
       signal_eval(process_status_97,0,__gen_e_acsl_literal_string_172);
       __e_acsl_delete_block((void *)(& process_status_97));
     }
@@ -4074,7 +4028,6 @@ int main(int argc, char const **argv)
       int process_status_98;
       __e_acsl_store_block((void *)(& process_status_98),(size_t)4);
       __gen_e_acsl_waitpid(pid_98,& process_status_98,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_98); */
       signal_eval(process_status_98,0,__gen_e_acsl_literal_string_172);
       __e_acsl_delete_block((void *)(& process_status_98));
     }
@@ -4089,7 +4042,6 @@ int main(int argc, char const **argv)
       int process_status_99;
       __e_acsl_store_block((void *)(& process_status_99),(size_t)4);
       __gen_e_acsl_waitpid(pid_99,& process_status_99,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_99); */
       signal_eval(process_status_99,0,__gen_e_acsl_literal_string_174);
       __e_acsl_delete_block((void *)(& process_status_99));
     }
@@ -4104,7 +4056,6 @@ int main(int argc, char const **argv)
       int process_status_100;
       __e_acsl_store_block((void *)(& process_status_100),(size_t)4);
       __gen_e_acsl_waitpid(pid_100,& process_status_100,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_100); */
       signal_eval(process_status_100,0,__gen_e_acsl_literal_string_174);
       __e_acsl_delete_block((void *)(& process_status_100));
     }
@@ -4119,7 +4070,6 @@ int main(int argc, char const **argv)
       int process_status_101;
       __e_acsl_store_block((void *)(& process_status_101),(size_t)4);
       __gen_e_acsl_waitpid(pid_101,& process_status_101,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_101); */
       signal_eval(process_status_101,0,__gen_e_acsl_literal_string_177);
       __e_acsl_delete_block((void *)(& process_status_101));
     }
@@ -4134,7 +4084,6 @@ int main(int argc, char const **argv)
       int process_status_102;
       __e_acsl_store_block((void *)(& process_status_102),(size_t)4);
       __gen_e_acsl_waitpid(pid_102,& process_status_102,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_102); */
       signal_eval(process_status_102,0,__gen_e_acsl_literal_string_177);
       __e_acsl_delete_block((void *)(& process_status_102));
     }
@@ -4149,7 +4098,6 @@ int main(int argc, char const **argv)
       int process_status_103;
       __e_acsl_store_block((void *)(& process_status_103),(size_t)4);
       __gen_e_acsl_waitpid(pid_103,& process_status_103,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_103); */
       signal_eval(process_status_103,0,__gen_e_acsl_literal_string_180);
       __e_acsl_delete_block((void *)(& process_status_103));
     }
@@ -4164,7 +4112,6 @@ int main(int argc, char const **argv)
       int process_status_104;
       __e_acsl_store_block((void *)(& process_status_104),(size_t)4);
       __gen_e_acsl_waitpid(pid_104,& process_status_104,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_104); */
       signal_eval(process_status_104,0,__gen_e_acsl_literal_string_180);
       __e_acsl_delete_block((void *)(& process_status_104));
     }
@@ -4179,7 +4126,6 @@ int main(int argc, char const **argv)
       int process_status_105;
       __e_acsl_store_block((void *)(& process_status_105),(size_t)4);
       __gen_e_acsl_waitpid(pid_105,& process_status_105,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_105); */
       signal_eval(process_status_105,0,__gen_e_acsl_literal_string_183);
       __e_acsl_delete_block((void *)(& process_status_105));
     }
@@ -4194,7 +4140,6 @@ int main(int argc, char const **argv)
       int process_status_106;
       __e_acsl_store_block((void *)(& process_status_106),(size_t)4);
       __gen_e_acsl_waitpid(pid_106,& process_status_106,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_106); */
       signal_eval(process_status_106,0,__gen_e_acsl_literal_string_183);
       __e_acsl_delete_block((void *)(& process_status_106));
     }
@@ -4209,7 +4154,6 @@ int main(int argc, char const **argv)
       int process_status_107;
       __e_acsl_store_block((void *)(& process_status_107),(size_t)4);
       __gen_e_acsl_waitpid(pid_107,& process_status_107,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_107); */
       signal_eval(process_status_107,0,__gen_e_acsl_literal_string_186);
       __e_acsl_delete_block((void *)(& process_status_107));
     }
@@ -4224,7 +4168,6 @@ int main(int argc, char const **argv)
       int process_status_108;
       __e_acsl_store_block((void *)(& process_status_108),(size_t)4);
       __gen_e_acsl_waitpid(pid_108,& process_status_108,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_108); */
       signal_eval(process_status_108,0,__gen_e_acsl_literal_string_186);
       __e_acsl_delete_block((void *)(& process_status_108));
     }
@@ -4239,7 +4182,6 @@ int main(int argc, char const **argv)
       int process_status_109;
       __e_acsl_store_block((void *)(& process_status_109),(size_t)4);
       __gen_e_acsl_waitpid(pid_109,& process_status_109,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_109); */
       signal_eval(process_status_109,0,__gen_e_acsl_literal_string_186);
       __e_acsl_delete_block((void *)(& process_status_109));
     }
@@ -4254,7 +4196,6 @@ int main(int argc, char const **argv)
       int process_status_110;
       __e_acsl_store_block((void *)(& process_status_110),(size_t)4);
       __gen_e_acsl_waitpid(pid_110,& process_status_110,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_110); */
       signal_eval(process_status_110,0,__gen_e_acsl_literal_string_186);
       __e_acsl_delete_block((void *)(& process_status_110));
     }
@@ -4269,7 +4210,6 @@ int main(int argc, char const **argv)
       int process_status_111;
       __e_acsl_store_block((void *)(& process_status_111),(size_t)4);
       __gen_e_acsl_waitpid(pid_111,& process_status_111,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_111); */
       signal_eval(process_status_111,1,__gen_e_acsl_literal_string_190);
       __e_acsl_delete_block((void *)(& process_status_111));
     }
@@ -4284,7 +4224,6 @@ int main(int argc, char const **argv)
       int process_status_112;
       __e_acsl_store_block((void *)(& process_status_112),(size_t)4);
       __gen_e_acsl_waitpid(pid_112,& process_status_112,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_112); */
       signal_eval(process_status_112,1,__gen_e_acsl_literal_string_190);
       __e_acsl_delete_block((void *)(& process_status_112));
     }
@@ -4299,7 +4238,6 @@ int main(int argc, char const **argv)
       int process_status_113;
       __e_acsl_store_block((void *)(& process_status_113),(size_t)4);
       __gen_e_acsl_waitpid(pid_113,& process_status_113,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_113); */
       signal_eval(process_status_113,1,__gen_e_acsl_literal_string_190);
       __e_acsl_delete_block((void *)(& process_status_113));
     }
@@ -4314,7 +4252,6 @@ int main(int argc, char const **argv)
       int process_status_114;
       __e_acsl_store_block((void *)(& process_status_114),(size_t)4);
       __gen_e_acsl_waitpid(pid_114,& process_status_114,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_114); */
       signal_eval(process_status_114,1,__gen_e_acsl_literal_string_190);
       __e_acsl_delete_block((void *)(& process_status_114));
     }
@@ -4329,7 +4266,6 @@ int main(int argc, char const **argv)
       int process_status_115;
       __e_acsl_store_block((void *)(& process_status_115),(size_t)4);
       __gen_e_acsl_waitpid(pid_115,& process_status_115,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_115); */
       signal_eval(process_status_115,1,__gen_e_acsl_literal_string_191);
       __e_acsl_delete_block((void *)(& process_status_115));
     }
@@ -4344,7 +4280,6 @@ int main(int argc, char const **argv)
       int process_status_116;
       __e_acsl_store_block((void *)(& process_status_116),(size_t)4);
       __gen_e_acsl_waitpid(pid_116,& process_status_116,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_116); */
       signal_eval(process_status_116,1,__gen_e_acsl_literal_string_191);
       __e_acsl_delete_block((void *)(& process_status_116));
     }
@@ -4359,7 +4294,6 @@ int main(int argc, char const **argv)
       int process_status_117;
       __e_acsl_store_block((void *)(& process_status_117),(size_t)4);
       __gen_e_acsl_waitpid(pid_117,& process_status_117,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_117); */
       signal_eval(process_status_117,1,__gen_e_acsl_literal_string_191);
       __e_acsl_delete_block((void *)(& process_status_117));
     }
@@ -4374,7 +4308,6 @@ int main(int argc, char const **argv)
       int process_status_118;
       __e_acsl_store_block((void *)(& process_status_118),(size_t)4);
       __gen_e_acsl_waitpid(pid_118,& process_status_118,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_118); */
       signal_eval(process_status_118,1,__gen_e_acsl_literal_string_191);
       __e_acsl_delete_block((void *)(& process_status_118));
     }
@@ -4390,7 +4323,6 @@ int main(int argc, char const **argv)
       int process_status_119;
       __e_acsl_store_block((void *)(& process_status_119),(size_t)4);
       __gen_e_acsl_waitpid(pid_119,& process_status_119,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_119); */
       signal_eval(process_status_119,1,__gen_e_acsl_literal_string_192);
       __e_acsl_delete_block((void *)(& process_status_119));
     }
@@ -4406,7 +4338,6 @@ int main(int argc, char const **argv)
       int process_status_120;
       __e_acsl_store_block((void *)(& process_status_120),(size_t)4);
       __gen_e_acsl_waitpid(pid_120,& process_status_120,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_120); */
       signal_eval(process_status_120,1,__gen_e_acsl_literal_string_192);
       __e_acsl_delete_block((void *)(& process_status_120));
     }
@@ -4422,7 +4353,6 @@ int main(int argc, char const **argv)
       int process_status_121;
       __e_acsl_store_block((void *)(& process_status_121),(size_t)4);
       __gen_e_acsl_waitpid(pid_121,& process_status_121,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_121); */
       signal_eval(process_status_121,1,__gen_e_acsl_literal_string_192);
       __e_acsl_delete_block((void *)(& process_status_121));
     }
@@ -4438,7 +4368,6 @@ int main(int argc, char const **argv)
       int process_status_122;
       __e_acsl_store_block((void *)(& process_status_122),(size_t)4);
       __gen_e_acsl_waitpid(pid_122,& process_status_122,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_122); */
       signal_eval(process_status_122,1,__gen_e_acsl_literal_string_192);
       __e_acsl_delete_block((void *)(& process_status_122));
     }
@@ -4453,7 +4382,6 @@ int main(int argc, char const **argv)
       int process_status_123;
       __e_acsl_store_block((void *)(& process_status_123),(size_t)4);
       __gen_e_acsl_waitpid(pid_123,& process_status_123,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_123); */
       signal_eval(process_status_123,1,__gen_e_acsl_literal_string_193);
       __e_acsl_delete_block((void *)(& process_status_123));
     }
@@ -4468,7 +4396,6 @@ int main(int argc, char const **argv)
       int process_status_124;
       __e_acsl_store_block((void *)(& process_status_124),(size_t)4);
       __gen_e_acsl_waitpid(pid_124,& process_status_124,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_124); */
       signal_eval(process_status_124,1,__gen_e_acsl_literal_string_193);
       __e_acsl_delete_block((void *)(& process_status_124));
     }
@@ -4483,7 +4410,6 @@ int main(int argc, char const **argv)
       int process_status_125;
       __e_acsl_store_block((void *)(& process_status_125),(size_t)4);
       __gen_e_acsl_waitpid(pid_125,& process_status_125,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_125); */
       signal_eval(process_status_125,1,__gen_e_acsl_literal_string_193);
       __e_acsl_delete_block((void *)(& process_status_125));
     }
@@ -4498,7 +4424,6 @@ int main(int argc, char const **argv)
       int process_status_126;
       __e_acsl_store_block((void *)(& process_status_126),(size_t)4);
       __gen_e_acsl_waitpid(pid_126,& process_status_126,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_126); */
       signal_eval(process_status_126,1,__gen_e_acsl_literal_string_193);
       __e_acsl_delete_block((void *)(& process_status_126));
     }
@@ -4513,7 +4438,6 @@ int main(int argc, char const **argv)
       int process_status_127;
       __e_acsl_store_block((void *)(& process_status_127),(size_t)4);
       __gen_e_acsl_waitpid(pid_127,& process_status_127,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_127); */
       signal_eval(process_status_127,1,__gen_e_acsl_literal_string_194);
       __e_acsl_delete_block((void *)(& process_status_127));
     }
@@ -4528,7 +4452,6 @@ int main(int argc, char const **argv)
       int process_status_128;
       __e_acsl_store_block((void *)(& process_status_128),(size_t)4);
       __gen_e_acsl_waitpid(pid_128,& process_status_128,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_128); */
       signal_eval(process_status_128,1,__gen_e_acsl_literal_string_194);
       __e_acsl_delete_block((void *)(& process_status_128));
     }
@@ -4543,7 +4466,6 @@ int main(int argc, char const **argv)
       int process_status_129;
       __e_acsl_store_block((void *)(& process_status_129),(size_t)4);
       __gen_e_acsl_waitpid(pid_129,& process_status_129,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_129); */
       signal_eval(process_status_129,1,__gen_e_acsl_literal_string_194);
       __e_acsl_delete_block((void *)(& process_status_129));
     }
@@ -4558,7 +4480,6 @@ int main(int argc, char const **argv)
       int process_status_130;
       __e_acsl_store_block((void *)(& process_status_130),(size_t)4);
       __gen_e_acsl_waitpid(pid_130,& process_status_130,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_130); */
       signal_eval(process_status_130,1,__gen_e_acsl_literal_string_194);
       __e_acsl_delete_block((void *)(& process_status_130));
     }
@@ -4573,7 +4494,6 @@ int main(int argc, char const **argv)
       int process_status_131;
       __e_acsl_store_block((void *)(& process_status_131),(size_t)4);
       __gen_e_acsl_waitpid(pid_131,& process_status_131,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_131); */
       signal_eval(process_status_131,0,__gen_e_acsl_literal_string_196);
       __e_acsl_delete_block((void *)(& process_status_131));
     }
@@ -4588,7 +4508,6 @@ int main(int argc, char const **argv)
       int process_status_132;
       __e_acsl_store_block((void *)(& process_status_132),(size_t)4);
       __gen_e_acsl_waitpid(pid_132,& process_status_132,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_132); */
       signal_eval(process_status_132,0,__gen_e_acsl_literal_string_196);
       __e_acsl_delete_block((void *)(& process_status_132));
     }
@@ -4603,7 +4522,6 @@ int main(int argc, char const **argv)
       int process_status_133;
       __e_acsl_store_block((void *)(& process_status_133),(size_t)4);
       __gen_e_acsl_waitpid(pid_133,& process_status_133,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_133); */
       signal_eval(process_status_133,0,__gen_e_acsl_literal_string_196);
       __e_acsl_delete_block((void *)(& process_status_133));
     }
@@ -4618,7 +4536,6 @@ int main(int argc, char const **argv)
       int process_status_134;
       __e_acsl_store_block((void *)(& process_status_134),(size_t)4);
       __gen_e_acsl_waitpid(pid_134,& process_status_134,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_134); */
       signal_eval(process_status_134,0,__gen_e_acsl_literal_string_196);
       __e_acsl_delete_block((void *)(& process_status_134));
     }
@@ -4633,7 +4550,6 @@ int main(int argc, char const **argv)
       int process_status_135;
       __e_acsl_store_block((void *)(& process_status_135),(size_t)4);
       __gen_e_acsl_waitpid(pid_135,& process_status_135,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_135); */
       signal_eval(process_status_135,0,__gen_e_acsl_literal_string_201);
       __e_acsl_delete_block((void *)(& process_status_135));
     }
@@ -4648,7 +4564,6 @@ int main(int argc, char const **argv)
       int process_status_136;
       __e_acsl_store_block((void *)(& process_status_136),(size_t)4);
       __gen_e_acsl_waitpid(pid_136,& process_status_136,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_136); */
       signal_eval(process_status_136,0,__gen_e_acsl_literal_string_201);
       __e_acsl_delete_block((void *)(& process_status_136));
     }
@@ -4663,7 +4578,6 @@ int main(int argc, char const **argv)
       int process_status_137;
       __e_acsl_store_block((void *)(& process_status_137),(size_t)4);
       __gen_e_acsl_waitpid(pid_137,& process_status_137,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_137); */
       signal_eval(process_status_137,0,__gen_e_acsl_literal_string_201);
       __e_acsl_delete_block((void *)(& process_status_137));
     }
@@ -4678,7 +4592,6 @@ int main(int argc, char const **argv)
       int process_status_138;
       __e_acsl_store_block((void *)(& process_status_138),(size_t)4);
       __gen_e_acsl_waitpid(pid_138,& process_status_138,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_138); */
       signal_eval(process_status_138,0,__gen_e_acsl_literal_string_201);
       __e_acsl_delete_block((void *)(& process_status_138));
     }
@@ -4693,7 +4606,6 @@ int main(int argc, char const **argv)
       int process_status_139;
       __e_acsl_store_block((void *)(& process_status_139),(size_t)4);
       __gen_e_acsl_waitpid(pid_139,& process_status_139,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_139); */
       signal_eval(process_status_139,0,__gen_e_acsl_literal_string_206);
       __e_acsl_delete_block((void *)(& process_status_139));
     }
@@ -4708,7 +4620,6 @@ int main(int argc, char const **argv)
       int process_status_140;
       __e_acsl_store_block((void *)(& process_status_140),(size_t)4);
       __gen_e_acsl_waitpid(pid_140,& process_status_140,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_140); */
       signal_eval(process_status_140,0,__gen_e_acsl_literal_string_206);
       __e_acsl_delete_block((void *)(& process_status_140));
     }
@@ -4723,7 +4634,6 @@ int main(int argc, char const **argv)
       int process_status_141;
       __e_acsl_store_block((void *)(& process_status_141),(size_t)4);
       __gen_e_acsl_waitpid(pid_141,& process_status_141,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_141); */
       signal_eval(process_status_141,0,__gen_e_acsl_literal_string_206);
       __e_acsl_delete_block((void *)(& process_status_141));
     }
@@ -4738,7 +4648,6 @@ int main(int argc, char const **argv)
       int process_status_142;
       __e_acsl_store_block((void *)(& process_status_142),(size_t)4);
       __gen_e_acsl_waitpid(pid_142,& process_status_142,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_142); */
       signal_eval(process_status_142,0,__gen_e_acsl_literal_string_206);
       __e_acsl_delete_block((void *)(& process_status_142));
     }
@@ -4753,7 +4662,6 @@ int main(int argc, char const **argv)
       int process_status_143;
       __e_acsl_store_block((void *)(& process_status_143),(size_t)4);
       __gen_e_acsl_waitpid(pid_143,& process_status_143,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_143); */
       signal_eval(process_status_143,0,__gen_e_acsl_literal_string_211);
       __e_acsl_delete_block((void *)(& process_status_143));
     }
@@ -4768,7 +4676,6 @@ int main(int argc, char const **argv)
       int process_status_144;
       __e_acsl_store_block((void *)(& process_status_144),(size_t)4);
       __gen_e_acsl_waitpid(pid_144,& process_status_144,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_144); */
       signal_eval(process_status_144,0,__gen_e_acsl_literal_string_211);
       __e_acsl_delete_block((void *)(& process_status_144));
     }
@@ -4783,7 +4690,6 @@ int main(int argc, char const **argv)
       int process_status_145;
       __e_acsl_store_block((void *)(& process_status_145),(size_t)4);
       __gen_e_acsl_waitpid(pid_145,& process_status_145,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_145); */
       signal_eval(process_status_145,0,__gen_e_acsl_literal_string_211);
       __e_acsl_delete_block((void *)(& process_status_145));
     }
@@ -4798,7 +4704,6 @@ int main(int argc, char const **argv)
       int process_status_146;
       __e_acsl_store_block((void *)(& process_status_146),(size_t)4);
       __gen_e_acsl_waitpid(pid_146,& process_status_146,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_146); */
       signal_eval(process_status_146,0,__gen_e_acsl_literal_string_211);
       __e_acsl_delete_block((void *)(& process_status_146));
     }
@@ -4813,7 +4718,6 @@ int main(int argc, char const **argv)
       int process_status_147;
       __e_acsl_store_block((void *)(& process_status_147),(size_t)4);
       __gen_e_acsl_waitpid(pid_147,& process_status_147,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_147); */
       signal_eval(process_status_147,0,__gen_e_acsl_literal_string_216);
       __e_acsl_delete_block((void *)(& process_status_147));
     }
@@ -4828,7 +4732,6 @@ int main(int argc, char const **argv)
       int process_status_148;
       __e_acsl_store_block((void *)(& process_status_148),(size_t)4);
       __gen_e_acsl_waitpid(pid_148,& process_status_148,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_148); */
       signal_eval(process_status_148,0,__gen_e_acsl_literal_string_216);
       __e_acsl_delete_block((void *)(& process_status_148));
     }
@@ -4843,7 +4746,6 @@ int main(int argc, char const **argv)
       int process_status_149;
       __e_acsl_store_block((void *)(& process_status_149),(size_t)4);
       __gen_e_acsl_waitpid(pid_149,& process_status_149,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_149); */
       signal_eval(process_status_149,0,__gen_e_acsl_literal_string_216);
       __e_acsl_delete_block((void *)(& process_status_149));
     }
@@ -4858,7 +4760,6 @@ int main(int argc, char const **argv)
       int process_status_150;
       __e_acsl_store_block((void *)(& process_status_150),(size_t)4);
       __gen_e_acsl_waitpid(pid_150,& process_status_150,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_150); */
       signal_eval(process_status_150,0,__gen_e_acsl_literal_string_216);
       __e_acsl_delete_block((void *)(& process_status_150));
     }
@@ -4873,7 +4774,6 @@ int main(int argc, char const **argv)
       int process_status_151;
       __e_acsl_store_block((void *)(& process_status_151),(size_t)4);
       __gen_e_acsl_waitpid(pid_151,& process_status_151,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_151); */
       signal_eval(process_status_151,0,__gen_e_acsl_literal_string_221);
       __e_acsl_delete_block((void *)(& process_status_151));
     }
@@ -4888,7 +4788,6 @@ int main(int argc, char const **argv)
       int process_status_152;
       __e_acsl_store_block((void *)(& process_status_152),(size_t)4);
       __gen_e_acsl_waitpid(pid_152,& process_status_152,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_152); */
       signal_eval(process_status_152,0,__gen_e_acsl_literal_string_221);
       __e_acsl_delete_block((void *)(& process_status_152));
     }
@@ -4903,7 +4802,6 @@ int main(int argc, char const **argv)
       int process_status_153;
       __e_acsl_store_block((void *)(& process_status_153),(size_t)4);
       __gen_e_acsl_waitpid(pid_153,& process_status_153,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_153); */
       signal_eval(process_status_153,0,__gen_e_acsl_literal_string_221);
       __e_acsl_delete_block((void *)(& process_status_153));
     }
@@ -4918,7 +4816,6 @@ int main(int argc, char const **argv)
       int process_status_154;
       __e_acsl_store_block((void *)(& process_status_154),(size_t)4);
       __gen_e_acsl_waitpid(pid_154,& process_status_154,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_154); */
       signal_eval(process_status_154,0,__gen_e_acsl_literal_string_221);
       __e_acsl_delete_block((void *)(& process_status_154));
     }
@@ -4933,7 +4830,6 @@ int main(int argc, char const **argv)
       int process_status_155;
       __e_acsl_store_block((void *)(& process_status_155),(size_t)4);
       __gen_e_acsl_waitpid(pid_155,& process_status_155,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_155); */
       signal_eval(process_status_155,0,__gen_e_acsl_literal_string_226);
       __e_acsl_delete_block((void *)(& process_status_155));
     }
@@ -4948,7 +4844,6 @@ int main(int argc, char const **argv)
       int process_status_156;
       __e_acsl_store_block((void *)(& process_status_156),(size_t)4);
       __gen_e_acsl_waitpid(pid_156,& process_status_156,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_156); */
       signal_eval(process_status_156,0,__gen_e_acsl_literal_string_226);
       __e_acsl_delete_block((void *)(& process_status_156));
     }
@@ -4963,7 +4858,6 @@ int main(int argc, char const **argv)
       int process_status_157;
       __e_acsl_store_block((void *)(& process_status_157),(size_t)4);
       __gen_e_acsl_waitpid(pid_157,& process_status_157,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_157); */
       signal_eval(process_status_157,0,__gen_e_acsl_literal_string_226);
       __e_acsl_delete_block((void *)(& process_status_157));
     }
@@ -4978,7 +4872,6 @@ int main(int argc, char const **argv)
       int process_status_158;
       __e_acsl_store_block((void *)(& process_status_158),(size_t)4);
       __gen_e_acsl_waitpid(pid_158,& process_status_158,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_158); */
       signal_eval(process_status_158,0,__gen_e_acsl_literal_string_226);
       __e_acsl_delete_block((void *)(& process_status_158));
     }
@@ -4993,7 +4886,6 @@ int main(int argc, char const **argv)
       int process_status_159;
       __e_acsl_store_block((void *)(& process_status_159),(size_t)4);
       __gen_e_acsl_waitpid(pid_159,& process_status_159,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_159); */
       signal_eval(process_status_159,0,__gen_e_acsl_literal_string_231);
       __e_acsl_delete_block((void *)(& process_status_159));
     }
@@ -5008,7 +4900,6 @@ int main(int argc, char const **argv)
       int process_status_160;
       __e_acsl_store_block((void *)(& process_status_160),(size_t)4);
       __gen_e_acsl_waitpid(pid_160,& process_status_160,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_160); */
       signal_eval(process_status_160,0,__gen_e_acsl_literal_string_231);
       __e_acsl_delete_block((void *)(& process_status_160));
     }
@@ -5023,7 +4914,6 @@ int main(int argc, char const **argv)
       int process_status_161;
       __e_acsl_store_block((void *)(& process_status_161),(size_t)4);
       __gen_e_acsl_waitpid(pid_161,& process_status_161,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_161); */
       signal_eval(process_status_161,1,__gen_e_acsl_literal_string_233);
       __e_acsl_delete_block((void *)(& process_status_161));
     }
@@ -5038,7 +4928,6 @@ int main(int argc, char const **argv)
       int process_status_162;
       __e_acsl_store_block((void *)(& process_status_162),(size_t)4);
       __gen_e_acsl_waitpid(pid_162,& process_status_162,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_162); */
       signal_eval(process_status_162,1,__gen_e_acsl_literal_string_233);
       __e_acsl_delete_block((void *)(& process_status_162));
     }
@@ -5053,7 +4942,6 @@ int main(int argc, char const **argv)
       int process_status_163;
       __e_acsl_store_block((void *)(& process_status_163),(size_t)4);
       __gen_e_acsl_waitpid(pid_163,& process_status_163,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_163); */
       signal_eval(process_status_163,1,__gen_e_acsl_literal_string_234);
       __e_acsl_delete_block((void *)(& process_status_163));
     }
@@ -5068,7 +4956,6 @@ int main(int argc, char const **argv)
       int process_status_164;
       __e_acsl_store_block((void *)(& process_status_164),(size_t)4);
       __gen_e_acsl_waitpid(pid_164,& process_status_164,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_164); */
       signal_eval(process_status_164,1,__gen_e_acsl_literal_string_234);
       __e_acsl_delete_block((void *)(& process_status_164));
     }
@@ -5083,7 +4970,6 @@ int main(int argc, char const **argv)
       int process_status_165;
       __e_acsl_store_block((void *)(& process_status_165),(size_t)4);
       __gen_e_acsl_waitpid(pid_165,& process_status_165,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_165); */
       signal_eval(process_status_165,1,__gen_e_acsl_literal_string_235);
       __e_acsl_delete_block((void *)(& process_status_165));
     }
@@ -5098,7 +4984,6 @@ int main(int argc, char const **argv)
       int process_status_166;
       __e_acsl_store_block((void *)(& process_status_166),(size_t)4);
       __gen_e_acsl_waitpid(pid_166,& process_status_166,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_166); */
       signal_eval(process_status_166,1,__gen_e_acsl_literal_string_235);
       __e_acsl_delete_block((void *)(& process_status_166));
     }
@@ -5113,7 +4998,6 @@ int main(int argc, char const **argv)
       int process_status_167;
       __e_acsl_store_block((void *)(& process_status_167),(size_t)4);
       __gen_e_acsl_waitpid(pid_167,& process_status_167,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_167); */
       signal_eval(process_status_167,0,__gen_e_acsl_literal_string_237);
       __e_acsl_delete_block((void *)(& process_status_167));
     }
@@ -5128,7 +5012,6 @@ int main(int argc, char const **argv)
       int process_status_168;
       __e_acsl_store_block((void *)(& process_status_168),(size_t)4);
       __gen_e_acsl_waitpid(pid_168,& process_status_168,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_168); */
       signal_eval(process_status_168,0,__gen_e_acsl_literal_string_237);
       __e_acsl_delete_block((void *)(& process_status_168));
     }
@@ -5143,7 +5026,6 @@ int main(int argc, char const **argv)
       int process_status_169;
       __e_acsl_store_block((void *)(& process_status_169),(size_t)4);
       __gen_e_acsl_waitpid(pid_169,& process_status_169,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_169); */
       signal_eval(process_status_169,1,__gen_e_acsl_literal_string_239);
       __e_acsl_delete_block((void *)(& process_status_169));
     }
@@ -5158,7 +5040,6 @@ int main(int argc, char const **argv)
       int process_status_170;
       __e_acsl_store_block((void *)(& process_status_170),(size_t)4);
       __gen_e_acsl_waitpid(pid_170,& process_status_170,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_170); */
       signal_eval(process_status_170,1,__gen_e_acsl_literal_string_239);
       __e_acsl_delete_block((void *)(& process_status_170));
     }
@@ -5173,7 +5054,6 @@ int main(int argc, char const **argv)
       int process_status_171;
       __e_acsl_store_block((void *)(& process_status_171),(size_t)4);
       __gen_e_acsl_waitpid(pid_171,& process_status_171,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_171); */
       signal_eval(process_status_171,1,__gen_e_acsl_literal_string_240);
       __e_acsl_delete_block((void *)(& process_status_171));
     }
@@ -5188,7 +5068,6 @@ int main(int argc, char const **argv)
       int process_status_172;
       __e_acsl_store_block((void *)(& process_status_172),(size_t)4);
       __gen_e_acsl_waitpid(pid_172,& process_status_172,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_172); */
       signal_eval(process_status_172,1,__gen_e_acsl_literal_string_240);
       __e_acsl_delete_block((void *)(& process_status_172));
     }
@@ -5203,7 +5082,6 @@ int main(int argc, char const **argv)
       int process_status_173;
       __e_acsl_store_block((void *)(& process_status_173),(size_t)4);
       __gen_e_acsl_waitpid(pid_173,& process_status_173,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_173); */
       signal_eval(process_status_173,1,__gen_e_acsl_literal_string_241);
       __e_acsl_delete_block((void *)(& process_status_173));
     }
@@ -5218,7 +5096,6 @@ int main(int argc, char const **argv)
       int process_status_174;
       __e_acsl_store_block((void *)(& process_status_174),(size_t)4);
       __gen_e_acsl_waitpid(pid_174,& process_status_174,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_174); */
       signal_eval(process_status_174,1,__gen_e_acsl_literal_string_241);
       __e_acsl_delete_block((void *)(& process_status_174));
     }
@@ -5233,7 +5110,6 @@ int main(int argc, char const **argv)
       int process_status_175;
       __e_acsl_store_block((void *)(& process_status_175),(size_t)4);
       __gen_e_acsl_waitpid(pid_175,& process_status_175,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_175); */
       signal_eval(process_status_175,0,__gen_e_acsl_literal_string_243);
       __e_acsl_delete_block((void *)(& process_status_175));
     }
@@ -5248,7 +5124,6 @@ int main(int argc, char const **argv)
       int process_status_176;
       __e_acsl_store_block((void *)(& process_status_176),(size_t)4);
       __gen_e_acsl_waitpid(pid_176,& process_status_176,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_176); */
       signal_eval(process_status_176,0,__gen_e_acsl_literal_string_243);
       __e_acsl_delete_block((void *)(& process_status_176));
     }
@@ -5263,7 +5138,6 @@ int main(int argc, char const **argv)
       int process_status_177;
       __e_acsl_store_block((void *)(& process_status_177),(size_t)4);
       __gen_e_acsl_waitpid(pid_177,& process_status_177,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_177); */
       signal_eval(process_status_177,1,__gen_e_acsl_literal_string_245);
       __e_acsl_delete_block((void *)(& process_status_177));
     }
@@ -5278,7 +5152,6 @@ int main(int argc, char const **argv)
       int process_status_178;
       __e_acsl_store_block((void *)(& process_status_178),(size_t)4);
       __gen_e_acsl_waitpid(pid_178,& process_status_178,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_178); */
       signal_eval(process_status_178,1,__gen_e_acsl_literal_string_245);
       __e_acsl_delete_block((void *)(& process_status_178));
     }
@@ -5293,7 +5166,6 @@ int main(int argc, char const **argv)
       int process_status_179;
       __e_acsl_store_block((void *)(& process_status_179),(size_t)4);
       __gen_e_acsl_waitpid(pid_179,& process_status_179,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_179); */
       signal_eval(process_status_179,1,__gen_e_acsl_literal_string_246);
       __e_acsl_delete_block((void *)(& process_status_179));
     }
@@ -5308,7 +5180,6 @@ int main(int argc, char const **argv)
       int process_status_180;
       __e_acsl_store_block((void *)(& process_status_180),(size_t)4);
       __gen_e_acsl_waitpid(pid_180,& process_status_180,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_180); */
       signal_eval(process_status_180,1,__gen_e_acsl_literal_string_246);
       __e_acsl_delete_block((void *)(& process_status_180));
     }
@@ -5323,7 +5194,6 @@ int main(int argc, char const **argv)
       int process_status_181;
       __e_acsl_store_block((void *)(& process_status_181),(size_t)4);
       __gen_e_acsl_waitpid(pid_181,& process_status_181,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_181); */
       signal_eval(process_status_181,1,__gen_e_acsl_literal_string_247);
       __e_acsl_delete_block((void *)(& process_status_181));
     }
@@ -5338,7 +5208,6 @@ int main(int argc, char const **argv)
       int process_status_182;
       __e_acsl_store_block((void *)(& process_status_182),(size_t)4);
       __gen_e_acsl_waitpid(pid_182,& process_status_182,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_182); */
       signal_eval(process_status_182,1,__gen_e_acsl_literal_string_247);
       __e_acsl_delete_block((void *)(& process_status_182));
     }
@@ -5353,7 +5222,6 @@ int main(int argc, char const **argv)
       int process_status_183;
       __e_acsl_store_block((void *)(& process_status_183),(size_t)4);
       __gen_e_acsl_waitpid(pid_183,& process_status_183,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_183); */
       signal_eval(process_status_183,0,__gen_e_acsl_literal_string_249);
       __e_acsl_delete_block((void *)(& process_status_183));
     }
@@ -5368,7 +5236,6 @@ int main(int argc, char const **argv)
       int process_status_184;
       __e_acsl_store_block((void *)(& process_status_184),(size_t)4);
       __gen_e_acsl_waitpid(pid_184,& process_status_184,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_184); */
       signal_eval(process_status_184,0,__gen_e_acsl_literal_string_249);
       __e_acsl_delete_block((void *)(& process_status_184));
     }
@@ -5383,7 +5250,6 @@ int main(int argc, char const **argv)
       int process_status_185;
       __e_acsl_store_block((void *)(& process_status_185),(size_t)4);
       __gen_e_acsl_waitpid(pid_185,& process_status_185,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_185); */
       signal_eval(process_status_185,1,__gen_e_acsl_literal_string_251);
       __e_acsl_delete_block((void *)(& process_status_185));
     }
@@ -5398,7 +5264,6 @@ int main(int argc, char const **argv)
       int process_status_186;
       __e_acsl_store_block((void *)(& process_status_186),(size_t)4);
       __gen_e_acsl_waitpid(pid_186,& process_status_186,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_186); */
       signal_eval(process_status_186,1,__gen_e_acsl_literal_string_251);
       __e_acsl_delete_block((void *)(& process_status_186));
     }
@@ -5413,7 +5278,6 @@ int main(int argc, char const **argv)
       int process_status_187;
       __e_acsl_store_block((void *)(& process_status_187),(size_t)4);
       __gen_e_acsl_waitpid(pid_187,& process_status_187,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_187); */
       signal_eval(process_status_187,1,__gen_e_acsl_literal_string_252);
       __e_acsl_delete_block((void *)(& process_status_187));
     }
@@ -5428,7 +5292,6 @@ int main(int argc, char const **argv)
       int process_status_188;
       __e_acsl_store_block((void *)(& process_status_188),(size_t)4);
       __gen_e_acsl_waitpid(pid_188,& process_status_188,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_188); */
       signal_eval(process_status_188,1,__gen_e_acsl_literal_string_252);
       __e_acsl_delete_block((void *)(& process_status_188));
     }
@@ -5443,7 +5306,6 @@ int main(int argc, char const **argv)
       int process_status_189;
       __e_acsl_store_block((void *)(& process_status_189),(size_t)4);
       __gen_e_acsl_waitpid(pid_189,& process_status_189,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_189); */
       signal_eval(process_status_189,1,__gen_e_acsl_literal_string_253);
       __e_acsl_delete_block((void *)(& process_status_189));
     }
@@ -5458,7 +5320,6 @@ int main(int argc, char const **argv)
       int process_status_190;
       __e_acsl_store_block((void *)(& process_status_190),(size_t)4);
       __gen_e_acsl_waitpid(pid_190,& process_status_190,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_190); */
       signal_eval(process_status_190,1,__gen_e_acsl_literal_string_253);
       __e_acsl_delete_block((void *)(& process_status_190));
     }
@@ -5473,7 +5334,6 @@ int main(int argc, char const **argv)
       int process_status_191;
       __e_acsl_store_block((void *)(& process_status_191),(size_t)4);
       __gen_e_acsl_waitpid(pid_191,& process_status_191,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_191); */
       signal_eval(process_status_191,1,__gen_e_acsl_literal_string_255);
       __e_acsl_delete_block((void *)(& process_status_191));
     }
@@ -5488,7 +5348,6 @@ int main(int argc, char const **argv)
       int process_status_192;
       __e_acsl_store_block((void *)(& process_status_192),(size_t)4);
       __gen_e_acsl_waitpid(pid_192,& process_status_192,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_192); */
       signal_eval(process_status_192,1,__gen_e_acsl_literal_string_255);
       __e_acsl_delete_block((void *)(& process_status_192));
     }
@@ -5503,7 +5362,6 @@ int main(int argc, char const **argv)
       int process_status_193;
       __e_acsl_store_block((void *)(& process_status_193),(size_t)4);
       __gen_e_acsl_waitpid(pid_193,& process_status_193,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_193); */
       signal_eval(process_status_193,0,__gen_e_acsl_literal_string_257);
       __e_acsl_delete_block((void *)(& process_status_193));
     }
@@ -5518,7 +5376,6 @@ int main(int argc, char const **argv)
       int process_status_194;
       __e_acsl_store_block((void *)(& process_status_194),(size_t)4);
       __gen_e_acsl_waitpid(pid_194,& process_status_194,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_194); */
       signal_eval(process_status_194,0,__gen_e_acsl_literal_string_257);
       __e_acsl_delete_block((void *)(& process_status_194));
     }
@@ -5533,7 +5390,6 @@ int main(int argc, char const **argv)
       int process_status_195;
       __e_acsl_store_block((void *)(& process_status_195),(size_t)4);
       __gen_e_acsl_waitpid(pid_195,& process_status_195,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_195); */
       signal_eval(process_status_195,1,__gen_e_acsl_literal_string_258);
       __e_acsl_delete_block((void *)(& process_status_195));
     }
@@ -5548,7 +5404,6 @@ int main(int argc, char const **argv)
       int process_status_196;
       __e_acsl_store_block((void *)(& process_status_196),(size_t)4);
       __gen_e_acsl_waitpid(pid_196,& process_status_196,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_196); */
       signal_eval(process_status_196,1,__gen_e_acsl_literal_string_258);
       __e_acsl_delete_block((void *)(& process_status_196));
     }
@@ -5563,7 +5418,6 @@ int main(int argc, char const **argv)
       int process_status_197;
       __e_acsl_store_block((void *)(& process_status_197),(size_t)4);
       __gen_e_acsl_waitpid(pid_197,& process_status_197,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_197); */
       signal_eval(process_status_197,1,__gen_e_acsl_literal_string_259);
       __e_acsl_delete_block((void *)(& process_status_197));
     }
@@ -5578,7 +5432,6 @@ int main(int argc, char const **argv)
       int process_status_198;
       __e_acsl_store_block((void *)(& process_status_198),(size_t)4);
       __gen_e_acsl_waitpid(pid_198,& process_status_198,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_198); */
       signal_eval(process_status_198,1,__gen_e_acsl_literal_string_259);
       __e_acsl_delete_block((void *)(& process_status_198));
     }
@@ -5593,7 +5446,6 @@ int main(int argc, char const **argv)
       int process_status_199;
       __e_acsl_store_block((void *)(& process_status_199),(size_t)4);
       __gen_e_acsl_waitpid(pid_199,& process_status_199,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_199); */
       signal_eval(process_status_199,1,__gen_e_acsl_literal_string_261);
       __e_acsl_delete_block((void *)(& process_status_199));
     }
@@ -5608,7 +5460,6 @@ int main(int argc, char const **argv)
       int process_status_200;
       __e_acsl_store_block((void *)(& process_status_200),(size_t)4);
       __gen_e_acsl_waitpid(pid_200,& process_status_200,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_200); */
       signal_eval(process_status_200,1,__gen_e_acsl_literal_string_261);
       __e_acsl_delete_block((void *)(& process_status_200));
     }
@@ -5623,7 +5474,6 @@ int main(int argc, char const **argv)
       int process_status_201;
       __e_acsl_store_block((void *)(& process_status_201),(size_t)4);
       __gen_e_acsl_waitpid(pid_201,& process_status_201,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_201); */
       signal_eval(process_status_201,0,__gen_e_acsl_literal_string_263);
       __e_acsl_delete_block((void *)(& process_status_201));
     }
@@ -5638,7 +5488,6 @@ int main(int argc, char const **argv)
       int process_status_202;
       __e_acsl_store_block((void *)(& process_status_202),(size_t)4);
       __gen_e_acsl_waitpid(pid_202,& process_status_202,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_202); */
       signal_eval(process_status_202,0,__gen_e_acsl_literal_string_263);
       __e_acsl_delete_block((void *)(& process_status_202));
     }
@@ -5653,7 +5502,6 @@ int main(int argc, char const **argv)
       int process_status_203;
       __e_acsl_store_block((void *)(& process_status_203),(size_t)4);
       __gen_e_acsl_waitpid(pid_203,& process_status_203,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_203); */
       signal_eval(process_status_203,1,__gen_e_acsl_literal_string_264);
       __e_acsl_delete_block((void *)(& process_status_203));
     }
@@ -5668,7 +5516,6 @@ int main(int argc, char const **argv)
       int process_status_204;
       __e_acsl_store_block((void *)(& process_status_204),(size_t)4);
       __gen_e_acsl_waitpid(pid_204,& process_status_204,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_204); */
       signal_eval(process_status_204,1,__gen_e_acsl_literal_string_264);
       __e_acsl_delete_block((void *)(& process_status_204));
     }
@@ -5683,7 +5530,6 @@ int main(int argc, char const **argv)
       int process_status_205;
       __e_acsl_store_block((void *)(& process_status_205),(size_t)4);
       __gen_e_acsl_waitpid(pid_205,& process_status_205,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_205); */
       signal_eval(process_status_205,1,__gen_e_acsl_literal_string_265);
       __e_acsl_delete_block((void *)(& process_status_205));
     }
@@ -5698,7 +5544,6 @@ int main(int argc, char const **argv)
       int process_status_206;
       __e_acsl_store_block((void *)(& process_status_206),(size_t)4);
       __gen_e_acsl_waitpid(pid_206,& process_status_206,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_206); */
       signal_eval(process_status_206,1,__gen_e_acsl_literal_string_265);
       __e_acsl_delete_block((void *)(& process_status_206));
     }
@@ -5713,7 +5558,6 @@ int main(int argc, char const **argv)
       int process_status_207;
       __e_acsl_store_block((void *)(& process_status_207),(size_t)4);
       __gen_e_acsl_waitpid(pid_207,& process_status_207,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_207); */
       signal_eval(process_status_207,1,__gen_e_acsl_literal_string_267);
       __e_acsl_delete_block((void *)(& process_status_207));
     }
@@ -5728,7 +5572,6 @@ int main(int argc, char const **argv)
       int process_status_208;
       __e_acsl_store_block((void *)(& process_status_208),(size_t)4);
       __gen_e_acsl_waitpid(pid_208,& process_status_208,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_208); */
       signal_eval(process_status_208,1,__gen_e_acsl_literal_string_267);
       __e_acsl_delete_block((void *)(& process_status_208));
     }
@@ -5743,7 +5586,6 @@ int main(int argc, char const **argv)
       int process_status_209;
       __e_acsl_store_block((void *)(& process_status_209),(size_t)4);
       __gen_e_acsl_waitpid(pid_209,& process_status_209,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_209); */
       signal_eval(process_status_209,0,__gen_e_acsl_literal_string_269);
       __e_acsl_delete_block((void *)(& process_status_209));
     }
@@ -5758,7 +5600,6 @@ int main(int argc, char const **argv)
       int process_status_210;
       __e_acsl_store_block((void *)(& process_status_210),(size_t)4);
       __gen_e_acsl_waitpid(pid_210,& process_status_210,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_210); */
       signal_eval(process_status_210,0,__gen_e_acsl_literal_string_269);
       __e_acsl_delete_block((void *)(& process_status_210));
     }
@@ -5773,7 +5614,6 @@ int main(int argc, char const **argv)
       int process_status_211;
       __e_acsl_store_block((void *)(& process_status_211),(size_t)4);
       __gen_e_acsl_waitpid(pid_211,& process_status_211,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_211); */
       signal_eval(process_status_211,1,__gen_e_acsl_literal_string_270);
       __e_acsl_delete_block((void *)(& process_status_211));
     }
@@ -5788,7 +5628,6 @@ int main(int argc, char const **argv)
       int process_status_212;
       __e_acsl_store_block((void *)(& process_status_212),(size_t)4);
       __gen_e_acsl_waitpid(pid_212,& process_status_212,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_212); */
       signal_eval(process_status_212,1,__gen_e_acsl_literal_string_270);
       __e_acsl_delete_block((void *)(& process_status_212));
     }
@@ -5803,7 +5642,6 @@ int main(int argc, char const **argv)
       int process_status_213;
       __e_acsl_store_block((void *)(& process_status_213),(size_t)4);
       __gen_e_acsl_waitpid(pid_213,& process_status_213,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_213); */
       signal_eval(process_status_213,1,__gen_e_acsl_literal_string_271);
       __e_acsl_delete_block((void *)(& process_status_213));
     }
@@ -5818,7 +5656,6 @@ int main(int argc, char const **argv)
       int process_status_214;
       __e_acsl_store_block((void *)(& process_status_214),(size_t)4);
       __gen_e_acsl_waitpid(pid_214,& process_status_214,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_214); */
       signal_eval(process_status_214,1,__gen_e_acsl_literal_string_271);
       __e_acsl_delete_block((void *)(& process_status_214));
     }
@@ -5833,7 +5670,6 @@ int main(int argc, char const **argv)
       int process_status_215;
       __e_acsl_store_block((void *)(& process_status_215),(size_t)4);
       __gen_e_acsl_waitpid(pid_215,& process_status_215,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_215); */
       signal_eval(process_status_215,1,__gen_e_acsl_literal_string_273);
       __e_acsl_delete_block((void *)(& process_status_215));
     }
@@ -5848,7 +5684,6 @@ int main(int argc, char const **argv)
       int process_status_216;
       __e_acsl_store_block((void *)(& process_status_216),(size_t)4);
       __gen_e_acsl_waitpid(pid_216,& process_status_216,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_216); */
       signal_eval(process_status_216,1,__gen_e_acsl_literal_string_273);
       __e_acsl_delete_block((void *)(& process_status_216));
     }
@@ -5863,7 +5698,6 @@ int main(int argc, char const **argv)
       int process_status_217;
       __e_acsl_store_block((void *)(& process_status_217),(size_t)4);
       __gen_e_acsl_waitpid(pid_217,& process_status_217,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_217); */
       signal_eval(process_status_217,0,__gen_e_acsl_literal_string_275);
       __e_acsl_delete_block((void *)(& process_status_217));
     }
@@ -5878,7 +5712,6 @@ int main(int argc, char const **argv)
       int process_status_218;
       __e_acsl_store_block((void *)(& process_status_218),(size_t)4);
       __gen_e_acsl_waitpid(pid_218,& process_status_218,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_218); */
       signal_eval(process_status_218,0,__gen_e_acsl_literal_string_275);
       __e_acsl_delete_block((void *)(& process_status_218));
     }
@@ -5893,7 +5726,6 @@ int main(int argc, char const **argv)
       int process_status_219;
       __e_acsl_store_block((void *)(& process_status_219),(size_t)4);
       __gen_e_acsl_waitpid(pid_219,& process_status_219,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_219); */
       signal_eval(process_status_219,1,__gen_e_acsl_literal_string_276);
       __e_acsl_delete_block((void *)(& process_status_219));
     }
@@ -5908,7 +5740,6 @@ int main(int argc, char const **argv)
       int process_status_220;
       __e_acsl_store_block((void *)(& process_status_220),(size_t)4);
       __gen_e_acsl_waitpid(pid_220,& process_status_220,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_220); */
       signal_eval(process_status_220,1,__gen_e_acsl_literal_string_276);
       __e_acsl_delete_block((void *)(& process_status_220));
     }
@@ -5923,7 +5754,6 @@ int main(int argc, char const **argv)
       int process_status_221;
       __e_acsl_store_block((void *)(& process_status_221),(size_t)4);
       __gen_e_acsl_waitpid(pid_221,& process_status_221,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_221); */
       signal_eval(process_status_221,1,__gen_e_acsl_literal_string_277);
       __e_acsl_delete_block((void *)(& process_status_221));
     }
@@ -5938,7 +5768,6 @@ int main(int argc, char const **argv)
       int process_status_222;
       __e_acsl_store_block((void *)(& process_status_222),(size_t)4);
       __gen_e_acsl_waitpid(pid_222,& process_status_222,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_222); */
       signal_eval(process_status_222,1,__gen_e_acsl_literal_string_277);
       __e_acsl_delete_block((void *)(& process_status_222));
     }
@@ -5953,7 +5782,6 @@ int main(int argc, char const **argv)
       int process_status_223;
       __e_acsl_store_block((void *)(& process_status_223),(size_t)4);
       __gen_e_acsl_waitpid(pid_223,& process_status_223,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_223); */
       signal_eval(process_status_223,0,__gen_e_acsl_literal_string_279);
       __e_acsl_delete_block((void *)(& process_status_223));
     }
@@ -5968,7 +5796,6 @@ int main(int argc, char const **argv)
       int process_status_224;
       __e_acsl_store_block((void *)(& process_status_224),(size_t)4);
       __gen_e_acsl_waitpid(pid_224,& process_status_224,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_224); */
       signal_eval(process_status_224,0,__gen_e_acsl_literal_string_280);
       __e_acsl_delete_block((void *)(& process_status_224));
     }
@@ -5983,7 +5810,6 @@ int main(int argc, char const **argv)
       int process_status_225;
       __e_acsl_store_block((void *)(& process_status_225),(size_t)4);
       __gen_e_acsl_waitpid(pid_225,& process_status_225,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_225); */
       signal_eval(process_status_225,0,__gen_e_acsl_literal_string_281);
       __e_acsl_delete_block((void *)(& process_status_225));
     }
@@ -5998,7 +5824,6 @@ int main(int argc, char const **argv)
       int process_status_226;
       __e_acsl_store_block((void *)(& process_status_226),(size_t)4);
       __gen_e_acsl_waitpid(pid_226,& process_status_226,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_226); */
       signal_eval(process_status_226,1,__gen_e_acsl_literal_string_282);
       __e_acsl_delete_block((void *)(& process_status_226));
     }
@@ -6013,7 +5838,6 @@ int main(int argc, char const **argv)
       int process_status_227;
       __e_acsl_store_block((void *)(& process_status_227),(size_t)4);
       __gen_e_acsl_waitpid(pid_227,& process_status_227,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_227); */
       signal_eval(process_status_227,1,__gen_e_acsl_literal_string_283);
       __e_acsl_delete_block((void *)(& process_status_227));
     }
@@ -6029,7 +5853,6 @@ int main(int argc, char const **argv)
       int process_status_228;
       __e_acsl_store_block((void *)(& process_status_228),(size_t)4);
       __gen_e_acsl_waitpid(pid_228,& process_status_228,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_228); */
       signal_eval(process_status_228,1,__gen_e_acsl_literal_string_284);
       __e_acsl_delete_block((void *)(& process_status_228));
     }
@@ -6044,7 +5867,6 @@ int main(int argc, char const **argv)
       int process_status_229;
       __e_acsl_store_block((void *)(& process_status_229),(size_t)4);
       __gen_e_acsl_waitpid(pid_229,& process_status_229,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_229); */
       signal_eval(process_status_229,1,__gen_e_acsl_literal_string_285);
       __e_acsl_delete_block((void *)(& process_status_229));
     }
@@ -6059,7 +5881,6 @@ int main(int argc, char const **argv)
       int process_status_230;
       __e_acsl_store_block((void *)(& process_status_230),(size_t)4);
       __gen_e_acsl_waitpid(pid_230,& process_status_230,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_230); */
       signal_eval(process_status_230,0,__gen_e_acsl_literal_string_287);
       __e_acsl_delete_block((void *)(& process_status_230));
     }
@@ -6074,7 +5895,6 @@ int main(int argc, char const **argv)
       int process_status_231;
       __e_acsl_store_block((void *)(& process_status_231),(size_t)4);
       __gen_e_acsl_waitpid(pid_231,& process_status_231,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_231); */
       signal_eval(process_status_231,1,__gen_e_acsl_literal_string_288);
       __e_acsl_delete_block((void *)(& process_status_231));
     }
@@ -6089,7 +5909,6 @@ int main(int argc, char const **argv)
       int process_status_232;
       __e_acsl_store_block((void *)(& process_status_232),(size_t)4);
       __gen_e_acsl_waitpid(pid_232,& process_status_232,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_232); */
       signal_eval(process_status_232,0,__gen_e_acsl_literal_string_290);
       __e_acsl_delete_block((void *)(& process_status_232));
     }
@@ -6104,7 +5923,6 @@ int main(int argc, char const **argv)
       int process_status_233;
       __e_acsl_store_block((void *)(& process_status_233),(size_t)4);
       __gen_e_acsl_waitpid(pid_233,& process_status_233,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_233); */
       signal_eval(process_status_233,0,__gen_e_acsl_literal_string_291);
       __e_acsl_delete_block((void *)(& process_status_233));
     }
@@ -6119,7 +5937,6 @@ int main(int argc, char const **argv)
       int process_status_234;
       __e_acsl_store_block((void *)(& process_status_234),(size_t)4);
       __gen_e_acsl_waitpid(pid_234,& process_status_234,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_234); */
       signal_eval(process_status_234,1,__gen_e_acsl_literal_string_292);
       __e_acsl_delete_block((void *)(& process_status_234));
     }
@@ -6134,7 +5951,6 @@ int main(int argc, char const **argv)
       int process_status_235;
       __e_acsl_store_block((void *)(& process_status_235),(size_t)4);
       __gen_e_acsl_waitpid(pid_235,& process_status_235,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_235); */
       signal_eval(process_status_235,1,__gen_e_acsl_literal_string_293);
       __e_acsl_delete_block((void *)(& process_status_235));
     }
@@ -6150,7 +5966,6 @@ int main(int argc, char const **argv)
       int process_status_236;
       __e_acsl_store_block((void *)(& process_status_236),(size_t)4);
       __gen_e_acsl_waitpid(pid_236,& process_status_236,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_236); */
       signal_eval(process_status_236,1,__gen_e_acsl_literal_string_294);
       __e_acsl_delete_block((void *)(& process_status_236));
     }
@@ -6158,7 +5973,6 @@ int main(int argc, char const **argv)
   {
     pid_t pid_237 = __gen_e_acsl_fork();
     if (! pid_237) {
-      /*@ assert Eva: initialization: \initialized(&s2); */
       __e_acsl_builtin_printf("s",__gen_e_acsl_literal_string_289,s2);
       __gen_e_acsl_exit(0);
     }
@@ -6166,7 +5980,6 @@ int main(int argc, char const **argv)
       int process_status_237;
       __e_acsl_store_block((void *)(& process_status_237),(size_t)4);
       __gen_e_acsl_waitpid(pid_237,& process_status_237,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_237); */
       signal_eval(process_status_237,1,__gen_e_acsl_literal_string_295);
       __e_acsl_delete_block((void *)(& process_status_237));
     }
@@ -6182,7 +5995,6 @@ int main(int argc, char const **argv)
       int process_status_238;
       __e_acsl_store_block((void *)(& process_status_238),(size_t)4);
       __gen_e_acsl_waitpid(pid_238,& process_status_238,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_238); */
       signal_eval(process_status_238,0,__gen_e_acsl_literal_string_296);
       __e_acsl_delete_block((void *)(& process_status_238));
     }
@@ -6198,7 +6010,6 @@ int main(int argc, char const **argv)
       int process_status_239;
       __e_acsl_store_block((void *)(& process_status_239),(size_t)4);
       __gen_e_acsl_waitpid(pid_239,& process_status_239,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_239); */
       signal_eval(process_status_239,1,__gen_e_acsl_literal_string_297);
       __e_acsl_delete_block((void *)(& process_status_239));
     }
@@ -6213,7 +6024,6 @@ int main(int argc, char const **argv)
       int process_status_240;
       __e_acsl_store_block((void *)(& process_status_240),(size_t)4);
       __gen_e_acsl_waitpid(pid_240,& process_status_240,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_240); */
       signal_eval(process_status_240,0,__gen_e_acsl_literal_string_299);
       __e_acsl_delete_block((void *)(& process_status_240));
     }
@@ -6228,7 +6038,6 @@ int main(int argc, char const **argv)
       int process_status_241;
       __e_acsl_store_block((void *)(& process_status_241),(size_t)4);
       __gen_e_acsl_waitpid(pid_241,& process_status_241,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_241); */
       signal_eval(process_status_241,0,__gen_e_acsl_literal_string_301);
       __e_acsl_delete_block((void *)(& process_status_241));
     }
@@ -6243,7 +6052,6 @@ int main(int argc, char const **argv)
       int process_status_242;
       __e_acsl_store_block((void *)(& process_status_242),(size_t)4);
       __gen_e_acsl_waitpid(pid_242,& process_status_242,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_242); */
       signal_eval(process_status_242,0,__gen_e_acsl_literal_string_303);
       __e_acsl_delete_block((void *)(& process_status_242));
     }
@@ -6258,7 +6066,6 @@ int main(int argc, char const **argv)
       int process_status_243;
       __e_acsl_store_block((void *)(& process_status_243),(size_t)4);
       __gen_e_acsl_waitpid(pid_243,& process_status_243,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_243); */
       signal_eval(process_status_243,0,__gen_e_acsl_literal_string_305);
       __e_acsl_delete_block((void *)(& process_status_243));
     }
@@ -6273,7 +6080,6 @@ int main(int argc, char const **argv)
       int process_status_244;
       __e_acsl_store_block((void *)(& process_status_244),(size_t)4);
       __gen_e_acsl_waitpid(pid_244,& process_status_244,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_244); */
       signal_eval(process_status_244,1,__gen_e_acsl_literal_string_307);
       __e_acsl_delete_block((void *)(& process_status_244));
     }
@@ -6288,7 +6094,6 @@ int main(int argc, char const **argv)
       int process_status_245;
       __e_acsl_store_block((void *)(& process_status_245),(size_t)4);
       __gen_e_acsl_waitpid(pid_245,& process_status_245,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_245); */
       signal_eval(process_status_245,0,__gen_e_acsl_literal_string_309);
       __e_acsl_delete_block((void *)(& process_status_245));
     }
@@ -6303,7 +6108,6 @@ int main(int argc, char const **argv)
       int process_status_246;
       __e_acsl_store_block((void *)(& process_status_246),(size_t)4);
       __gen_e_acsl_waitpid(pid_246,& process_status_246,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_246); */
       signal_eval(process_status_246,1,__gen_e_acsl_literal_string_310);
       __e_acsl_delete_block((void *)(& process_status_246));
     }
@@ -6318,7 +6122,6 @@ int main(int argc, char const **argv)
       int process_status_247;
       __e_acsl_store_block((void *)(& process_status_247),(size_t)4);
       __gen_e_acsl_waitpid(pid_247,& process_status_247,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_247); */
       signal_eval(process_status_247,1,__gen_e_acsl_literal_string_311);
       __e_acsl_delete_block((void *)(& process_status_247));
     }
@@ -6333,7 +6136,6 @@ int main(int argc, char const **argv)
       int process_status_248;
       __e_acsl_store_block((void *)(& process_status_248),(size_t)4);
       __gen_e_acsl_waitpid(pid_248,& process_status_248,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_248); */
       signal_eval(process_status_248,0,__gen_e_acsl_literal_string_313);
       __e_acsl_delete_block((void *)(& process_status_248));
     }
@@ -6348,7 +6150,6 @@ int main(int argc, char const **argv)
       int process_status_249;
       __e_acsl_store_block((void *)(& process_status_249),(size_t)4);
       __gen_e_acsl_waitpid(pid_249,& process_status_249,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_249); */
       signal_eval(process_status_249,1,__gen_e_acsl_literal_string_314);
       __e_acsl_delete_block((void *)(& process_status_249));
     }
@@ -6363,7 +6164,6 @@ int main(int argc, char const **argv)
       int process_status_250;
       __e_acsl_store_block((void *)(& process_status_250),(size_t)4);
       __gen_e_acsl_waitpid(pid_250,& process_status_250,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_250); */
       signal_eval(process_status_250,1,__gen_e_acsl_literal_string_315);
       __e_acsl_delete_block((void *)(& process_status_250));
     }
@@ -6379,7 +6179,6 @@ int main(int argc, char const **argv)
       int process_status_251;
       __e_acsl_store_block((void *)(& process_status_251),(size_t)4);
       __gen_e_acsl_waitpid(pid_251,& process_status_251,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_251); */
       signal_eval(process_status_251,1,__gen_e_acsl_literal_string_316);
       __e_acsl_delete_block((void *)(& process_status_251));
     }
@@ -6394,7 +6193,6 @@ int main(int argc, char const **argv)
       int process_status_252;
       __e_acsl_store_block((void *)(& process_status_252),(size_t)4);
       __gen_e_acsl_waitpid(pid_252,& process_status_252,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_252); */
       signal_eval(process_status_252,1,__gen_e_acsl_literal_string_318);
       __e_acsl_delete_block((void *)(& process_status_252));
     }
@@ -6409,7 +6207,6 @@ int main(int argc, char const **argv)
       int process_status_253;
       __e_acsl_store_block((void *)(& process_status_253),(size_t)4);
       __gen_e_acsl_waitpid(pid_253,& process_status_253,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_253); */
       signal_eval(process_status_253,1,__gen_e_acsl_literal_string_320);
       __e_acsl_delete_block((void *)(& process_status_253));
     }
@@ -6424,7 +6221,6 @@ int main(int argc, char const **argv)
       int process_status_254;
       __e_acsl_store_block((void *)(& process_status_254),(size_t)4);
       __gen_e_acsl_waitpid(pid_254,& process_status_254,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_254); */
       signal_eval(process_status_254,1,__gen_e_acsl_literal_string_322);
       __e_acsl_delete_block((void *)(& process_status_254));
     }
@@ -6439,7 +6235,6 @@ int main(int argc, char const **argv)
       int process_status_255;
       __e_acsl_store_block((void *)(& process_status_255),(size_t)4);
       __gen_e_acsl_waitpid(pid_255,& process_status_255,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_255); */
       signal_eval(process_status_255,1,__gen_e_acsl_literal_string_324);
       __e_acsl_delete_block((void *)(& process_status_255));
     }
@@ -6454,7 +6249,6 @@ int main(int argc, char const **argv)
       int process_status_256;
       __e_acsl_store_block((void *)(& process_status_256),(size_t)4);
       __gen_e_acsl_waitpid(pid_256,& process_status_256,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_256); */
       signal_eval(process_status_256,1,__gen_e_acsl_literal_string_326);
       __e_acsl_delete_block((void *)(& process_status_256));
     }
@@ -6469,7 +6263,6 @@ int main(int argc, char const **argv)
       int process_status_257;
       __e_acsl_store_block((void *)(& process_status_257),(size_t)4);
       __gen_e_acsl_waitpid(pid_257,& process_status_257,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_257); */
       signal_eval(process_status_257,1,__gen_e_acsl_literal_string_328);
       __e_acsl_delete_block((void *)(& process_status_257));
     }
@@ -6484,7 +6277,6 @@ int main(int argc, char const **argv)
       int process_status_258;
       __e_acsl_store_block((void *)(& process_status_258),(size_t)4);
       __gen_e_acsl_waitpid(pid_258,& process_status_258,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_258); */
       signal_eval(process_status_258,1,__gen_e_acsl_literal_string_330);
       __e_acsl_delete_block((void *)(& process_status_258));
     }
@@ -6499,7 +6291,6 @@ int main(int argc, char const **argv)
       int process_status_259;
       __e_acsl_store_block((void *)(& process_status_259),(size_t)4);
       __gen_e_acsl_waitpid(pid_259,& process_status_259,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_259); */
       signal_eval(process_status_259,1,__gen_e_acsl_literal_string_332);
       __e_acsl_delete_block((void *)(& process_status_259));
     }
@@ -6514,7 +6305,6 @@ int main(int argc, char const **argv)
       int process_status_260;
       __e_acsl_store_block((void *)(& process_status_260),(size_t)4);
       __gen_e_acsl_waitpid(pid_260,& process_status_260,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_260); */
       signal_eval(process_status_260,1,__gen_e_acsl_literal_string_333);
       __e_acsl_delete_block((void *)(& process_status_260));
     }
@@ -6529,7 +6319,6 @@ int main(int argc, char const **argv)
       int process_status_261;
       __e_acsl_store_block((void *)(& process_status_261),(size_t)4);
       __gen_e_acsl_waitpid(pid_261,& process_status_261,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_261); */
       signal_eval(process_status_261,1,__gen_e_acsl_literal_string_335);
       __e_acsl_delete_block((void *)(& process_status_261));
     }
@@ -6544,7 +6333,6 @@ int main(int argc, char const **argv)
       int process_status_262;
       __e_acsl_store_block((void *)(& process_status_262),(size_t)4);
       __gen_e_acsl_waitpid(pid_262,& process_status_262,0);
-      /*@ assert Eva: initialization: \initialized(&process_status_262); */
       signal_eval(process_status_262,1,__gen_e_acsl_literal_string_337);
       __e_acsl_delete_block((void *)(& process_status_262));
     }
@@ -6552,7 +6340,7 @@ int main(int argc, char const **argv)
   __retres = 0;
   __e_acsl_delete_block((void *)(& argc));
   __e_acsl_delete_block((void *)(& vptr));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/format/oracle_ci/printf.res.oracle b/src/plugins/e-acsl/tests/format/oracle_ci/printf.res.oracle
index 61b4cbef62c5fb1201aee5ba31e520cc5c13c490..7e9dbd5e9e4cc0ccf159e9c4c9bdbb7ba25a2110 100644
--- a/src/plugins/e-acsl/tests/format/oracle_ci/printf.res.oracle
+++ b/src/plugins/e-acsl/tests/format/oracle_ci/printf.res.oracle
@@ -25,12 +25,15 @@
   if there are memory-related annotations.
 [e-acsl] FRAMAC_SHARE/libc/string.h:351: Warning: 
   E-ACSL construct `\separated' is not yet supported. Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:92: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:79: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/sys/wait.h:86: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/unistd.h:854: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/string.h:351: Warning: 
   E-ACSL construct `logic functions with labels' is not yet supported.
   Ignoring annotation.
@@ -40,24 +43,39 @@
   Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/string.h:354: Warning: 
   E-ACSL construct `\separated' is not yet supported. Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/string.h:354: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/string.h:351: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/string.h:357: Warning: 
   E-ACSL construct `logic functions performing read accesses'
   is not yet supported.
   Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/string.h:160: Warning: 
+  E-ACSL construct `user-defined logic type' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/string.h:167: Warning: 
+  E-ACSL construct `user-defined logic type' is not yet supported.
+  Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/string.h:157: Warning: 
   E-ACSL construct `logic functions with labels' is not yet supported.
   Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/string.h:171: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/string.h:157: Warning: 
+  Some assumes clauses couldn't be translated.
+  Ignoring complete and disjoint behaviors annotations.
+[e-acsl] FRAMAC_SHARE/libc/string.h:157: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/string.h:160: Warning: 
-  E-ACSL construct `user-defined logic type' is not yet supported.
+[e-acsl] FRAMAC_SHARE/libc/string.h:163: Warning: 
+  E-ACSL construct `logic functions performing read accesses'
+  is not yet supported.
   Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/string.h:167: Warning: 
-  E-ACSL construct `user-defined logic type' is not yet supported.
+[e-acsl] FRAMAC_SHARE/libc/string.h:164: Warning: 
+  E-ACSL construct `logic functions with labels' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/string.h:165: Warning: 
+  invalid E-ACSL construct
+  `non integer variable p in quantification
+  found: ∀ char *p; \old(s) ≤ p < \result ⇒ *p ≢ (char)\old(c)'.
   Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/string.h:125: Warning: 
   E-ACSL construct `logic functions with labels' is not yet supported.
@@ -69,17 +87,17 @@
   E-ACSL construct `logic functions performing read accesses'
   is not yet supported.
   Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/string.h:127: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:470: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/string.h:127: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:472: Warning: 
   E-ACSL construct `abnormal termination case in behavior'
   is not yet supported.
   Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/stdlib.h:473: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:457: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/stdlib.h:473: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:459: Warning: 
   E-ACSL construct `abnormal termination case in behavior'
   is not yet supported.
   Ignoring annotation.
@@ -90,565 +108,3 @@
   function __gen_e_acsl_fork: postcondition 'result_ok_child_or_error' got status unknown.
 [kernel:annot:missing-spec] tests/format/printf.c:180: Warning: 
   Neither code nor specification for function __e_acsl_builtin_printf, generating default assigns from the prototype
-[eva:alarm] FRAMAC_SHARE/libc/sys/wait.h:86: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva:alarm] FRAMAC_SHARE/libc/sys/wait.h:86: Warning: 
-  function __gen_e_acsl_waitpid: postcondition 'initialization,stat_loc_init_on_success' got status unknown.
-[eva:alarm] tests/format/printf.c:180: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status);
-[kernel:annot:missing-spec] tests/format/signalled.h:17: Warning: 
-  Neither code nor specification for function __e_acsl_builtin_fprintf, generating default assigns from the prototype
-[eva:alarm] tests/format/printf.c:183: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_0);
-[eva:alarm] tests/format/printf.c:186: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_1);
-[eva:alarm] tests/format/printf.c:189: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_2);
-[eva:alarm] tests/format/printf.c:194: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_3);
-[eva:alarm] tests/format/printf.c:197: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_4);
-[eva:alarm] tests/format/printf.c:199: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_5);
-[eva:alarm] tests/format/printf.c:201: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_6);
-[eva:alarm] tests/format/printf.c:204: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_7);
-[eva:alarm] tests/format/printf.c:206: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_8);
-[eva:alarm] tests/format/printf.c:51: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva:alarm] FRAMAC_SHARE/libc/string.h:357: Warning: 
-  function __gen_e_acsl_strcpy: postcondition 'equal_contents' got status unknown.
-[eva:alarm] FRAMAC_SHARE/libc/string.h:165: Warning: 
-  function __gen_e_acsl_strchr, behavior found: postcondition 'result_first_occur' got status unknown.
-[eva:alarm] tests/format/printf.c:59: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status);
-[eva:alarm] FRAMAC_SHARE/libc/string.h:161: Warning: 
-  function __gen_e_acsl_strchr, behavior found: postcondition 'result_char' got status unknown.
-[eva:alarm] FRAMAC_SHARE/libc/string.h:161: Warning: 
-  function __gen_e_acsl_strchr, behavior found: postcondition 'result_char' got status unknown. (Behavior may be inactive, no reduction performed.)
-[eva:alarm] FRAMAC_SHARE/libc/string.h:162: Warning: 
-  function __gen_e_acsl_strchr, behavior found: postcondition 'result_same_base' got status unknown. (Behavior may be inactive, no reduction performed.)
-[eva:alarm] FRAMAC_SHARE/libc/string.h:163: Warning: 
-  function __gen_e_acsl_strchr, behavior found: postcondition 'result_in_length' got status unknown. (Behavior may be inactive, no reduction performed.)
-[eva:alarm] FRAMAC_SHARE/libc/string.h:164: Warning: 
-  function __gen_e_acsl_strchr, behavior found: postcondition 'result_valid_string' got status unknown. (Behavior may be inactive, no reduction performed.)
-[eva:alarm] FRAMAC_SHARE/libc/string.h:165: Warning: 
-  function __gen_e_acsl_strchr, behavior found: postcondition 'result_first_occur' got status unknown. (Behavior may be inactive, no reduction performed.)
-[eva:alarm] FRAMAC_SHARE/libc/string.h:168: Warning: 
-  function __gen_e_acsl_strchr, behavior not_found: postcondition 'result_null' got status unknown. (Behavior may be inactive, no reduction performed.)
-[eva:alarm] tests/format/printf.c:62: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_0);
-[eva:alarm] tests/format/signalled.h:17: Warning: 
-  signed overflow. assert testno + 1 ≤ 2147483647;
-[eva:alarm] tests/format/printf.c:224: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_9);
-[eva:alarm] tests/format/printf.c:225: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_10);
-[eva:alarm] tests/format/printf.c:226: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_11);
-[eva:alarm] tests/format/printf.c:233: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_12);
-[eva:alarm] tests/format/printf.c:233: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_13);
-[eva:alarm] tests/format/printf.c:234: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_14);
-[eva:alarm] tests/format/printf.c:234: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_15);
-[eva:alarm] tests/format/printf.c:235: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_16);
-[eva:alarm] tests/format/printf.c:235: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_17);
-[eva:alarm] tests/format/printf.c:235: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_18);
-[eva:alarm] tests/format/printf.c:239: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_19);
-[eva:alarm] tests/format/printf.c:239: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_20);
-[eva:alarm] tests/format/printf.c:240: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_21);
-[eva:alarm] tests/format/printf.c:240: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_22);
-[eva:alarm] tests/format/printf.c:241: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_23);
-[eva:alarm] tests/format/printf.c:241: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_24);
-[eva:alarm] tests/format/printf.c:241: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_25);
-[eva:alarm] tests/format/printf.c:245: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_26);
-[eva:alarm] tests/format/printf.c:245: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_27);
-[eva:alarm] tests/format/printf.c:246: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_28);
-[eva:alarm] tests/format/printf.c:246: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_29);
-[eva:alarm] tests/format/printf.c:247: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_30);
-[eva:alarm] tests/format/printf.c:247: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_31);
-[eva:alarm] tests/format/printf.c:249: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_32);
-[eva:alarm] tests/format/printf.c:249: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_33);
-[eva:alarm] tests/format/printf.c:250: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_34);
-[eva:alarm] tests/format/printf.c:250: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_35);
-[eva:alarm] tests/format/printf.c:251: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_36);
-[eva:alarm] tests/format/printf.c:251: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_37);
-[eva:alarm] tests/format/printf.c:252: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_38);
-[eva:alarm] tests/format/printf.c:252: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_39);
-[eva:alarm] tests/format/printf.c:254: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_40);
-[eva:alarm] tests/format/printf.c:257: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_41);
-[eva:alarm] tests/format/printf.c:261: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_42);
-[eva:alarm] tests/format/printf.c:261: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_43);
-[eva:alarm] tests/format/printf.c:262: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_44);
-[eva:alarm] tests/format/printf.c:262: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_45);
-[eva:alarm] tests/format/printf.c:263: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_46);
-[eva:alarm] tests/format/printf.c:263: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_47);
-[eva:alarm] tests/format/printf.c:263: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_48);
-[eva:alarm] tests/format/printf.c:267: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_49);
-[eva:alarm] tests/format/printf.c:267: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_50);
-[eva:alarm] tests/format/printf.c:268: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_51);
-[eva:alarm] tests/format/printf.c:268: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_52);
-[eva:alarm] tests/format/printf.c:269: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_53);
-[eva:alarm] tests/format/printf.c:269: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_54);
-[eva:alarm] tests/format/printf.c:269: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_55);
-[eva:alarm] tests/format/printf.c:277: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_56);
-[eva:alarm] tests/format/printf.c:277: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_57);
-[eva:alarm] tests/format/printf.c:281: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_58);
-[eva:alarm] tests/format/printf.c:281: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_59);
-[eva:alarm] tests/format/printf.c:282: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_60);
-[eva:alarm] tests/format/printf.c:282: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_61);
-[eva:alarm] tests/format/printf.c:282: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_62);
-[eva:alarm] tests/format/printf.c:289: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_63);
-[eva:alarm] tests/format/printf.c:289: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_64);
-[eva:alarm] tests/format/printf.c:290: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_65);
-[eva:alarm] tests/format/printf.c:290: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_66);
-[eva:alarm] tests/format/printf.c:295: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_67);
-[eva:alarm] tests/format/printf.c:295: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_68);
-[eva:alarm] tests/format/printf.c:296: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_69);
-[eva:alarm] tests/format/printf.c:300: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_70);
-[eva:alarm] tests/format/printf.c:300: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_71);
-[eva:alarm] tests/format/printf.c:301: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_72);
-[eva:alarm] tests/format/printf.c:301: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_73);
-[eva:alarm] tests/format/printf.c:302: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_74);
-[eva:alarm] tests/format/printf.c:302: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_75);
-[eva:alarm] tests/format/printf.c:303: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_76);
-[eva:alarm] tests/format/printf.c:303: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_77);
-[eva:alarm] tests/format/printf.c:307: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_78);
-[eva:alarm] tests/format/printf.c:308: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_79);
-[eva:alarm] tests/format/printf.c:309: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_80);
-[eva:alarm] tests/format/printf.c:312: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_81);
-[eva:alarm] tests/format/printf.c:312: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_82);
-[eva:alarm] tests/format/printf.c:313: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_83);
-[eva:alarm] tests/format/printf.c:313: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_84);
-[eva:alarm] tests/format/printf.c:314: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_85);
-[eva:alarm] tests/format/printf.c:314: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_86);
-[eva:alarm] tests/format/printf.c:315: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_87);
-[eva:alarm] tests/format/printf.c:315: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_88);
-[eva:alarm] tests/format/printf.c:316: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_89);
-[eva:alarm] tests/format/printf.c:316: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_90);
-[eva:alarm] tests/format/printf.c:317: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_91);
-[eva:alarm] tests/format/printf.c:317: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_92);
-[eva:alarm] tests/format/printf.c:318: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_93);
-[eva:alarm] tests/format/printf.c:318: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_94);
-[eva:alarm] tests/format/printf.c:321: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_95);
-[eva:alarm] tests/format/printf.c:321: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_96);
-[eva:alarm] tests/format/printf.c:322: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_97);
-[eva:alarm] tests/format/printf.c:322: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_98);
-[eva:alarm] tests/format/printf.c:323: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_99);
-[eva:alarm] tests/format/printf.c:323: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_100);
-[eva:alarm] tests/format/printf.c:324: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_101);
-[eva:alarm] tests/format/printf.c:324: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_102);
-[eva:alarm] tests/format/printf.c:326: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_103);
-[eva:alarm] tests/format/printf.c:326: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_104);
-[eva:alarm] tests/format/printf.c:330: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_105);
-[eva:alarm] tests/format/printf.c:330: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_106);
-[eva:alarm] tests/format/printf.c:333: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_107);
-[eva:alarm] tests/format/printf.c:333: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_108);
-[eva:alarm] tests/format/printf.c:333: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_109);
-[eva:alarm] tests/format/printf.c:333: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_110);
-[eva:alarm] tests/format/printf.c:334: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_111);
-[eva:alarm] tests/format/printf.c:334: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_112);
-[eva:alarm] tests/format/printf.c:334: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_113);
-[eva:alarm] tests/format/printf.c:334: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_114);
-[eva:alarm] tests/format/printf.c:335: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_115);
-[eva:alarm] tests/format/printf.c:335: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_116);
-[eva:alarm] tests/format/printf.c:335: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_117);
-[eva:alarm] tests/format/printf.c:335: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_118);
-[eva:alarm] tests/format/printf.c:336: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_119);
-[eva:alarm] tests/format/printf.c:336: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_120);
-[eva:alarm] tests/format/printf.c:336: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_121);
-[eva:alarm] tests/format/printf.c:336: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_122);
-[eva:alarm] tests/format/printf.c:337: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_123);
-[eva:alarm] tests/format/printf.c:337: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_124);
-[eva:alarm] tests/format/printf.c:337: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_125);
-[eva:alarm] tests/format/printf.c:337: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_126);
-[eva:alarm] tests/format/printf.c:338: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_127);
-[eva:alarm] tests/format/printf.c:338: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_128);
-[eva:alarm] tests/format/printf.c:338: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_129);
-[eva:alarm] tests/format/printf.c:338: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_130);
-[eva:alarm] tests/format/printf.c:341: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_131);
-[eva:alarm] tests/format/printf.c:341: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_132);
-[eva:alarm] tests/format/printf.c:341: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_133);
-[eva:alarm] tests/format/printf.c:341: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_134);
-[eva:alarm] tests/format/printf.c:342: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_135);
-[eva:alarm] tests/format/printf.c:342: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_136);
-[eva:alarm] tests/format/printf.c:342: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_137);
-[eva:alarm] tests/format/printf.c:342: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_138);
-[eva:alarm] tests/format/printf.c:344: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_139);
-[eva:alarm] tests/format/printf.c:344: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_140);
-[eva:alarm] tests/format/printf.c:344: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_141);
-[eva:alarm] tests/format/printf.c:344: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_142);
-[eva:alarm] tests/format/printf.c:346: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_143);
-[eva:alarm] tests/format/printf.c:346: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_144);
-[eva:alarm] tests/format/printf.c:346: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_145);
-[eva:alarm] tests/format/printf.c:346: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_146);
-[eva:alarm] tests/format/printf.c:347: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_147);
-[eva:alarm] tests/format/printf.c:347: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_148);
-[eva:alarm] tests/format/printf.c:347: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_149);
-[eva:alarm] tests/format/printf.c:347: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_150);
-[eva:alarm] tests/format/printf.c:348: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_151);
-[eva:alarm] tests/format/printf.c:348: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_152);
-[eva:alarm] tests/format/printf.c:348: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_153);
-[eva:alarm] tests/format/printf.c:348: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_154);
-[eva:alarm] tests/format/printf.c:350: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_155);
-[eva:alarm] tests/format/printf.c:350: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_156);
-[eva:alarm] tests/format/printf.c:350: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_157);
-[eva:alarm] tests/format/printf.c:350: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_158);
-[eva:alarm] tests/format/printf.c:354: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_159);
-[eva:alarm] tests/format/printf.c:354: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_160);
-[eva:alarm] tests/format/printf.c:355: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_161);
-[eva:alarm] tests/format/printf.c:355: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_162);
-[eva:alarm] tests/format/printf.c:356: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_163);
-[eva:alarm] tests/format/printf.c:356: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_164);
-[eva:alarm] tests/format/printf.c:357: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_165);
-[eva:alarm] tests/format/printf.c:357: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_166);
-[eva:alarm] tests/format/printf.c:358: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_167);
-[eva:alarm] tests/format/printf.c:358: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_168);
-[eva:alarm] tests/format/printf.c:359: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_169);
-[eva:alarm] tests/format/printf.c:359: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_170);
-[eva:alarm] tests/format/printf.c:360: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_171);
-[eva:alarm] tests/format/printf.c:360: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_172);
-[eva:alarm] tests/format/printf.c:361: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_173);
-[eva:alarm] tests/format/printf.c:361: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_174);
-[eva:alarm] tests/format/printf.c:362: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_175);
-[eva:alarm] tests/format/printf.c:362: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_176);
-[eva:alarm] tests/format/printf.c:363: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_177);
-[eva:alarm] tests/format/printf.c:363: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_178);
-[eva:alarm] tests/format/printf.c:364: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_179);
-[eva:alarm] tests/format/printf.c:364: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_180);
-[eva:alarm] tests/format/printf.c:365: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_181);
-[eva:alarm] tests/format/printf.c:365: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_182);
-[eva:alarm] tests/format/printf.c:366: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_183);
-[eva:alarm] tests/format/printf.c:366: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_184);
-[eva:alarm] tests/format/printf.c:367: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_185);
-[eva:alarm] tests/format/printf.c:367: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_186);
-[eva:alarm] tests/format/printf.c:368: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_187);
-[eva:alarm] tests/format/printf.c:368: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_188);
-[eva:alarm] tests/format/printf.c:369: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_189);
-[eva:alarm] tests/format/printf.c:369: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_190);
-[eva:alarm] tests/format/printf.c:372: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_191);
-[eva:alarm] tests/format/printf.c:372: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_192);
-[eva:alarm] tests/format/printf.c:373: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_193);
-[eva:alarm] tests/format/printf.c:373: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_194);
-[eva:alarm] tests/format/printf.c:374: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_195);
-[eva:alarm] tests/format/printf.c:374: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_196);
-[eva:alarm] tests/format/printf.c:375: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_197);
-[eva:alarm] tests/format/printf.c:375: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_198);
-[eva:alarm] tests/format/printf.c:376: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_199);
-[eva:alarm] tests/format/printf.c:376: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_200);
-[eva:alarm] tests/format/printf.c:377: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_201);
-[eva:alarm] tests/format/printf.c:377: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_202);
-[eva:alarm] tests/format/printf.c:378: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_203);
-[eva:alarm] tests/format/printf.c:378: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_204);
-[eva:alarm] tests/format/printf.c:379: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_205);
-[eva:alarm] tests/format/printf.c:379: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_206);
-[eva:alarm] tests/format/printf.c:380: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_207);
-[eva:alarm] tests/format/printf.c:380: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_208);
-[eva:alarm] tests/format/printf.c:381: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_209);
-[eva:alarm] tests/format/printf.c:381: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_210);
-[eva:alarm] tests/format/printf.c:382: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_211);
-[eva:alarm] tests/format/printf.c:382: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_212);
-[eva:alarm] tests/format/printf.c:383: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_213);
-[eva:alarm] tests/format/printf.c:383: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_214);
-[eva:alarm] tests/format/printf.c:384: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_215);
-[eva:alarm] tests/format/printf.c:384: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_216);
-[eva:alarm] tests/format/printf.c:385: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_217);
-[eva:alarm] tests/format/printf.c:385: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_218);
-[eva:alarm] tests/format/printf.c:386: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_219);
-[eva:alarm] tests/format/printf.c:386: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_220);
-[eva:alarm] tests/format/printf.c:387: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_221);
-[eva:alarm] tests/format/printf.c:387: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_222);
-[eva:alarm] tests/format/printf.c:390: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_223);
-[eva:alarm] tests/format/printf.c:391: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_224);
-[eva:alarm] tests/format/printf.c:392: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_225);
-[eva:alarm] tests/format/printf.c:393: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_226);
-[eva:alarm] tests/format/printf.c:394: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_227);
-[eva:alarm] tests/format/printf.c:395: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_228);
-[eva:alarm] tests/format/printf.c:396: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_229);
-[eva:alarm] tests/format/printf.c:399: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_230);
-[eva:alarm] tests/format/printf.c:400: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_231);
-[eva:alarm] tests/format/printf.c:407: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_232);
-[eva:alarm] tests/format/printf.c:408: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_233);
-[eva:alarm] tests/format/printf.c:409: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_234);
-[eva:alarm] tests/format/printf.c:410: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_235);
-[eva:alarm] tests/format/printf.c:415: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_236);
-[eva:alarm] tests/format/printf.c:416: Warning: 
-  accessing uninitialized left-value. assert \initialized(&s2);
-[eva:alarm] tests/format/printf.c:416: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_237);
-[eva:alarm] tests/format/printf.c:419: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_238);
-[eva:alarm] tests/format/printf.c:421: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_239);
-[eva:alarm] tests/format/printf.c:424: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_240);
-[eva:alarm] tests/format/printf.c:425: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_241);
-[eva:alarm] tests/format/printf.c:426: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_242);
-[eva:alarm] tests/format/printf.c:427: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_243);
-[eva:alarm] tests/format/printf.c:428: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_244);
-[eva:alarm] tests/format/printf.c:453: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_245);
-[eva:alarm] tests/format/printf.c:454: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_246);
-[eva:alarm] tests/format/printf.c:455: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_247);
-[eva:alarm] tests/format/printf.c:458: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_248);
-[eva:alarm] tests/format/printf.c:459: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_249);
-[eva:alarm] tests/format/printf.c:460: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_250);
-[eva:alarm] tests/format/printf.c:461: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_251);
-[eva:alarm] tests/format/printf.c:464: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_252);
-[eva:alarm] tests/format/printf.c:465: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_253);
-[eva:alarm] tests/format/printf.c:466: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_254);
-[eva:alarm] tests/format/printf.c:467: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_255);
-[eva:alarm] tests/format/printf.c:468: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_256);
-[eva:alarm] tests/format/printf.c:469: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_257);
-[eva:alarm] tests/format/printf.c:470: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_258);
-[eva:alarm] tests/format/printf.c:471: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_259);
-[eva:alarm] tests/format/printf.c:472: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_260);
-[eva:alarm] tests/format/printf.c:473: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_261);
-[eva:alarm] tests/format/printf.c:476: Warning: 
-  accessing uninitialized left-value. assert \initialized(&process_status_262);
diff --git a/src/plugins/e-acsl/tests/format/oracle_dev/printf.e-acsl.err.log b/src/plugins/e-acsl/tests/format/oracle_dev/printf.e-acsl.err.log
index 19a711261f332841d4200b024597595a077882fc..02725ad71ef446f838288ef1823a61a035f231f1 100644
--- a/src/plugins/e-acsl/tests/format/oracle_dev/printf.e-acsl.err.log
+++ b/src/plugins/e-acsl/tests/format/oracle_dev/printf.e-acsl.err.log
@@ -29,25 +29,19 @@ TEST 20: OK: Expected execution at tests/format/printf.c:209
 TEST 21: OK: Expected execution at tests/format/printf.c:209
 TEST 22: OK: Expected execution at tests/format/printf.c:209
 TEST 23: OK: Expected execution at tests/format/printf.c:209
-Format error: wrong application of precision [.] to format specifier [c]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of precision [.] to format specifier [c]
 TEST 24: OK: Expected signal at tests/format/printf.c:209
 TEST 25: OK: Expected execution at tests/format/printf.c:209
-Format error: wrong application of precision [.] to format specifier [p]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of precision [.] to format specifier [p]
 TEST 26: OK: Expected signal at tests/format/printf.c:209
-Format error: wrong application of precision [.] to format specifier [n]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of precision [.] to format specifier [n]
 TEST 27: OK: Expected signal at tests/format/printf.c:209
-Format error: wrong application of flag [#] to format specifier [d]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of flag [#] to format specifier [d]
 TEST 28: OK: Expected signal at tests/format/printf.c:215
-Format error: wrong application of flag [#] to format specifier [i]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of flag [#] to format specifier [i]
 TEST 29: OK: Expected signal at tests/format/printf.c:215
 TEST 30: OK: Expected execution at tests/format/printf.c:215
-Format error: wrong application of flag [#] to format specifier [u]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of flag [#] to format specifier [u]
 TEST 31: OK: Expected signal at tests/format/printf.c:215
 TEST 32: OK: Expected execution at tests/format/printf.c:215
 TEST 33: OK: Expected execution at tests/format/printf.c:215
@@ -58,17 +52,13 @@ TEST 37: OK: Expected execution at tests/format/printf.c:215
 TEST 38: OK: Expected execution at tests/format/printf.c:215
 TEST 39: OK: Expected execution at tests/format/printf.c:215
 TEST 40: OK: Expected execution at tests/format/printf.c:215
-Format error: wrong application of flag [#] to format specifier [c]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of flag [#] to format specifier [c]
 TEST 41: OK: Expected signal at tests/format/printf.c:215
-Format error: wrong application of flag [#] to format specifier [s]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of flag [#] to format specifier [s]
 TEST 42: OK: Expected signal at tests/format/printf.c:215
-Format error: wrong application of flag [#] to format specifier [p]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of flag [#] to format specifier [p]
 TEST 43: OK: Expected signal at tests/format/printf.c:215
-Format error: wrong application of flag [#] to format specifier [n]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of flag [#] to format specifier [n]
 TEST 44: OK: Expected signal at tests/format/printf.c:215
 TEST 45: OK: Expected execution at tests/format/printf.c:218
 TEST 46: OK: Expected execution at tests/format/printf.c:218
@@ -83,54 +73,39 @@ TEST 54: OK: Expected execution at tests/format/printf.c:218
 TEST 55: OK: Expected execution at tests/format/printf.c:218
 TEST 56: OK: Expected execution at tests/format/printf.c:218
 TEST 57: OK: Expected execution at tests/format/printf.c:218
-Format error: wrong application of flag [0] to format specifier [c]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of flag [0] to format specifier [c]
 TEST 58: OK: Expected signal at tests/format/printf.c:218
-Format error: wrong application of flag [0] to format specifier [s]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of flag [0] to format specifier [s]
 TEST 59: OK: Expected signal at tests/format/printf.c:218
-Format error: wrong application of flag [0] to format specifier [p]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of flag [0] to format specifier [p]
 TEST 60: OK: Expected signal at tests/format/printf.c:218
-Format error: wrong application of flag [0] to format specifier [n]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of flag [0] to format specifier [n]
 TEST 61: OK: Expected signal at tests/format/printf.c:218
 TEST 62: OK: Expected execution at tests/format/printf.c:224
 TEST 63: OK: Expected execution at tests/format/printf.c:225
 Format error: illegal format specifier 'l'
 TEST 64: OK: Expected signal at tests/format/printf.c:226
-Format error: wrong application of length modifier [hh] to format specifier [f]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [hh] to format specifier [f]
 TEST 65: OK: Expected signal at tests/format/printf.c:232
-Format error: wrong application of length modifier [hh] to format specifier [F]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [hh] to format specifier [F]
 TEST 66: OK: Expected signal at tests/format/printf.c:232
-Format error: wrong application of length modifier [hh] to format specifier [e]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [hh] to format specifier [e]
 TEST 67: OK: Expected signal at tests/format/printf.c:232
-Format error: wrong application of length modifier [hh] to format specifier [E]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [hh] to format specifier [E]
 TEST 68: OK: Expected signal at tests/format/printf.c:232
-Format error: wrong application of length modifier [hh] to format specifier [g]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [hh] to format specifier [g]
 TEST 69: OK: Expected signal at tests/format/printf.c:232
-Format error: wrong application of length modifier [hh] to format specifier [G]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [hh] to format specifier [G]
 TEST 70: OK: Expected signal at tests/format/printf.c:232
-Format error: wrong application of length modifier [hh] to format specifier [a]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [hh] to format specifier [a]
 TEST 71: OK: Expected signal at tests/format/printf.c:232
-Format error: wrong application of length modifier [hh] to format specifier [A]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [hh] to format specifier [A]
 TEST 72: OK: Expected signal at tests/format/printf.c:232
-Format error: wrong application of length modifier [hh] to format specifier [c]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [hh] to format specifier [c]
 TEST 73: OK: Expected signal at tests/format/printf.c:232
-Format error: wrong application of length modifier [hh] to format specifier [s]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [hh] to format specifier [s]
 TEST 74: OK: Expected signal at tests/format/printf.c:232
-Format error: wrong application of length modifier [hh] to format specifier [p]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [hh] to format specifier [p]
 TEST 75: OK: Expected signal at tests/format/printf.c:232
 TEST 76: OK: Expected execution at tests/format/printf.c:233
 TEST 77: OK: Expected execution at tests/format/printf.c:233
@@ -139,38 +114,27 @@ TEST 79: OK: Expected execution at tests/format/printf.c:234
 TEST 80: OK: Expected execution at tests/format/printf.c:235
 TEST 81: OK: Expected execution at tests/format/printf.c:235
 TEST 82: OK: Expected execution at tests/format/printf.c:235
-Format error: wrong application of length modifier [h] to format specifier [f]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [h] to format specifier [f]
 TEST 83: OK: Expected signal at tests/format/printf.c:238
-Format error: wrong application of length modifier [h] to format specifier [F]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [h] to format specifier [F]
 TEST 84: OK: Expected signal at tests/format/printf.c:238
-Format error: wrong application of length modifier [h] to format specifier [e]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [h] to format specifier [e]
 TEST 85: OK: Expected signal at tests/format/printf.c:238
-Format error: wrong application of length modifier [h] to format specifier [E]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [h] to format specifier [E]
 TEST 86: OK: Expected signal at tests/format/printf.c:238
-Format error: wrong application of length modifier [h] to format specifier [g]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [h] to format specifier [g]
 TEST 87: OK: Expected signal at tests/format/printf.c:238
-Format error: wrong application of length modifier [h] to format specifier [G]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [h] to format specifier [G]
 TEST 88: OK: Expected signal at tests/format/printf.c:238
-Format error: wrong application of length modifier [h] to format specifier [a]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [h] to format specifier [a]
 TEST 89: OK: Expected signal at tests/format/printf.c:238
-Format error: wrong application of length modifier [h] to format specifier [A]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [h] to format specifier [A]
 TEST 90: OK: Expected signal at tests/format/printf.c:238
-Format error: wrong application of length modifier [h] to format specifier [c]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [h] to format specifier [c]
 TEST 91: OK: Expected signal at tests/format/printf.c:238
-Format error: wrong application of length modifier [h] to format specifier [s]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [h] to format specifier [s]
 TEST 92: OK: Expected signal at tests/format/printf.c:238
-Format error: wrong application of length modifier [h] to format specifier [p]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [h] to format specifier [p]
 TEST 93: OK: Expected signal at tests/format/printf.c:238
 TEST 94: OK: Expected execution at tests/format/printf.c:239
 TEST 95: OK: Expected execution at tests/format/printf.c:239
@@ -179,8 +143,7 @@ TEST 97: OK: Expected execution at tests/format/printf.c:240
 TEST 98: OK: Expected execution at tests/format/printf.c:241
 TEST 99: OK: Expected execution at tests/format/printf.c:241
 TEST 100: OK: Expected execution at tests/format/printf.c:241
-Format error: wrong application of length modifier [l] to format specifier [p]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [l] to format specifier [p]
 TEST 101: OK: Expected signal at tests/format/printf.c:244
 TEST 102: OK: Expected execution at tests/format/printf.c:245
 TEST 103: OK: Expected execution at tests/format/printf.c:245
@@ -205,38 +168,27 @@ TEST 121: OK: Expected execution at tests/format/printf.c:262
 TEST 122: OK: Expected execution at tests/format/printf.c:263
 TEST 123: OK: Expected execution at tests/format/printf.c:263
 TEST 124: OK: Expected execution at tests/format/printf.c:263
-Format error: wrong application of length modifier [j] to format specifier [f]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [j] to format specifier [f]
 TEST 125: OK: Expected signal at tests/format/printf.c:266
-Format error: wrong application of length modifier [j] to format specifier [F]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [j] to format specifier [F]
 TEST 126: OK: Expected signal at tests/format/printf.c:266
-Format error: wrong application of length modifier [j] to format specifier [e]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [j] to format specifier [e]
 TEST 127: OK: Expected signal at tests/format/printf.c:266
-Format error: wrong application of length modifier [j] to format specifier [E]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [j] to format specifier [E]
 TEST 128: OK: Expected signal at tests/format/printf.c:266
-Format error: wrong application of length modifier [j] to format specifier [g]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [j] to format specifier [g]
 TEST 129: OK: Expected signal at tests/format/printf.c:266
-Format error: wrong application of length modifier [j] to format specifier [G]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [j] to format specifier [G]
 TEST 130: OK: Expected signal at tests/format/printf.c:266
-Format error: wrong application of length modifier [j] to format specifier [a]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [j] to format specifier [a]
 TEST 131: OK: Expected signal at tests/format/printf.c:266
-Format error: wrong application of length modifier [j] to format specifier [A]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [j] to format specifier [A]
 TEST 132: OK: Expected signal at tests/format/printf.c:266
-Format error: wrong application of length modifier [j] to format specifier [c]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [j] to format specifier [c]
 TEST 133: OK: Expected signal at tests/format/printf.c:266
-Format error: wrong application of length modifier [j] to format specifier [s]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [j] to format specifier [s]
 TEST 134: OK: Expected signal at tests/format/printf.c:266
-Format error: wrong application of length modifier [j] to format specifier [p]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [j] to format specifier [p]
 TEST 135: OK: Expected signal at tests/format/printf.c:266
 TEST 136: OK: Expected execution at tests/format/printf.c:267
 TEST 137: OK: Expected execution at tests/format/printf.c:267
@@ -245,38 +197,27 @@ TEST 139: OK: Expected execution at tests/format/printf.c:268
 TEST 140: OK: Expected execution at tests/format/printf.c:269
 TEST 141: OK: Expected execution at tests/format/printf.c:269
 TEST 142: OK: Expected execution at tests/format/printf.c:269
-Format error: wrong application of length modifier [z] to format specifier [f]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [z] to format specifier [f]
 TEST 143: OK: Expected signal at tests/format/printf.c:272
-Format error: wrong application of length modifier [z] to format specifier [F]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [z] to format specifier [F]
 TEST 144: OK: Expected signal at tests/format/printf.c:272
-Format error: wrong application of length modifier [z] to format specifier [e]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [z] to format specifier [e]
 TEST 145: OK: Expected signal at tests/format/printf.c:272
-Format error: wrong application of length modifier [z] to format specifier [E]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [z] to format specifier [E]
 TEST 146: OK: Expected signal at tests/format/printf.c:272
-Format error: wrong application of length modifier [z] to format specifier [g]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [z] to format specifier [g]
 TEST 147: OK: Expected signal at tests/format/printf.c:272
-Format error: wrong application of length modifier [z] to format specifier [G]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [z] to format specifier [G]
 TEST 148: OK: Expected signal at tests/format/printf.c:272
-Format error: wrong application of length modifier [z] to format specifier [a]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [z] to format specifier [a]
 TEST 149: OK: Expected signal at tests/format/printf.c:272
-Format error: wrong application of length modifier [z] to format specifier [A]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [z] to format specifier [A]
 TEST 150: OK: Expected signal at tests/format/printf.c:272
-Format error: wrong application of length modifier [z] to format specifier [c]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [z] to format specifier [c]
 TEST 151: OK: Expected signal at tests/format/printf.c:272
-Format error: wrong application of length modifier [z] to format specifier [s]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [z] to format specifier [s]
 TEST 152: OK: Expected signal at tests/format/printf.c:272
-Format error: wrong application of length modifier [z] to format specifier [p]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [z] to format specifier [p]
 TEST 153: OK: Expected signal at tests/format/printf.c:272
 TEST 154: OK: Expected execution at tests/format/printf.c:277
 TEST 155: OK: Expected execution at tests/format/printf.c:277
@@ -285,38 +226,27 @@ TEST 157: OK: Expected execution at tests/format/printf.c:281
 TEST 158: OK: Expected execution at tests/format/printf.c:282
 TEST 159: OK: Expected execution at tests/format/printf.c:282
 TEST 160: OK: Expected execution at tests/format/printf.c:282
-Format error: wrong application of length modifier [t] to format specifier [f]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [t] to format specifier [f]
 TEST 161: OK: Expected signal at tests/format/printf.c:287
-Format error: wrong application of length modifier [t] to format specifier [F]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [t] to format specifier [F]
 TEST 162: OK: Expected signal at tests/format/printf.c:287
-Format error: wrong application of length modifier [t] to format specifier [e]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [t] to format specifier [e]
 TEST 163: OK: Expected signal at tests/format/printf.c:287
-Format error: wrong application of length modifier [t] to format specifier [E]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [t] to format specifier [E]
 TEST 164: OK: Expected signal at tests/format/printf.c:287
-Format error: wrong application of length modifier [t] to format specifier [g]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [t] to format specifier [g]
 TEST 165: OK: Expected signal at tests/format/printf.c:287
-Format error: wrong application of length modifier [t] to format specifier [G]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [t] to format specifier [G]
 TEST 166: OK: Expected signal at tests/format/printf.c:287
-Format error: wrong application of length modifier [t] to format specifier [a]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [t] to format specifier [a]
 TEST 167: OK: Expected signal at tests/format/printf.c:287
-Format error: wrong application of length modifier [t] to format specifier [A]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [t] to format specifier [A]
 TEST 168: OK: Expected signal at tests/format/printf.c:287
-Format error: wrong application of length modifier [t] to format specifier [c]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [t] to format specifier [c]
 TEST 169: OK: Expected signal at tests/format/printf.c:287
-Format error: wrong application of length modifier [t] to format specifier [s]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [t] to format specifier [s]
 TEST 170: OK: Expected signal at tests/format/printf.c:287
-Format error: wrong application of length modifier [t] to format specifier [p]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [t] to format specifier [p]
 TEST 171: OK: Expected signal at tests/format/printf.c:287
 TEST 172: OK: Expected execution at tests/format/printf.c:289
 TEST 173: OK: Expected execution at tests/format/printf.c:289
@@ -325,32 +255,23 @@ TEST 175: OK: Expected execution at tests/format/printf.c:290
 TEST 176: OK: Expected execution at tests/format/printf.c:295
 TEST 177: OK: Expected execution at tests/format/printf.c:295
 TEST 178: OK: Expected execution at tests/format/printf.c:296
-Format error: wrong application of length modifier [L] to format specifier [d]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [L] to format specifier [d]
 TEST 179: OK: Expected signal at tests/format/printf.c:299
-Format error: wrong application of length modifier [L] to format specifier [i]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [L] to format specifier [i]
 TEST 180: OK: Expected signal at tests/format/printf.c:299
-Format error: wrong application of length modifier [L] to format specifier [o]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [L] to format specifier [o]
 TEST 181: OK: Expected signal at tests/format/printf.c:299
-Format error: wrong application of length modifier [L] to format specifier [u]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [L] to format specifier [u]
 TEST 182: OK: Expected signal at tests/format/printf.c:299
-Format error: wrong application of length modifier [L] to format specifier [x]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [L] to format specifier [x]
 TEST 183: OK: Expected signal at tests/format/printf.c:299
-Format error: wrong application of length modifier [L] to format specifier [c]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [L] to format specifier [c]
 TEST 184: OK: Expected signal at tests/format/printf.c:299
-Format error: wrong application of length modifier [L] to format specifier [s]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [L] to format specifier [s]
 TEST 185: OK: Expected signal at tests/format/printf.c:299
-Format error: wrong application of length modifier [L] to format specifier [p]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [L] to format specifier [p]
 TEST 186: OK: Expected signal at tests/format/printf.c:299
-Format error: wrong application of length modifier [L] to format specifier [n]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of length modifier [L] to format specifier [n]
 TEST 187: OK: Expected signal at tests/format/printf.c:299
 TEST 188: OK: Expected execution at tests/format/printf.c:300
 TEST 189: OK: Expected execution at tests/format/printf.c:300
@@ -629,14 +550,11 @@ printf: directive 1 ('%n') expects argument of type 'int*' but the corresponding
 TEST 368: OK: Expected signal at tests/format/printf.c:460
 printf: argument 0 of directive %n not allocated or writeable
 TEST 369: OK: Expected signal at tests/format/printf.c:461
-Format error: wrong application of flag ['] to format specifier [n]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of flag ['] to format specifier [n]
 TEST 370: OK: Expected signal at tests/format/printf.c:464
-Format error: wrong application of flag [0] to format specifier [n]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of flag [0] to format specifier [n]
 TEST 371: OK: Expected signal at tests/format/printf.c:465
-Format error: wrong application of flag [#] to format specifier [n]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of flag [#] to format specifier [n]
 TEST 372: OK: Expected signal at tests/format/printf.c:466
 Format error: one of more flags with [n] specifier
 TEST 373: OK: Expected signal at tests/format/printf.c:467
@@ -644,14 +562,11 @@ Format error: one of more flags with [n] specifier
 TEST 374: OK: Expected signal at tests/format/printf.c:468
 Format error: one of more flags with [n] specifier
 TEST 375: OK: Expected signal at tests/format/printf.c:469
-Format error: wrong application of precision [.] to format specifier [n]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of precision [.] to format specifier [n]
 TEST 376: OK: Expected signal at tests/format/printf.c:470
-Format error: wrong application of precision [.] to format specifier [n]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of precision [.] to format specifier [n]
 TEST 377: OK: Expected signal at tests/format/printf.c:471
-Format error: wrong application of precision [.] to format specifier [n]
- at FRAMAC_SHARE/e-acsl/e_acsl_format.h:593
+FRAMAC_SHARE/e-acsl/libc_replacements/e_acsl_stdio.c:541: Format error: wrong application of precision [.] to format specifier [n]
 TEST 378: OK: Expected signal at tests/format/printf.c:472
 Format error: field width used with [n] specifier
 TEST 379: OK: Expected signal at tests/format/printf.c:473
diff --git a/src/plugins/e-acsl/tests/format/test_config_dev b/src/plugins/e-acsl/tests/format/test_config_dev
index 65de4748913a53fdc6a72a2215c32950353f5e66..636b97b921455af4ec13f54c6034decf21ba3975 100644
--- a/src/plugins/e-acsl/tests/format/test_config_dev
+++ b/src/plugins/e-acsl/tests/format/test_config_dev
@@ -1,2 +1,2 @@
-MACRO: ROOT_EACSL_GCC_OPTS_EXT --validate-format-strings --full-mmodel
+MACRO: ROOT_EACSL_GCC_OPTS_EXT --validate-format-strings --full-mtracking
 MACRO: ROOT_EACSL_EXEC_FILTER @SEDCMD@ -e "s|/.*/share/e-acsl|FRAMAC_SHARE/e-acsl|"
diff --git a/src/plugins/e-acsl/tests/full-mmodel/test_config_ci b/src/plugins/e-acsl/tests/full-mmodel/test_config_ci
deleted file mode 100644
index 82cdcaaa69d16cc0e2427322763c59b35a07268b..0000000000000000000000000000000000000000
--- a/src/plugins/e-acsl/tests/full-mmodel/test_config_ci
+++ /dev/null
@@ -1 +0,0 @@
-STDOPT: #"-e-acsl-full-mmodel"
diff --git a/src/plugins/e-acsl/tests/full-mmodel/test_config_dev b/src/plugins/e-acsl/tests/full-mmodel/test_config_dev
deleted file mode 100644
index 840cd7e754b9378cae50629afe67859770850cbb..0000000000000000000000000000000000000000
--- a/src/plugins/e-acsl/tests/full-mmodel/test_config_dev
+++ /dev/null
@@ -1 +0,0 @@
-MACRO: ROOT_EACSL_GCC_OPTS_EXT --full-mmodel
\ No newline at end of file
diff --git a/src/plugins/e-acsl/tests/full-mmodel/README.md b/src/plugins/e-acsl/tests/full-mtracking/README.md
similarity index 87%
rename from src/plugins/e-acsl/tests/full-mmodel/README.md
rename to src/plugins/e-acsl/tests/full-mtracking/README.md
index 9e2bd153f80c9ad4ef7ffcb5754a14f665378aa7..6d17198369ac5aeb59a99b9d9ed37d83ac37f2fe 100644
--- a/src/plugins/e-acsl/tests/full-mmodel/README.md
+++ b/src/plugins/e-acsl/tests/full-mtracking/README.md
@@ -1 +1 @@
-Like runtime, but also test instrumentation with --e-acsl-full-mmodel
+Like runtime, but also test instrumentation with --e-acsl-full-mtracking
diff --git a/src/plugins/e-acsl/tests/full-mmodel/addrOf.i b/src/plugins/e-acsl/tests/full-mtracking/addrOf.i
similarity index 100%
rename from src/plugins/e-acsl/tests/full-mmodel/addrOf.i
rename to src/plugins/e-acsl/tests/full-mtracking/addrOf.i
diff --git a/src/plugins/e-acsl/tests/full-mmodel/oracle_ci/addrOf.res.oracle b/src/plugins/e-acsl/tests/full-mtracking/oracle_ci/addrOf.res.oracle
similarity index 100%
rename from src/plugins/e-acsl/tests/full-mmodel/oracle_ci/addrOf.res.oracle
rename to src/plugins/e-acsl/tests/full-mtracking/oracle_ci/addrOf.res.oracle
diff --git a/src/plugins/e-acsl/tests/full-mmodel/oracle_ci/gen_addrOf.c b/src/plugins/e-acsl/tests/full-mtracking/oracle_ci/gen_addrOf.c
similarity index 88%
rename from src/plugins/e-acsl/tests/full-mmodel/oracle_ci/gen_addrOf.c
rename to src/plugins/e-acsl/tests/full-mtracking/oracle_ci/gen_addrOf.c
index 574d904ff3e9f01ffb34f47c1945664f8330ef7b..8b38c74f47adf8a8dee1af80e6cf8e50eee56625 100644
--- a/src/plugins/e-acsl/tests/full-mmodel/oracle_ci/gen_addrOf.c
+++ b/src/plugins/e-acsl/tests/full-mtracking/oracle_ci/gen_addrOf.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 void f(void)
 {
   int m;
@@ -19,7 +19,7 @@ void f(void)
     int __gen_e_acsl_initialized;
     __gen_e_acsl_initialized = __e_acsl_initialized((void *)p,sizeof(int));
     __e_acsl_assert(__gen_e_acsl_initialized,"Assertion","f",
-                    "\\initialized(p)","tests/full-mmodel/addrOf.i",10);
+                    "\\initialized(p)","tests/full-mtracking/addrOf.i",10);
   }
   /*@ assert \initialized(p); */ ;
   __e_acsl_delete_block((void *)(& p));
@@ -39,7 +39,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& f));
 }
@@ -55,13 +55,13 @@ int main(void)
   __e_acsl_full_init((void *)(& x));
   f();
   __e_acsl_assert(& x == & x,"Assertion","main","&x == &x",
-                  "tests/full-mmodel/addrOf.i",16);
+                  "tests/full-mtracking/addrOf.i",16);
   /*@ assert &x ≡ &x; */ ;
   __e_acsl_full_init((void *)(& __retres));
   __retres = 0;
   __e_acsl_delete_block((void *)(& x));
   __e_acsl_delete_block((void *)(& __retres));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/full-mmodel/oracle_dev/addrOf.e-acsl.err.log b/src/plugins/e-acsl/tests/full-mtracking/oracle_dev/addrOf.e-acsl.err.log
similarity index 100%
rename from src/plugins/e-acsl/tests/full-mmodel/oracle_dev/addrOf.e-acsl.err.log
rename to src/plugins/e-acsl/tests/full-mtracking/oracle_dev/addrOf.e-acsl.err.log
diff --git a/src/plugins/e-acsl/tests/full-mtracking/test_config_ci b/src/plugins/e-acsl/tests/full-mtracking/test_config_ci
new file mode 100644
index 0000000000000000000000000000000000000000..3b1ebb8a3ac607fb5b6543b24baedd44f3d1cbd4
--- /dev/null
+++ b/src/plugins/e-acsl/tests/full-mtracking/test_config_ci
@@ -0,0 +1 @@
+STDOPT: #"-e-acsl-full-mtracking"
diff --git a/src/plugins/e-acsl/tests/full-mtracking/test_config_dev b/src/plugins/e-acsl/tests/full-mtracking/test_config_dev
new file mode 100644
index 0000000000000000000000000000000000000000..bdb600fef3fe5c8ec148408a9a4207cfb5bf1239
--- /dev/null
+++ b/src/plugins/e-acsl/tests/full-mtracking/test_config_dev
@@ -0,0 +1 @@
+MACRO: ROOT_EACSL_GCC_OPTS_EXT --full-mtracking
\ No newline at end of file
diff --git a/src/plugins/e-acsl/tests/gmp-only/oracle_ci/gen_arith.c b/src/plugins/e-acsl/tests/gmp-only/oracle_ci/gen_arith.c
index 9db467e05fce5f01652cb191a4ef603018c77832..63c374fc8804cf88e5fb2d94bffd59717e1bda95 100644
--- a/src/plugins/e-acsl/tests/gmp-only/oracle_ci/gen_arith.c
+++ b/src/plugins/e-acsl/tests/gmp-only/oracle_ci/gen_arith.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/gmp-only/oracle_ci/gen_functions.c b/src/plugins/e-acsl/tests/gmp-only/oracle_ci/gen_functions.c
index 471424de4c8f5c0fcfd49f295599f72c9e845734..ab3f589ceb417a3607be08c2f99a647058b0a67f 100644
--- a/src/plugins/e-acsl/tests/gmp-only/oracle_ci/gen_functions.c
+++ b/src/plugins/e-acsl/tests/gmp-only/oracle_ci/gen_functions.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 struct mystruct {
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/ctype_macros.res.oracle b/src/plugins/e-acsl/tests/memory/oracle_ci/ctype_macros.res.oracle
index 270dcdb0d84448a3889a178d504aa1b53f9de220..bdd131d8e73293fe5368b6c090950b25c70897d4 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/ctype_macros.res.oracle
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/ctype_macros.res.oracle
@@ -2,22 +2,9 @@
 [e-acsl] Warning: annotating undefined function `isupper':
   the generated program may miss memory instrumentation
   if there are memory-related annotations.
-[e-acsl] tests/memory/ctype_macros.c:39: Warning: 
-  E-ACSL construct `disjoint behaviors' is not yet supported.
-  Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/ctype.h:174: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/ctype.h:173: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
 [e-acsl] translation done in project "e-acsl".
 [eva:alarm] tests/memory/ctype_macros.c:37: Warning: 
   function __gen_e_acsl_isupper: precondition 'c_uchar_or_eof' got status unknown.
-[eva:alarm] FRAMAC_SHARE/libc/ctype.h:174: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva:alarm] FRAMAC_SHARE/libc/ctype.h:178: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva:alarm] FRAMAC_SHARE/libc/ctype.h:181: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva:alarm] FRAMAC_SHARE/libc/ctype.h:178: Warning: 
-  function __gen_e_acsl_isupper, behavior definitely_match: postcondition 'nonzero_result' got status unknown. (Behavior may be inactive, no reduction performed.)
-[eva:alarm] FRAMAC_SHARE/libc/ctype.h:181: Warning: 
-  function __gen_e_acsl_isupper, behavior definitely_not_match: postcondition 'zero_result' got status unknown. (Behavior may be inactive, no reduction performed.)
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_addrOf.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_addrOf.c
index 7b77f53af25192904b9c35d6dc15f56152a3874e..bd03357db5ad987191d7ee78d65e016f52fe791c 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_addrOf.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_addrOf.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 void f(void)
 {
   int m;
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_alias.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_alias.c
index 6a17c6b8426bb74077ff37e8e435e93293fccc46..ec52f8d8911d4cfa324a4f8888a504654232f7d4 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_alias.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_alias.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 void f(int *dest, int val)
 {
   __e_acsl_store_block((void *)(& dest),(size_t)8);
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_base_addr.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_base_addr.c
index 9f45f3d678f16d88ce64d3a27351bafe295429bc..b831f777ef00fa9aca954755f319d46fe0dc2666 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_base_addr.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_base_addr.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 int A[4] = {1, 2, 3, 4};
@@ -16,7 +17,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& PA));
   __e_acsl_delete_block((void *)(A));
@@ -326,7 +327,7 @@ int main(void)
   __e_acsl_delete_block((void *)(& l));
   __e_acsl_delete_block((void *)(& pa));
   __e_acsl_delete_block((void *)(a));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_block_length.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_block_length.c
index 4cbe891d458c6fac7738d2ce38d0b5fc3b5e6a98..cec16f53eafcf4bdda73c28cfd23e9f84a52f914 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_block_length.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_block_length.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 struct Zero {
@@ -22,7 +23,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& ZERO));
   __e_acsl_delete_block((void *)(& PA));
@@ -253,7 +254,7 @@ int main(void)
   __e_acsl_delete_block((void *)(& pa));
   __e_acsl_delete_block((void *)(a));
   __e_acsl_delete_block((void *)(& zero));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_block_valid.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_block_valid.c
index 3871a01e451cfe6dde011661ac2b0b4942854639..33dd06e7f2d63264ef03f86307f95d511ccaa216 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_block_valid.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_block_valid.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 int A = 1;
@@ -15,7 +16,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& B));
 }
@@ -160,7 +161,7 @@ int main(int argc, char **argv)
   __e_acsl_delete_block((void *)(& pmin));
   __e_acsl_delete_block((void *)(& b));
   __e_acsl_delete_block((void *)(& p));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_bypassed_var.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_bypassed_var.c
index 719d8c6de18244f8507738bb25d68335882a474a..b835f6982ff8fd9b8fe78fc63794973c10ae4223 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_bypassed_var.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_bypassed_var.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(int argc, char const **argv)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_call.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_call.c
index 2cdd52844f8b3dd1d6ea9f77b90be6a3ebeeb7cf..7b3be6015b98f0fe3c415fc1dee1e0105488f97e 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_call.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_call.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 extern int __e_acsl_sound_verdict;
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_compound_initializers.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_compound_initializers.c
index a5c535378151910cf595a16301c5ac72aa331ff9..ab6e1941648571820ef95453bb48dd5f1411e4a0 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_compound_initializers.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_compound_initializers.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 char *__gen_e_acsl_literal_string_3;
 char *__gen_e_acsl_literal_string;
 char *__gen_e_acsl_literal_string_2;
@@ -65,7 +65,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(_G));
   __e_acsl_delete_block((void *)(& _E));
@@ -187,7 +187,7 @@ int main(int argc, char **argv)
                   "tests/memory/compound_initializers.c",43);
   /*@ assert _G[0].num ≡ 99; */ ;
   __retres = 0;
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ctype_macros.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ctype_macros.c
index 52d996bb0201a28fd51cfb82afb06d4714107121..cbf17bff568232f8b793732e40a59e0997ce068c 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ctype_macros.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ctype_macros.c
@@ -1,7 +1,7 @@
 /* Generated by Frama-C */
 #include "ctype.h"
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 /*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
@@ -73,60 +73,66 @@ int main(int argc, char const **argv)
  */
 int __gen_e_acsl_isupper(int c)
 {
-  int __gen_e_acsl_at_2;
-  int __gen_e_acsl_at;
+  __e_acsl_contract_t *__gen_e_acsl_contract;
   int __retres;
   {
     int __gen_e_acsl_and;
     int __gen_e_acsl_or;
-    if (0 <= c) __gen_e_acsl_and = c <= 255; else __gen_e_acsl_and = 0;
-    if (__gen_e_acsl_and) __gen_e_acsl_or = 1;
-    else __gen_e_acsl_or = c == -1;
-    __e_acsl_assert(__gen_e_acsl_or,"Precondition","isupper",
-                    "(0 <= c <= 255) || c == -1","FRAMAC_SHARE/libc/ctype.h",
-                    174);
-  }
-  {
+    int __gen_e_acsl_or_2;
+    int __gen_e_acsl_and_4;
     int __gen_e_acsl_or_3;
-    int __gen_e_acsl_or_4;
-    if (c == -1) __gen_e_acsl_or_3 = 1;
+    int __gen_e_acsl_active_bhvrs;
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
+    if (65 <= c) __gen_e_acsl_and = c <= 90; else __gen_e_acsl_and = 0;
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                           __gen_e_acsl_and);
+    if (c == -1) __gen_e_acsl_or = 1;
     else {
-      int __gen_e_acsl_and_3;
-      if (0 <= c) __gen_e_acsl_and_3 = c < 65; else __gen_e_acsl_and_3 = 0;
-      __gen_e_acsl_or_3 = __gen_e_acsl_and_3;
+      int __gen_e_acsl_and_2;
+      if (0 <= c) __gen_e_acsl_and_2 = c < 65; else __gen_e_acsl_and_2 = 0;
+      __gen_e_acsl_or = __gen_e_acsl_and_2;
     }
-    if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1;
+    if (__gen_e_acsl_or) __gen_e_acsl_or_2 = 1;
     else {
-      int __gen_e_acsl_and_4;
-      if (90 < c) __gen_e_acsl_and_4 = c <= 127; else __gen_e_acsl_and_4 = 0;
-      __gen_e_acsl_or_4 = __gen_e_acsl_and_4;
+      int __gen_e_acsl_and_3;
+      if (90 < c) __gen_e_acsl_and_3 = c <= 127; else __gen_e_acsl_and_3 = 0;
+      __gen_e_acsl_or_2 = __gen_e_acsl_and_3;
     }
-    __gen_e_acsl_at_2 = __gen_e_acsl_or_4;
-  }
-  {
-    int __gen_e_acsl_and_2;
-    if (65 <= c) __gen_e_acsl_and_2 = c <= 90; else __gen_e_acsl_and_2 = 0;
-    __gen_e_acsl_at = __gen_e_acsl_and_2;
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,
+                                           __gen_e_acsl_or_2);
+    if (0 <= c) __gen_e_acsl_and_4 = c <= 255; else __gen_e_acsl_and_4 = 0;
+    if (__gen_e_acsl_and_4) __gen_e_acsl_or_3 = 1;
+    else __gen_e_acsl_or_3 = c == -1;
+    __e_acsl_assert(__gen_e_acsl_or_3,"Precondition","isupper",
+                    "(0 <= c <= 255) || c == -1","FRAMAC_SHARE/libc/ctype.h",
+                    174);
+    __gen_e_acsl_active_bhvrs = __e_acsl_contract_partial_count_all_behaviors
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract);
+    __e_acsl_assert(__gen_e_acsl_active_bhvrs <= 1,"Precondition","isupper",
+                    "all behaviors disjoint","FRAMAC_SHARE/libc/ctype.h",173);
   }
   __retres = isupper(c);
   {
-    int __gen_e_acsl_implies;
-    int __gen_e_acsl_implies_2;
-    if (! __gen_e_acsl_at) __gen_e_acsl_implies = 1;
-    else {
-      int __gen_e_acsl_or_2;
-      if (__retres < 0) __gen_e_acsl_or_2 = 1;
-      else __gen_e_acsl_or_2 = __retres > 0;
-      __gen_e_acsl_implies = __gen_e_acsl_or_2;
+    int __gen_e_acsl_assumes_value;
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value) {
+      int __gen_e_acsl_or_4;
+      if (__retres < 0) __gen_e_acsl_or_4 = 1;
+      else __gen_e_acsl_or_4 = __retres > 0;
+      __e_acsl_assert(__gen_e_acsl_or_4,"Postcondition","isupper",
+                      "definitely_match: \\result < 0 || \\result > 0",
+                      "FRAMAC_SHARE/libc/ctype.h",178);
     }
-    __e_acsl_assert(__gen_e_acsl_implies,"Postcondition","isupper",
-                    "\\old(\'A\' <= c <= \'Z\') ==> \\result < 0 || \\result > 0",
-                    "FRAMAC_SHARE/libc/ctype.h",178);
-    if (! __gen_e_acsl_at_2) __gen_e_acsl_implies_2 = 1;
-    else __gen_e_acsl_implies_2 = __retres == 0;
-    __e_acsl_assert(__gen_e_acsl_implies_2,"Postcondition","isupper",
-                    "\\old(c == -1 || (0 <= c < \'A\') || (\'Z\' < c <= 127)) ==> \\result == 0",
-                    "FRAMAC_SHARE/libc/ctype.h",181);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(__retres == 0,
+                                                    "Postcondition",
+                                                    "isupper",
+                                                    "definitely_not_match: \\result == 0",
+                                                    "FRAMAC_SHARE/libc/ctype.h",
+                                                    181);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
     return __retres;
   }
 }
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_decl_in_switch.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_decl_in_switch.c
index 4c5ab738c91ed7526114235000e4d9162b7f22b1..0f7c83a627ad0118bfe6d37c73e041a1e62b26bd 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_decl_in_switch.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_decl_in_switch.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 void decl_in_switch(int value)
 {
   __e_acsl_store_block((void *)(& value),(size_t)4);
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_early_exit.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_early_exit.c
index aaa3abefdbd4f3f2b6c3f3a0c98403cd4f8aa347..f107396adc8cfc9cdd40e0b34eb7a8626145cf44 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_early_exit.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_early_exit.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int goto_bts(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_errno.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_errno.c
index f38474ba466e667532e9d52c1e92653513013858..66d885e493a78e17c9156d5739888910c1afa127 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_errno.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_errno.c
@@ -14,7 +14,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& errno));
 }
@@ -45,7 +45,7 @@ int main(int argc, char const **argv)
   /*@ assert \valid(p); */ ;
   __retres = 0;
   __e_acsl_delete_block((void *)(& p));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_freeable.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_freeable.c
index 6504639acc77d78fee02adba6c18807b8d3d0c27..ab2185597f8b3aed26adfc4e8b2bd9cf0e3dc130 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_freeable.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_freeable.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 char array[1024];
@@ -13,7 +14,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(array));
 }
@@ -81,7 +82,7 @@ int main(void)
   /*@ assert ¬\freeable(&array[5]); */ ;
   __retres = 0;
   __e_acsl_delete_block((void *)(& p));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ghost_parameters.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ghost_parameters.c
index dcd56fb12c71d3ca2e9cc8fa528992df29cc0cd0..e16ba064495c8f55c56d9c584c913cf85c3e4f38 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ghost_parameters.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ghost_parameters.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 void function(int a, int b, int c, int d)
 {
   return;
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_goto.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_goto.c
index d5c1542ac4f7e43c2a39612fd1f6f8b8205fc76c..aa5bc854da21cdcd0906771fb6acfb7d15550196 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_goto.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_goto.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 char a;
 void __e_acsl_globals_init(void)
 {
@@ -13,7 +13,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& a));
 }
@@ -40,7 +40,7 @@ int main(void)
   /*@ assert \initialized(b); */ ;
   __retres = 0;
   __e_acsl_delete_block((void *)(& b));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_hidden_malloc.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_hidden_malloc.c
index ef47698bb6f64ba11fe048320b1996032ce0c34a..e3e8cd4ae773b5c4b6f5f0e3d795946667d2053b 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_hidden_malloc.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_hidden_malloc.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 char *__gen_e_acsl_literal_string;
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_init.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_init.c
index e3a9201614e27d12a529b3bf3b659e3654f02192..c4eb1d146e11ff56d96023a62831c6a24bb837d1 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_init.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_init.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int a = 0;
 int b;
 void __e_acsl_globals_init(void)
@@ -16,7 +16,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& b));
   __e_acsl_delete_block((void *)(& a));
@@ -53,7 +53,7 @@ int main(void)
   __retres = 0;
   __e_acsl_delete_block((void *)(& q));
   __e_acsl_delete_block((void *)(& p));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_init_function.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_init_function.c
index 0233781eddc1f5da18be1c0812a3727ad744420a..6b4322952dc1b9a80766894a70789edfc7038604 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_init_function.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_init_function.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 int main(void)
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_initialized.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_initialized.c
index 026e4bbef144f7d8a119f8d9d5fee687fb3f4dd6..2fc7f4ff02452f9cf5ec262dc1a11a7dff556df0 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_initialized.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_initialized.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 int A = 0;
@@ -16,7 +17,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& B));
   __e_acsl_delete_block((void *)(& A));
@@ -365,7 +366,7 @@ int main(void)
   __e_acsl_delete_block((void *)(& a));
   __e_acsl_delete_block((void *)(& q));
   __e_acsl_delete_block((void *)(& p));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_literal_string.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_literal_string.c
index 74ba7f26de69c765049127433fb50106aa2b6dfd..3fc0d11efa059b157cbf14f9651a0a2f1e537244 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_literal_string.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_literal_string.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 char *__gen_e_acsl_literal_string_6;
 char *__gen_e_acsl_literal_string_5;
 char *__gen_e_acsl_literal_string;
@@ -82,7 +82,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& l_str));
   __e_acsl_delete_block((void *)(& s_str));
@@ -148,7 +148,7 @@ int main(void)
   l_str ++;
   __retres = 0;
   __e_acsl_delete_block((void *)(& SS));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_local_goto.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_local_goto.c
index 3d26e79512a996e7a619a62f0c495e06bb09a0ee..81bdec6072509915722c0d9d9a0c646508ea620a 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_local_goto.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_local_goto.c
@@ -1,7 +1,6 @@
 /* Generated by Frama-C */
 #include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 char *__gen_e_acsl_literal_string_2;
 char *__gen_e_acsl_literal_string_3;
 char *__gen_e_acsl_literal_string;
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_local_init.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_local_init.c
index 1f7424a1ec1eae755ed5ec0b6ae0b5c396c36c94..bae0a76865527daf719714166599c90ca4e9e9ee 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_local_init.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_local_init.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int X = 0;
 int *p = & X;
 int f(void)
@@ -22,7 +22,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& p));
   __e_acsl_delete_block((void *)(& X));
@@ -35,7 +35,7 @@ int main(void)
   __e_acsl_globals_init();
   f();
   __retres = 0;
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_local_var.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_local_var.c
index a7de0f8707ddc4ec1edc095ebf3689bf5eb99a11..7dd067ecaf93f58f6a4589f386616aedfa48f70a 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_local_var.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_local_var.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 struct list {
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_mainargs.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_mainargs.c
index 86e9de278227b7ff043988d6464c7b6120e761ae..f55653212501766263d4bbe15d33cf5c235fcb0b 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_mainargs.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_mainargs.c
@@ -1,7 +1,6 @@
 /* Generated by Frama-C */
 #include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 #include "string.h"
 extern int __e_acsl_sound_verdict;
 
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_memalign.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_memalign.c
index f0a98343e01d91146897001094205c0d8d01a50e..594eb809025228428f8d77a55c247c7157cab650 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_memalign.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_memalign.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 extern int __e_acsl_sound_verdict;
@@ -53,7 +54,6 @@ int main(int argc, char const **argv)
   int res2 =
     __gen_e_acsl_posix_memalign((void **)memptr,(unsigned long)256,
                                 (unsigned long)15);
-  /*@ assert Eva: initialization: \initialized(memptr); */
   char *p = *memptr;
   __e_acsl_store_block((void *)(& p),(size_t)8);
   __e_acsl_full_init((void *)(& p));
@@ -215,11 +215,13 @@ int main(int argc, char const **argv)
  */
 int __gen_e_acsl_posix_memalign(void **memptr, size_t alignment, size_t size)
 {
+  __e_acsl_contract_t *__gen_e_acsl_contract;
   int __retres;
   {
     int __gen_e_acsl_valid;
     int __gen_e_acsl_and;
     __e_acsl_store_block((void *)(& memptr),(size_t)8);
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
     __gen_e_acsl_valid = __e_acsl_valid((void *)memptr,sizeof(void *),
                                         (void *)memptr,(void *)(& memptr));
     __e_acsl_assert(__gen_e_acsl_valid,"Precondition","posix_memalign",
@@ -253,8 +255,30 @@ int __gen_e_acsl_posix_memalign(void **memptr, size_t alignment, size_t size)
                     "FRAMAC_SHARE/libc/stdlib.h",668);
   }
   __retres = posix_memalign(memptr,alignment,size);
-  __e_acsl_delete_block((void *)(& memptr));
-  return __retres;
+  {
+    int __gen_e_acsl_assumes_value;
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(__retres == 0,
+                                                    "Postcondition",
+                                                    "posix_memalign",
+                                                    "allocation: \\result == 0",
+                                                    "FRAMAC_SHARE/libc/stdlib.h",
+                                                    680);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value) {
+      int __gen_e_acsl_or;
+      if (__retres < 0) __gen_e_acsl_or = 1;
+      else __gen_e_acsl_or = __retres > 0;
+      __e_acsl_assert(__gen_e_acsl_or,"Postcondition","posix_memalign",
+                      "no_allocation: \\result < 0 || \\result > 0",
+                      "FRAMAC_SHARE/libc/stdlib.h",685);
+    }
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
+    __e_acsl_delete_block((void *)(& memptr));
+    return __retres;
+  }
 }
 
 
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_memsize.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_memsize.c
index afc1d47904c708484482355ef4be0aaf6fcd4c2b..134e80f8dafed2dc211d27d63cf0ed3076a9c401 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_memsize.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_memsize.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 extern size_t __e_acsl_heap_allocation_size;
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_null.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_null.c
index 02d31514dd514a5bfd5f727e2be47391a94815c2..3da46b127572f9f9ce95205ee72f90cd9cb2f21b 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_null.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_null.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_offset.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_offset.c
index 4ce316ea42cfb59cd90e1929990019505f16440e..90041c6e180ce1b6859a7d80e14f3777f8ec0bb7 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_offset.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_offset.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 int A[4] = {1, 2, 3, 4};
@@ -16,7 +17,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& PA));
   __e_acsl_delete_block((void *)(A));
@@ -220,7 +221,7 @@ int main(void)
   __e_acsl_delete_block((void *)(& pl));
   __e_acsl_delete_block((void *)(& l));
   __e_acsl_delete_block((void *)(a));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_other_constants.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_other_constants.c
index e6f639fa93586a5740844dada0ba1163d4c1fc34..367bdac518c2dcd8d514577f7ba79e0a7c76790c 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_other_constants.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_other_constants.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 enum bool {
     false = 0,
     true = 1
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ptr.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ptr.c
index dbe02ee97e287e9b51200658e62179c11806c705..d3e4601ad639de99914601753a91ff8aa6ce462f 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ptr.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ptr.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ptr_init.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ptr_init.c
index e021ea6783c863b45d6d1911bf9f1b6ba0536757..9f802d1b7fc773bb191e1f1d442744a2754b3540 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ptr_init.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ptr_init.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 int *A;
@@ -32,7 +33,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& B));
   __e_acsl_delete_block((void *)(& A));
@@ -68,7 +69,7 @@ int main(void)
   __retres = 0;
   __e_acsl_delete_block((void *)(& y));
   __e_acsl_delete_block((void *)(& x));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ranges_in_builtins.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ranges_in_builtins.c
index 89bbf9a94b82384ac91ba5d41542435a548061a6..d34788a14e92d66e46d0a3a1a20c57184474b438 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ranges_in_builtins.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_ranges_in_builtins.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 extern int __e_acsl_sound_verdict;
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_sizeof.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_sizeof.c
index 7920e6b98d14aa615660abce4145ecb3cb3ea401..aa3776502d022fb3e352cde9686ef4de5b07c548 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_sizeof.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_sizeof.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_stdout.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_stdout.c
index 75bddabfbe9edd97d7bff4bac71129cf540e7428..63d1db28971baba9550159fcbfd0c46ef6b54c54 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_stdout.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_stdout.c
@@ -1,7 +1,6 @@
 /* Generated by Frama-C */
 #include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 void __e_acsl_globals_init(void)
 {
   static char __e_acsl_already_run = 0;
@@ -17,7 +16,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& stdout));
   __e_acsl_delete_block((void *)(& stdin));
@@ -54,7 +53,7 @@ int main(void)
   }
   /*@ assert \valid(__fc_stdout); */ ;
   __retres = 0;
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_valid.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_valid.c
index 38b803a26a325b0b7f87db4a9117ad74d7359762..872f31b112b4b253e3ac9a0ba3499fd144e6d262 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_valid.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_valid.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 extern int __e_acsl_sound_verdict;
@@ -137,7 +138,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& Z));
   __e_acsl_delete_block((void *)(& X));
@@ -532,7 +533,7 @@ int main(void)
   __e_acsl_delete_block((void *)(& c));
   __e_acsl_delete_block((void *)(& b));
   __e_acsl_delete_block((void *)(& a));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_valid_alias.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_valid_alias.c
index c89b0e938c99a2943e4996d7c1664500b5b00a82..a747d91890334831c4de93c9807867ab21dea619 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_valid_alias.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_valid_alias.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 int main(void)
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_valid_in_contract.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_valid_in_contract.c
index e26605a59360eb544df4097ff5dcca47545b1f6c..a41cd36b70d5ce51151560e0f1658d9b1a2b1af0 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_valid_in_contract.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_valid_in_contract.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 extern int __e_acsl_sound_verdict;
@@ -62,17 +63,18 @@ int main(void)
  */
 struct list *__gen_e_acsl_f(struct list *l)
 {
-  struct list *__gen_e_acsl_at_4;
-  int __gen_e_acsl_at_3;
   struct list *__gen_e_acsl_at_2;
-  int __gen_e_acsl_at;
+  struct list *__gen_e_acsl_at;
+  __e_acsl_contract_t *__gen_e_acsl_contract;
   struct list *__retres;
   __e_acsl_store_block((void *)(& __retres),(size_t)8);
-  __e_acsl_store_block((void *)(& l),(size_t)8);
-  __gen_e_acsl_at_4 = l;
   {
     int __gen_e_acsl_valid;
     int __gen_e_acsl_or;
+    __e_acsl_store_block((void *)(& l),(size_t)8);
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                           l == (struct list *)0);
     __gen_e_acsl_valid = __e_acsl_valid((void *)l,sizeof(struct list),
                                         (void *)l,(void *)(& l));
     if (! __gen_e_acsl_valid) __gen_e_acsl_or = 1;
@@ -100,24 +102,29 @@ struct list *__gen_e_acsl_f(struct list *l)
       else __gen_e_acsl_and = 0;
       __gen_e_acsl_or = ! __gen_e_acsl_and;
     }
-    __gen_e_acsl_at_3 = __gen_e_acsl_or;
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,
+                                           __gen_e_acsl_or);
   }
   __gen_e_acsl_at_2 = l;
-  __gen_e_acsl_at = l == (struct list *)0;
+  __gen_e_acsl_at = l;
   __retres = f(l);
   {
-    int __gen_e_acsl_implies;
-    int __gen_e_acsl_implies_2;
-    if (! __gen_e_acsl_at) __gen_e_acsl_implies = 1;
-    else __gen_e_acsl_implies = __retres == __gen_e_acsl_at_2;
-    __e_acsl_assert(__gen_e_acsl_implies,"Postcondition","f",
-                    "\\old(l == \\null) ==> \\result == \\old(l)",
-                    "tests/memory/valid_in_contract.c",15);
-    if (! __gen_e_acsl_at_3) __gen_e_acsl_implies_2 = 1;
-    else __gen_e_acsl_implies_2 = __retres == __gen_e_acsl_at_4;
-    __e_acsl_assert(__gen_e_acsl_implies_2,"Postcondition","f",
-                    "\\old(!\\valid{Here}(l) || !\\valid{Here}(l->next)) ==> \\result == \\old(l)",
-                    "tests/memory/valid_in_contract.c",18);
+    int __gen_e_acsl_assumes_value;
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(__retres == __gen_e_acsl_at,
+                                                    "Postcondition","f",
+                                                    "B1: \\result == \\old(l)",
+                                                    "tests/memory/valid_in_contract.c",
+                                                    15);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value) __e_acsl_assert(__retres == __gen_e_acsl_at_2,
+                                                    "Postcondition","f",
+                                                    "B2: \\result == \\old(l)",
+                                                    "tests/memory/valid_in_contract.c",
+                                                    18);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
     __e_acsl_delete_block((void *)(& l));
     __e_acsl_delete_block((void *)(& __retres));
     return __retres;
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_vector.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_vector.c
index f3ef2cd1836fa72946c9c1d10fa29a89789f02f9..ac348fd03d07fe972e9e5538f9ad71fea4efd51e 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_vector.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_vector.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 int LAST;
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_vla.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_vla.c
index d2039f2b5ee5f5dc7add5b7346d91dfabeb5e52a..73cabbcc28ec08211c73aa530d2c3f32b96bf86d 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_vla.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_vla.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int LEN = 10;
 int main(int argc, char **argv)
 {
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/memalign.res.oracle b/src/plugins/e-acsl/tests/memory/oracle_ci/memalign.res.oracle
index bcfe10a812c72940b682369df2ac5f11caaaecba..a08399a71e09e3fde121d5d0a7439511ae6e23f0 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/memalign.res.oracle
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/memalign.res.oracle
@@ -4,30 +4,21 @@
   if there are memory-related annotations.
 [e-acsl] FRAMAC_SHARE/libc/stdlib.h:665: Warning: 
   E-ACSL construct `\fresh' is not yet supported. Ignoring annotation.
-[e-acsl] tests/memory/memalign.c:38: Warning: 
-  E-ACSL construct `complete behaviors' is not yet supported.
-  Ignoring annotation.
-[e-acsl] tests/memory/memalign.c:38: Warning: 
-  E-ACSL construct `disjoint behaviors' is not yet supported.
-  Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/stdlib.h:669: Warning: 
-  E-ACSL construct `assigns clause in behavior' is not yet supported.
-  Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/stdlib.h:675: Warning: 
   E-ACSL construct `predicate performing read accesses' is not yet supported.
   Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/stdlib.h:675: Warning: 
-  E-ACSL construct `assigns clause in behavior' is not yet supported.
-  Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/stdlib.h:682: Warning: 
   E-ACSL construct `predicate performing read accesses' is not yet supported.
   Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:665: Warning: 
+  Some assumes clauses couldn't be translated.
+  Ignoring complete and disjoint behaviors annotations.
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:665: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:679: Warning: 
+  E-ACSL construct `\fresh' is not yet supported. Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:680: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
 [e-acsl] translation done in project "e-acsl".
-[eva:alarm] FRAMAC_SHARE/libc/stdlib.h:668: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva] FRAMAC_SHARE/libc/stdlib.h:665: Warning: 
-  ignoring unsupported \allocates clause
-[eva:alarm] FRAMAC_SHARE/libc/stdlib.h:679: Warning: 
-  function __gen_e_acsl_posix_memalign, behavior allocation: postcondition 'allocation' got status unknown.
-[eva:alarm] tests/memory/memalign.c:14: Warning: 
-  accessing uninitialized left-value. assert \initialized(memptr);
diff --git a/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-valid.res.oracle b/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-valid.res.oracle
index 504ec1ce5e1e7ec93e53ba27fd59cb2f6fd01097..2a20efd543f570f710b1f32d7177806c057ed931 100644
--- a/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-valid.res.oracle
+++ b/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-valid.res.oracle
@@ -1,18 +1,15 @@
 [eva:alarm] tests/special/e-acsl-valid.c:37: Warning: 
   function f: precondition \valid(y) got status unknown.
 [e-acsl] beginning translation.
-[e-acsl] tests/special/e-acsl-valid.c:25: Warning: 
+[e-acsl] tests/special/e-acsl-valid.c:28: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
 [e-acsl] tests/special/e-acsl-valid.c:26: Warning: 
   E-ACSL construct `variant' is not yet supported. Ignoring annotation.
-[e-acsl] tests/special/e-acsl-valid.c:26: Warning: 
-  E-ACSL construct `complete behaviors' is not yet supported.
-  Ignoring annotation.
-[e-acsl] tests/special/e-acsl-valid.c:26: Warning: 
-  E-ACSL construct `disjoint behaviors' is not yet supported.
+[e-acsl] tests/special/e-acsl-valid.c:24: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
-[e-acsl] tests/special/e-acsl-valid.c:10: Warning: 
+[e-acsl] tests/special/e-acsl-valid.c:12: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
 [e-acsl] translation done in project "e-acsl".
diff --git a/src/plugins/e-acsl/tests/special/oracle_ci/gen_builtin.c b/src/plugins/e-acsl/tests/special/oracle_ci/gen_builtin.c
index dcc566b58e8566c1d56d8ef15dbf2bd961ea6918..61b7ebb65cd4a2f8f480859232517080cf439499 100644
--- a/src/plugins/e-acsl/tests/special/oracle_ci/gen_builtin.c
+++ b/src/plugins/e-acsl/tests/special/oracle_ci/gen_builtin.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 int incr(int x);
diff --git a/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-functions.c b/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-functions.c
index 26550ea8e34632be7655d310a94ce4ab60191d8a..f317d0df3bcefc001519a56a8c2a001604f0a30e 100644
--- a/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-functions.c
+++ b/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-functions.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 /*@ requires \initialized(p);
diff --git a/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-instrument.c b/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-instrument.c
index e3d9f21d1ef1d28f6ad8fc0fad2c7e32ae3899af..2ef9690828f51e9219104f370ff96285a510a3c8 100644
--- a/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-instrument.c
+++ b/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-instrument.c
@@ -1,7 +1,7 @@
 /* Generated by Frama-C */
 #include "stdarg.h"
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 extern int __e_acsl_sound_verdict;
 
 /* compiler builtin: 
diff --git a/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-valid.c b/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-valid.c
index bf53cbc448ca5002bcbb6cb8616d2642a0ed8511..890e84bc928baf7442348bff76b96f4437330ebc 100644
--- a/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-valid.c
+++ b/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-valid.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 extern int __e_acsl_sound_verdict;
@@ -99,19 +100,97 @@ int main(void)
  */
 void __gen_e_acsl_f(int *x, int *y)
 {
+  int *__gen_e_acsl_at_4;
+  int *__gen_e_acsl_at_3;
+  long __gen_e_acsl_at_2;
+  int *__gen_e_acsl_at;
+  __e_acsl_contract_t *__gen_e_acsl_contract;
   {
     int __gen_e_acsl_valid;
+    int __gen_e_acsl_active_bhvrs;
     __e_acsl_store_block((void *)(& y),(size_t)8);
     __e_acsl_store_block((void *)(& x),(size_t)8);
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                           *x == 1);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,
+                                           *x == 0);
     __gen_e_acsl_valid = __e_acsl_valid((void *)y,sizeof(int),(void *)y,
                                         (void *)(& y));
     __e_acsl_assert(__gen_e_acsl_valid,"Precondition","f","\\valid(y)",
                     "tests/special/e-acsl-valid.c",10);
+    __e_acsl_assert(*x >= 0,"Precondition","f","*x >= 0",
+                    "tests/special/e-acsl-valid.c",11);
+    __gen_e_acsl_active_bhvrs = __e_acsl_contract_partial_count_all_behaviors
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract);
+    __e_acsl_assert(__gen_e_acsl_active_bhvrs >= 1,"Precondition","f",
+                    "all behaviors complete","tests/special/e-acsl-valid.c",
+                    24);
+    __gen_e_acsl_active_bhvrs = __e_acsl_contract_partial_count_all_behaviors
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract);
+    __e_acsl_assert(__gen_e_acsl_active_bhvrs <= 1,"Precondition","f",
+                    "all behaviors disjoint","tests/special/e-acsl-valid.c",
+                    24);
+  }
+  __gen_e_acsl_at_4 = x;
+  __gen_e_acsl_at_3 = x;
+  {
+    int __gen_e_acsl_valid_read;
+    __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)x,sizeof(int),
+                                                  (void *)x,(void *)(& x));
+    __e_acsl_assert(__gen_e_acsl_valid_read,"RTE","f",
+                    "mem_access: \\valid_read(x)",
+                    "tests/special/e-acsl-valid.c",12);
+    __gen_e_acsl_at_2 = (long)*x;
   }
+  __gen_e_acsl_at = x;
   f(x,y);
-  __e_acsl_delete_block((void *)(& y));
-  __e_acsl_delete_block((void *)(& x));
-  return;
+  {
+    int __gen_e_acsl_valid_read_2;
+    int __gen_e_acsl_assumes_value;
+    __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)__gen_e_acsl_at,
+                                                    sizeof(int),
+                                                    (void *)__gen_e_acsl_at,
+                                                    (void *)(& __gen_e_acsl_at));
+    __e_acsl_assert(__gen_e_acsl_valid_read_2,"RTE","f",
+                    "mem_access: \\valid_read(__gen_e_acsl_at)",
+                    "tests/special/e-acsl-valid.c",12);
+    __e_acsl_assert((long)*__gen_e_acsl_at == __gen_e_acsl_at_2 + 1L,
+                    "Postcondition","f","*\\old(x) == \\old(*x) + 1",
+                    "tests/special/e-acsl-valid.c",12);
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)0);
+    if (__gen_e_acsl_assumes_value) {
+      int __gen_e_acsl_valid_read_3;
+      __gen_e_acsl_valid_read_3 = __e_acsl_valid_read((void *)__gen_e_acsl_at_3,
+                                                      sizeof(int),
+                                                      (void *)__gen_e_acsl_at_3,
+                                                      (void *)(& __gen_e_acsl_at_3));
+      __e_acsl_assert(__gen_e_acsl_valid_read_3,"RTE","f",
+                      "mem_access: \\valid_read(__gen_e_acsl_at_3)",
+                      "tests/special/e-acsl-valid.c",17);
+      __e_acsl_assert(*__gen_e_acsl_at_3 < 0,"Postcondition","f",
+                      "b1: *\\old(x) < 0","tests/special/e-acsl-valid.c",17);
+    }
+    __gen_e_acsl_assumes_value = __e_acsl_contract_get_behavior_assumes
+    ((__e_acsl_contract_t const *)__gen_e_acsl_contract,(size_t)1);
+    if (__gen_e_acsl_assumes_value) {
+      int __gen_e_acsl_valid_read_4;
+      __gen_e_acsl_valid_read_4 = __e_acsl_valid_read((void *)__gen_e_acsl_at_4,
+                                                      sizeof(int),
+                                                      (void *)__gen_e_acsl_at_4,
+                                                      (void *)(& __gen_e_acsl_at_4));
+      __e_acsl_assert(__gen_e_acsl_valid_read_4,"RTE","f",
+                      "mem_access: \\valid_read(__gen_e_acsl_at_4)",
+                      "tests/special/e-acsl-valid.c",20);
+      __e_acsl_assert(*__gen_e_acsl_at_4 == 1,"Postcondition","f",
+                      "b2: *\\old(x) == 1","tests/special/e-acsl-valid.c",20);
+    }
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
+    __e_acsl_delete_block((void *)(& y));
+    __e_acsl_delete_block((void *)(& x));
+    return;
+  }
 }
 
 
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_addr-by-val.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_addr-by-val.c
index 32bcce13609ed4208f028c8e73bca07ca82c2b18..ae17894128e01dbc6defcdf9c94589f425b62e21 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_addr-by-val.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_addr-by-val.c
@@ -1,7 +1,7 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdint.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(int argc, char **argv)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_args.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_args.c
index 3e24ef3f308c7f68f1fb6accf0ea4b6e604afe72..74e64a13210cbb7376a5e228d47c7359defd6eae 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_args.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_args.c
@@ -1,7 +1,6 @@
 /* Generated by Frama-C */
 #include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(int argc, char const **argv)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_array.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_array.c
index 9716b9407fbea3d261b33f75a9297ec8ab1c7a2d..e6b8e00059815b8e65de3ba22b53eeed6b2a9635 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_array.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_array.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_char.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_char.c
index 6da6eec960c029d6148152240ba285080ce36e83..36ce1e3ab274fdb43433598954c5ae80b380d7b1 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_char.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_char.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(int argc, char const **argv)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_darray.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_darray.c
index f2c564d40b49843100e080bb245424a1ef3e40e1..8b6f8a3517a3a9c0557baaca1779ba4708b3b1d6 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_darray.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_darray.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 void area_triangle(double (*vertices)[4])
 {
   {
@@ -58,7 +58,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(Vertices2));
   __e_acsl_delete_block((void *)(Vertices));
@@ -116,7 +116,7 @@ int main(int argc, char const **argv)
   __e_acsl_delete_block((void *)(vertices3));
   __e_acsl_delete_block((void *)(vertices2));
   __e_acsl_delete_block((void *)(vertices));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_dpointer.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_dpointer.c
index 54917f1f76f4ed54fee8bb91fdd07ad1cd298508..17025a19ee81ea21d97060ed8bb5bb0b2ee72f77 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_dpointer.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_dpointer.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 int main(void)
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_fptr.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_fptr.c
index 6ce50be381f69a319c1fed912c25b458a733a14b..a0774cc34295c87a5a34d639ba0140cec590ddc5 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_fptr.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_fptr.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int *foo(int *p)
 {
   int *q = p;
@@ -18,7 +18,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(& foo));
 }
@@ -69,7 +69,7 @@ int main(int argc, char const **argv)
   __e_acsl_delete_block((void *)(& fp));
   __e_acsl_delete_block((void *)(& q));
   __e_acsl_delete_block((void *)(& p));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_fun_lib.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_fun_lib.c
index 33388accb3a583dcd836676cc3d80c87a1432a8d..fa0bd6646796fd980927fa0180001ce6ac37fbb1 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_fun_lib.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_fun_lib.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 char *__gen_e_acsl_literal_string;
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_fun_ptr.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_fun_ptr.c
index 43f3a37fa9f431f9d1c235a64910218094a2bdbb..7182f81e3d3d82a7c9f257404cc3817ce9efabd0 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_fun_ptr.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_fun_ptr.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdint.h"
 #include "stdio.h"
 #include "stdlib.h"
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_getenv.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_getenv.c
index b574f1ebb23ff90ef20b247d80dc53950ba7cac1..f1daa120b06f0d4839dfb06037889756fb21fe82 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_getenv.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_getenv.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 char *__gen_e_acsl_literal_string_2;
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_global_init.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_global_init.c
index 1a223bf90f4bb66628d86a49641066fc554af8cc..c91eca2c10152d43084174f55903cdc2d34618b6 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_global_init.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_global_init.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 char *__gen_e_acsl_literal_string;
 char *__gen_e_acsl_literal_string_2;
 char *__gen_e_acsl_literal_string_4;
@@ -110,7 +110,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(descs2));
   __e_acsl_delete_block((void *)(& l_desc2));
@@ -204,7 +204,7 @@ int main(int argc, char const **argv)
   /*@ assert \valid_read(*p); */ ;
   __retres = 0;
   __e_acsl_delete_block((void *)(& p));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_labels.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_labels.c
index a0229a5254addc2c7a74de23b0aa3c3121d77d29..a582605286fe4fd188a50c40f4241f7c19a5016e 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_labels.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_labels.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 void foo(int *a, int *b)
 {
   __e_acsl_store_block((void *)(& b),(size_t)8);
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_lit_string.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_lit_string.c
index 89bdc1b2a15ac81de191637ff8a7166ea868c723..22d485e658bc051bdaf6f9158b2456e76fbaa649 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_lit_string.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_lit_string.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 char *__gen_e_acsl_literal_string_2;
 char *__gen_e_acsl_literal_string;
 void __e_acsl_globals_init(void)
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_local_init.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_local_init.c
index 007456238249612053c6ccc263073ada9d9840ba..1b6b3cd7af3b988453828e9ba7090dda85407203 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_local_init.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_local_init.c
@@ -1,7 +1,6 @@
 /* Generated by Frama-C */
 #include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 char *__gen_e_acsl_literal_string_4;
 char *__gen_e_acsl_literal_string_3;
 char *__gen_e_acsl_literal_string;
@@ -107,7 +106,7 @@ void __e_acsl_globals_init(void)
   return;
 }
 
-void __e_acsl_globals_delete(void)
+void __e_acsl_globals_clean(void)
 {
   __e_acsl_delete_block((void *)(Str));
   __e_acsl_delete_block((void *)(Strings));
@@ -427,7 +426,7 @@ int main(int argc, char const **argv)
   __e_acsl_delete_block((void *)(str));
   __e_acsl_delete_block((void *)(& p));
   __e_acsl_delete_block((void *)(strings));
-  __e_acsl_globals_delete();
+  __e_acsl_globals_clean();
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_malloc-asan.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_malloc-asan.c
index 08d4bb0a0ae5e99f210cb68c0d31d6be16a79d4b..670764770e98f63c776052e30aff421eee39a713 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_malloc-asan.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_malloc-asan.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 char *__gen_e_acsl_literal_string;
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_malloc.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_malloc.c
index b58537e485ce8c45b8dc68dd97a571a1631a62a4..6e7fbc4aed230a66be52eab7df485f78ba7e881d 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_malloc.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_malloc.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 int main(void)
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_scope.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_scope.c
index 8a0fc1325ad2739c205d5f68f3c75da00e5f9f53..9b76adcf47e0bb33f3c35e7637517adc88f17534 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_scope.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_scope.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_struct.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_struct.c
index 76272a2c173eda3263af3b55e463cbcf37df88f2..05b096a580145808c2bfac87c0bfa277a2b31c5b 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_struct.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_struct.c
@@ -1,4 +1,5 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
 #include "stdlib.h"
 struct temporal_t {
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_while.c b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_while.c
index b63675cf0ac80af956653e6eecf3ea3e20c391c5..e44bc6c264050ba1442a65bf25ce1d89e6127b7c 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_while.c
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/gen_t_while.c
@@ -1,6 +1,6 @@
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
 int main(void)
 {
   int __retres;
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/t_getenv.res.oracle b/src/plugins/e-acsl/tests/temporal/oracle_ci/t_getenv.res.oracle
index b55cb5a92eafcf2f00321298635858249ab4b402..466e50c6150635682a7fa2664722e39de64c0707 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/t_getenv.res.oracle
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/t_getenv.res.oracle
@@ -5,7 +5,7 @@
 [e-acsl] FRAMAC_SHARE/libc/stdlib.h:486: Warning: 
   E-ACSL construct `logic functions with labels' is not yet supported.
   Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/stdlib.h:486: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:485: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
 [e-acsl] translation done in project "e-acsl".
diff --git a/src/plugins/e-acsl/tests/temporal/oracle_ci/t_memcpy.res.oracle b/src/plugins/e-acsl/tests/temporal/oracle_ci/t_memcpy.res.oracle
index c88bb93bb619661810e3435aa84bf288519fdd55..101a07c7fb68b6985cbe8896de359855582c12bd 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle_ci/t_memcpy.res.oracle
+++ b/src/plugins/e-acsl/tests/temporal/oracle_ci/t_memcpy.res.oracle
@@ -24,7 +24,7 @@
   Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/string.h:95: Warning: 
   E-ACSL construct `\separated' is not yet supported. Ignoring annotation.
-[e-acsl] FRAMAC_SHARE/libc/string.h:95: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/string.h:92: Warning: 
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/string.h:98: Warning: 
diff --git a/src/plugins/gui/launcher.ml b/src/plugins/gui/launcher.ml
index 012baa36514628b1478be9e2d0964ec016197fec..447e7ae8e0a669303dfd0273ca5a7cdac9b44783 100644
--- a/src/plugins/gui/launcher.ml
+++ b/src/plugins/gui/launcher.ml
@@ -137,7 +137,10 @@ let add_group (box:GPack.box) label options =
   in
   let highlight =
     List.fold_right
-      (fun p b -> let is_set = add_parameter box p in b || is_set)
+      (fun p b ->
+         if p.Typed_parameter.reconfigurable then
+           let is_set = add_parameter box p in b || is_set
+         else b)
       options
       false
   in
@@ -275,7 +278,7 @@ let show ?height ?width ~(host:basic_main) () =
       `HORIZONTAL ~layout:`END ~packing:dialog#action_area#pack ()
   in
   let cancel =
-    GButton.button ~label:"Cancel" ~stock:`CANCEL ~packing:buttons#pack ()
+    GButton.button ~label:"Close" ~stock:`CANCEL ~packing:buttons#pack ()
   in
   ignore (cancel#connect#released dialog#destroy);
   let button_run =
diff --git a/src/plugins/gui/property_navigator.ml b/src/plugins/gui/property_navigator.ml
index cc6b91fad051562f7170a891918d900a29429f23..e2f62844d00d39aac3e2c09cc96e44f7b8138d3e 100644
--- a/src/plugins/gui/property_navigator.ml
+++ b/src/plugins/gui/property_navigator.ml
@@ -636,14 +636,12 @@ let make_panel (main_ui:main_window_extension_points) =
     | IPLemma _ -> lemmas.get ()
     | IPComplete _ -> complete_disjoint.get ()
     | IPDisjoint _ -> complete_disjoint.get ()
-    | IPCodeAnnot {ica_ca={annot_content = AAssert (_, kind, _)} as ca} ->
+    | IPCodeAnnot {ica_ca={annot_content=AAssert(_, {tp_only_check})} as ca} ->
       begin
         match Alarms.find ca with
         | Some a -> rte.get () && active_alarm a
         | None ->
-          match kind with
-          | Assert -> user_assertions.get ()
-          | Check -> user_checks.get ()
+          if tp_only_check then user_checks.get() else  user_assertions.get ()
       end
     | IPCodeAnnot {ica_ca={annot_content = AInvariant _}} ->
       invariant.get ()
diff --git a/src/plugins/inout/inout_parameters.ml b/src/plugins/inout/inout_parameters.ml
index d40e57102efed31295867246403399efe4718591..eef83915883414ce93655863cb71e4030f8c9086 100644
--- a/src/plugins/inout/inout_parameters.ml
+++ b/src/plugins/inout/inout_parameters.ml
@@ -77,21 +77,6 @@ module ForceInout =
        let help = "Compute operational inputs, an over-approximation of the set of locations whose initial value is used; and the sure outputs, an under-approximation of the set of the certainly written locations"
      end)
 
-(* Remove in Frama-C Chlorine *)
-let () = Parameter_customize.is_invisible ()
-module ForceCallwiseInout =
-  True
-    (struct
-       let option_name = "-inout-callwise"
-       let help = "Compute callsite-wide operational inputs; this results in more precise results for -inout and -out options"
-    end)
-let () =
-  ForceCallwiseInout.add_update_hook
-    (fun _ new_ ->
-       if not new_ then
-         Kernel.abort "@[option -inout-callwise can no longer be unset.@]")
-
-
 module ForceInoutExternalWithFormals =
   False
     (struct
diff --git a/src/plugins/inout/inout_parameters.mli b/src/plugins/inout/inout_parameters.mli
index 3f5390706a6d4f95a9ff23e157d11e5ea6d36998..d59478b1bb4b6d5abc66fda2febf90f8cc2f0aa6 100644
--- a/src/plugins/inout/inout_parameters.mli
+++ b/src/plugins/inout/inout_parameters.mli
@@ -28,7 +28,6 @@ module ForceExternalOut: Parameter_sig.Bool
 module ForceInput: Parameter_sig.Bool
 module ForceInputWithFormals: Parameter_sig.Bool
 module ForceInout: Parameter_sig.Bool
-module ForceCallwiseInout: Parameter_sig.Bool
 module ForceInoutExternalWithFormals: Parameter_sig.Bool
 module ForceDeref: Parameter_sig.Bool
 
diff --git a/src/plugins/inout/operational_inputs.ml b/src/plugins/inout/operational_inputs.ml
index 777c7ce0892b7a680201d7920f83d8fca3b58014..0a9e939486499af8718a176957bb3b8705e2997e 100644
--- a/src/plugins/inout/operational_inputs.ml
+++ b/src/plugins/inout/operational_inputs.ml
@@ -215,16 +215,14 @@ module Internals =
 module CallsiteHash = Value_types.Callsite.Hashtbl
 
 (* Results of an an entire call, represented by a pair (stmt, kernel_function).
-   This table is filled by the [-inout-callwise] option, or for functions for
-   which only the specification is used. *)
+*)
 module CallwiseResults =
   State_builder.Hashtbl
   (Value_types.Callsite.Hashtbl)
   (Inout_type)
   (struct
     let size = 17
-    let dependencies = [Internals.self;
-                        Inout_parameters.ForceCallwiseInout.self]
+    let dependencies = [Internals.self]
     let name = "Inout.Operational_inputs.CallwiseResults"
    end)
 
@@ -373,7 +371,7 @@ end) = struct
     Annotations.iter_code_annot
       (fun _ ca ->
          match ca.annot_content with
-         | AAssert (_, _, p)
+         | AAssert (_, p)
          | AInvariant (_, true, p) ->
            begin
              let env =
@@ -382,7 +380,7 @@ end) = struct
                  ~here:(X.stmt_state stmt)
                  ()
              in
-             match Eva.Eval_terms.predicate_deps env p with
+             match Eva.Eval_terms.predicate_deps env p.tp_statement with
              | None ->
                (* To be sound, we should perform a join with the top zone here.
                   We do nothing instead because the latter behavior would
@@ -565,10 +563,6 @@ let extract_inout_from_froms froms =
 
 module Callwise = struct
 
-  let compute_callwise () =
-    Inout_parameters.ForceCallwiseInout.get () ||
-      Dynamic.Parameter.Bool.get "-memexec-all" ()
-
   let merge_call_in_local_table call local_table v =
     let prev =
       try CallsiteHash.find local_table call
@@ -600,41 +594,39 @@ module Callwise = struct
   let call_inout_stack = ref []
 
   let call_for_callwise_inout (call_type, state, call_stack) =
-    if compute_callwise () then begin
-      let (current_function, ki as call_site) = List.hd call_stack in
-      let merge_inout inout =
-        if ki = Kglobal 
-        then merge_call_in_global_tables call_site inout
-        else
-          let _above_function, table =
-            try List.hd !call_inout_stack
-            with Failure _ -> assert false
-          in
-          merge_call_in_local_table call_site table inout
-      in
-      match call_type with
-      | `Builtin {Value_types.c_from = Some (froms,sure_out) } ->
-         let in_, out_ = extract_inout_from_froms froms in
-         let inout = {
-           over_inputs_if_termination = in_;
-           over_inputs = in_;
-           over_logic_inputs = Zone.bottom;
-           over_outputs_if_termination = out_ ;
-           over_outputs = out_;
-           under_outputs_if_termination = sure_out;
-         } in
-         merge_inout inout
-      | `Def | `Memexec ->
-        let table_current_function = CallsiteHash.create 7 in
-        call_inout_stack :=
-          (current_function, table_current_function) :: !call_inout_stack
-      | `Spec spec ->
-        let inout =compute_using_given_spec_state state spec current_function in
-        merge_inout inout
-      | `Builtin { Value_types.c_from = None } ->
-        let inout = compute_using_prototype_state state current_function in
-        merge_inout inout
-    end;;
+    let (current_function, ki as call_site) = List.hd call_stack in
+    let merge_inout inout =
+      if ki = Kglobal 
+      then merge_call_in_global_tables call_site inout
+      else
+        let _above_function, table =
+          try List.hd !call_inout_stack
+          with Failure _ -> assert false
+        in
+        merge_call_in_local_table call_site table inout
+    in
+    match call_type with
+    | `Builtin {Value_types.c_from = Some (froms,sure_out) } ->
+      let in_, out_ = extract_inout_from_froms froms in
+      let inout = {
+        over_inputs_if_termination = in_;
+        over_inputs = in_;
+        over_logic_inputs = Zone.bottom;
+        over_outputs_if_termination = out_ ;
+        over_outputs = out_;
+        under_outputs_if_termination = sure_out;
+      } in
+      merge_inout inout
+    | `Def | `Memexec ->
+      let table_current_function = CallsiteHash.create 7 in
+      call_inout_stack :=
+        (current_function, table_current_function) :: !call_inout_stack
+    | `Spec spec ->
+      let inout =compute_using_given_spec_state state spec current_function in
+      merge_inout inout
+    | `Builtin { Value_types.c_from = None } ->
+      let inout = compute_using_prototype_state state current_function in
+      merge_inout inout
 
 
   module MemExec =
@@ -711,31 +703,30 @@ module Callwise = struct
     Computer.end_dataflow ()
 
   let record_for_callwise_inout ((call_stack: Db.Value.callstack), value_res) =
-    if compute_callwise () then
-      let inout = match value_res with
-        | Value_types.Normal (states, _after_states)
-        | Value_types.NormalStore ((states, _after_states), _) ->
-            let kf, _ = List.hd call_stack in
-            let inout =
-              try
-                if !Db.Value.no_results (Kernel_function.get_definition kf) then
-                  top
-              else
-                compute_call_from_value_states kf call_stack (Lazy.force states)
-              with Kernel_function.No_Definition -> top
-            in
-            (match value_res with
-               | Value_types.NormalStore (_, memexec_counter) ->
-                   MemExec.replace memexec_counter inout
-               | _ -> ());
-            inout
-
-        | Value_types.Reuse counter ->
-            MemExec.find counter
-      in
-      Db.Operational_inputs.Record_Inout_Callbacks.apply
-        (call_stack, inout);
-      end_record call_stack inout
+    let inout = match value_res with
+      | Value_types.Normal (states, _after_states)
+      | Value_types.NormalStore ((states, _after_states), _) ->
+        let kf, _ = List.hd call_stack in
+        let inout =
+          try
+            if !Db.Value.no_results (Kernel_function.get_definition kf) then
+              top
+            else
+              compute_call_from_value_states kf call_stack (Lazy.force states)
+          with Kernel_function.No_Definition -> top
+        in
+        (match value_res with
+         | Value_types.NormalStore (_, memexec_counter) ->
+           MemExec.replace memexec_counter inout
+         | _ -> ());
+        inout
+
+      | Value_types.Reuse counter ->
+        MemExec.find counter
+    in
+    Db.Operational_inputs.Record_Inout_Callbacks.apply
+      (call_stack, inout);
+    end_record call_stack inout
 
 
   (* Register our callbacks inside the value analysis *)
@@ -816,8 +807,8 @@ let get_internal =
   Internals.memo
     (fun kf ->
        !Db.Value.compute ();
-       try Internals.find kf (* If [-inout-callwise] is set, the results may
-                              have been computed by the call to Value.compute *)
+       try Internals.find kf (* The results may have been computed by the call
+                                to Value.compute *)
        with
          | Not_found ->
              if!Db.Value.use_spec_instead_of_definition kf then
diff --git a/src/plugins/instantiate/stdlib/basic_alloc.ml b/src/plugins/instantiate/stdlib/basic_alloc.ml
index a35a97b53e37d96e97149e0bb851c4db758cac6c..42142cc28c44a5064df718b6d0499850aff7bca7 100644
--- a/src/plugins/instantiate/stdlib/basic_alloc.ml
+++ b/src/plugins/instantiate/stdlib/basic_alloc.ml
@@ -82,6 +82,7 @@ let make_axiomatic_is_allocable loc () =
   let cond = pand (prel (Rlt, t_i, zero), prel (Rgt, t_i, max)) in
   let app = pnot (papp (is_allocable,[label],[t_i])) in
   let prop = pforall ([lv_i], pimplies (cond, app)) in
+  let prop = Logic_const.toplevel_predicate prop in
   let gfun = Dfun_or_pred(is_allocable, loc) in
   let axiom = Dlemma("never_allocable", true, [label],[],prop,[], loc) in
   ("dynamic_allocation", [gfun ; axiom]), [is_allocable]
diff --git a/src/plugins/loop_analysis/tests/loop_analysis/with_value.i b/src/plugins/loop_analysis/tests/loop_analysis/with_value.i
index b147374aa576d736dc929426f708f2517ac1377e..b030fa5e58dbcbe8a8d388fcc49097265f53ec38 100644
--- a/src/plugins/loop_analysis/tests/loop_analysis/with_value.i
+++ b/src/plugins/loop_analysis/tests/loop_analysis/with_value.i
@@ -1,5 +1,5 @@
 /*run.config
-OPT: -no-autoload-plugins -load-module from,inout,loopanalysis,eva,scope -val -val-show-progress -then -loop
+OPT: -no-autoload-plugins -load-module from,inout,loopanalysis,eva,scope -eva -eva-show-progress -then -loop
 */
 
 void f1(int n) {
diff --git a/src/plugins/markdown-report/mdr_params.ml b/src/plugins/markdown-report/mdr_params.ml
index aa1f44492edcbf6bf96b42274c482d762f36f279..ce052fa96fddda7cf1c709be133ad75ca4847083 100644
--- a/src/plugins/markdown-report/mdr_params.ml
+++ b/src/plugins/markdown-report/mdr_params.ml
@@ -20,6 +20,8 @@
 (*                                                                        *)
 (**************************************************************************)
 
+module Pervasives_string = String
+
 include Plugin.Register(
   struct
     let name = "Markdown report"
@@ -27,14 +29,6 @@ include Plugin.Register(
     let help = "generates a report in markdown format"
   end)
 
-module Output = String(
-  struct
-    let option_name = "-mdr-out"
-    let arg_name = "f"
-    let default = "report.md"
-    let help = "sets the name of the output file to <f>"
-  end)
-
 module Generate = String(
   struct
     let option_name = "-mdr-gen"
@@ -45,6 +39,26 @@ module Generate = String(
        none (default), md, draft and sarif"
   end)
 
+module Output : Parameter_sig.String =
+struct
+  include String(
+    struct
+      let option_name = "-mdr-out"
+      let arg_name = "f"
+      let default = "report"
+      let help = "sets the name of the output file to <f>. \
+                  If <f> has no extension, it is chosen automatically based on \
+                  the report kind"
+    end)
+  let get () =
+    let s = get () in
+    if Pervasives_string.contains (Filename.basename s) '.' then s
+    else
+      let kind = Generate.get () in
+      let ext = if kind = "sarif" then ".sarif" else ".md" in
+      s ^ ext
+end
+
 let () =
   Generate.set_possible_values [ "none"; "md"; "draft"; "sarif" ]
 
diff --git a/src/plugins/markdown-report/sarif.ml b/src/plugins/markdown-report/sarif.ml
index 00977f9a56c77251ec178b290ee62451f9c83358..e50d9262a43d86b80a48ebdccb28b14f4bc8a12c 100644
--- a/src/plugins/markdown-report/sarif.ml
+++ b/src/plugins/markdown-report/sarif.ml
@@ -20,7 +20,7 @@
 (*                                                                        *)
 (**************************************************************************)
 
-(** OCaml representation for the sarif 2.0 schema. *)
+(** OCaml representation for the sarif 2.1 schema. *)
 
 (** ppx_deriving_yojson generates parser and printer that are recursive
     by default: we must thus silence spurious let rec warning (39). *)
@@ -32,6 +32,15 @@ module type Json_type = sig
   val to_yojson: t -> Yojson.Safe.t
 end
 
+module Json_string: Json_type with type t = string =
+struct
+  type t = string
+  let of_yojson = function
+    | `String s -> Ok s
+    | _ -> Error "string"
+  let to_yojson s = `String s
+end
+
 module Json_dictionary(J: Json_type):
   Json_type with type t = (string * J.t) list =
 struct
@@ -55,6 +64,8 @@ struct
     `Assoc json_l
 end
 
+module JsonStringDictionary = Json_dictionary(Json_string)
+
 module Uri: sig
   include Json_type with type t = private string
   val sarif_github:t
@@ -63,74 +74,141 @@ end
 struct
   type t = string[@@deriving yojson]
   let sarif_github =
-    "https://github.com/oasis-tcs/sarif-spec/blob/master/Documents/CommitteeSpecificationDrafts/v2.0-CSD.1/sarif-schema.json"
+    "https://github.com/oasis-tcs/sarif-spec/blob/master/Documents/CommitteeSpecificationDrafts/v2.1.0-CSD.1/sarif-schema-2.1.0.json"
 end
 
 module Version: sig
   include Json_type with type t = private string
-  val v2_0_0: t
+  val v2_1_0: t
 end
 =
 struct
   type t = string[@@deriving yojson]
-  let v2_0_0 = "2.0.0"
+  let v2_1_0 = "2.1.0"
+end
+
+module ArtifactLocation = struct
+  type t = {
+    uri: string;
+    uriBaseId: (string [@default ""])
+  }[@@deriving yojson]
+
+  let create ~uri ?(uriBaseId = "") () = { uri; uriBaseId }
+
+  let default = create ~uri:"" ()
+
+  let of_loc loc =
+    let open Filepath in
+    (* by construction, we have an absolute path here, no need for uriBase *)
+    let uri = ((fst loc).pos_path :> string) in
+    create ~uri ()
+end
+
+module ArtifactLocationDictionary = Json_dictionary(ArtifactLocation)
+
+module Custom_properties =
+  Json_dictionary(struct
+    type t = Yojson.Safe.t
+    let of_yojson x = Ok x
+    let to_yojson x = x
+  end)
+
+module Properties = struct
+  type tags = string list [@@deriving yojson]
+
+  type t = {
+    tags: tags;
+    additional_properties: Custom_properties.t
+  }
+
+  let default = { tags = []; additional_properties = [] }
+
+  let create additional_properties =
+    let tags = List.map fst additional_properties in
+    { tags; additional_properties }
+
+  let of_yojson = function
+    | `Null -> Ok default
+    | `Assoc l ->
+      (match List.assoc_opt "tags" l with
+       | None -> Error "properties"
+       | Some json ->
+         (match tags_of_yojson json with
+          | Ok tags ->
+            let additional_properties = List.remove_assoc "tags" l in
+            Ok { tags; additional_properties }
+          | Error loc -> Error ("properties." ^ loc)))
+    | _ -> Error "properties"
+
+  let to_yojson { tags; additional_properties } =
+    match tags with
+    | [] -> `Null
+    | _ -> `Assoc (("tags", tags_to_yojson tags)::additional_properties)
 end
 
 module Message = struct
   type t = {
     text: (string [@default ""]);
-    messageId: (string [@default ""]);
-    richText: (string [@default ""]);
-    richMessageId: (string [@default ""]);
+    id: (string [@default ""]);
+    markdown: (string [@default ""]);
     arguments: (string list [@default []]);
+    properties: (Properties.t [@default Properties.default]);
   }[@@deriving yojson]
 
   let create
       ?(text="")
-      ?(messageId="")
-      ?(richText="")
-      ?(richMessageId="")
+      ?(id="")
+      ?(markdown="")
       ?(arguments=[])
+      ?(properties=Properties.default)
       ()
     =
-    { text; messageId; richText; richMessageId; arguments }
+    { text; id; markdown; arguments; properties }
 
-  let plain_text ~text ?id:messageId ?arguments () =
-    create ~text ?messageId ?arguments ()
+  let plain_text ~text ?id ?arguments () =
+    create ~text ?id ?arguments ()
 
-  let markdown ~markdown ?id:richMessageId ?arguments () =
+  let markdown ~markdown ?id ?arguments () =
     let pp fmt = Markdown.pp_elements fmt in
-    let richText = String.trim (Format.asprintf "@[%a@]" pp markdown)
+    let markdown = String.trim (Format.asprintf "@[%a@]" pp markdown)
     in
-    create ~richText ?richMessageId ?arguments ()
+    create ~markdown ?id ?arguments ()
 
   let default = create ()
 end
 
-module FileLocation = struct
+module MultiformatMessageString = struct
   type t = {
-    uri: string;
-    uriBaseId: (string [@default ""])
+    text: string;
+    markdown: (string [@default ""]);
+    properties: (Properties.t [@default Properties.default])
   }[@@deriving yojson]
 
-  let create ~uri ?(uriBaseId = "") () = { uri; uriBaseId }
+  let create ~text ?(markdown="") ?(properties=Properties.default) () =
+    { text; markdown; properties }
 
-  let default = create ~uri:"" ()
-
-  let of_loc loc =
-    let open Filepath in
-    (* by construction, we have an absolute path here, no need for uriBase *)
-    let uri = ((fst loc).pos_path :> string) in
-    create ~uri ()
+  let default = create ~text:"default" ()
 end
 
-module FileContent = struct
+module MultiformatMessageStringDictionary =
+  Json_dictionary(MultiformatMessageString)
+
+module ArtifactContent = struct
   type t =
-    | Text of string [@name "text"]
-          | Binary of string [@name "binary"]
+    { text: (string [@default ""]);
+      binary: (string [@default ""]);
+      rendered:
+        (MultiformatMessageString.t [@default MultiformatMessageString.default]);
+      properties: (Properties.t [@default Properties.default])
+    }
   [@@deriving yojson]
 
-  let default = Text ""
+  let create ?(text="") ?(binary="")
+      ?(rendered=MultiformatMessageString.default)
+      ?(properties=Properties.default) () =
+    { text; binary; rendered; properties }
+
+  let default = create ()
 end
 
 module Region = struct
@@ -143,7 +221,7 @@ module Region = struct
     charLength: (int [@default 0]);
     byteOffset: (int [@default 0]);
     byteLength: (int [@default 0]);
-    snippet: (FileContent.t [@default FileContent.default]);
+    snippet: (ArtifactContent.t [@default ArtifactContent.default]);
     message: (Message.t [@default Message.default])
   }[@@deriving yojson]
 
@@ -156,7 +234,7 @@ module Region = struct
       ?(charLength = 0)
       ?(byteOffset = 0)
       ?(byteLength = 0)
-      ?(snippet = FileContent.default)
+      ?(snippet = ArtifactContent.default)
       ?(message = Message.default)
       ()
     =
@@ -187,69 +265,29 @@ module Rectangle = struct
   [@@deriving yojson]
 end
 
-module Custom_properties =
-  Json_dictionary(struct
-    type t = Yojson.Safe.t
-    let of_yojson x = Ok x
-    let to_yojson x = x
-  end)
-
-module Properties = struct
-  type tags = string list [@@deriving yojson]
-
-  type t = {
-    tags: tags;
-    additional_properties: Custom_properties.t
-  }
-
-  let default = { tags = []; additional_properties = [] }
-
-  let create additional_properties =
-    let tags = List.map fst additional_properties in
-    { tags; additional_properties }
-
-  let of_yojson = function
-    | `Null -> Ok default
-    | `Assoc l ->
-      (match List.assoc_opt "tags" l with
-       | None -> Error "properties"
-       | Some json ->
-         (match tags_of_yojson json with
-          | Ok tags ->
-            let additional_properties = List.remove_assoc "tags" l in
-            Ok { tags; additional_properties }
-          | Error loc -> Error ("properties." ^ loc)))
-    | _ -> Error "properties"
-
-  let to_yojson { tags; additional_properties } =
-    match tags with
-    | [] -> `Null
-    | _ -> `Assoc (("tags", tags_to_yojson tags)::additional_properties)
-end
-
 module PhysicalLocation = struct
   type t = {
     id: (string [@default ""]);
-    fileLocation: FileLocation.t;
+    artifactLocation: ArtifactLocation.t;
     region: (Region.t [@default Region.default]);
     contextRegion: (Region.t [@default Region.default]);
   }[@@deriving yojson]
 
   let create
       ?(id = "")
-      ~fileLocation
+      ~artifactLocation
       ?(region = Region.default)
       ?(contextRegion = Region.default)
       ()
     =
-    { id; fileLocation; region; contextRegion }
+    { id; artifactLocation; region; contextRegion }
 
-  let default = create ~fileLocation:FileLocation.default ()
+  let default = create ~artifactLocation:ArtifactLocation.default ()
 
   let of_loc loc =
-    let fileLocation = FileLocation.of_loc loc in
+    let artifactLocation = ArtifactLocation.of_loc loc in
     let region = Region.of_loc loc in
-    create ~fileLocation ~region ()
+    create ~artifactLocation ~region ()
 
 end
 
@@ -356,7 +394,7 @@ end
 module Attachment = struct
   type t = {
     description: (Message.t [@default Message.default ]);
-    fileLocation: FileLocation.t;
+    artifactLocation: ArtifactLocation.t;
     regions: (Region.t list [@default []]);
     rectangles: (Rectangle.t list [@default []])
   } [@@deriving yojson]
@@ -416,7 +454,7 @@ module Notification = struct
   }[@@deriving yojson]
 end
 
-module Tool = struct
+module Driver = struct
   type t = {
     name: string;
     fullName: (string [@default ""]);
@@ -445,7 +483,16 @@ module Tool = struct
       downloadUri; sarifLoggerVersion; language; properties }
 
   let default = create ~name:"" ()
+end
+
+module Tool = struct
+  type t = {
+    driver: Driver.t
+  }[@@deriving yojson]
 
+  let create driver = { driver; }
+
+  let default = create Driver.default
 end
 
 module Invocation = struct
@@ -453,7 +500,7 @@ module Invocation = struct
   type t =  {
     commandLine: string;
     arguments: string list;
-    responseFiles: (FileLocation.t list [@default []]);
+    responseFiles: (ArtifactLocation.t list [@default []]);
     attachments: (Attachment.t list [@default []]);
     startTime: (string [@default ""]);
     endTime: (string [@default ""]);
@@ -464,18 +511,18 @@ module Invocation = struct
     exitSignalName: (string [@default ""]);
     exitSignalNumber: (int [@default 0]);
     processStartFailureMessage: (string [@default ""]);
-    toolExecutionSuccessful: bool;
+    executionSuccessful: bool;
     machine: (string [@default ""]);
     account: (string [@default ""]);
     processId: (int [@default 0]);
-    executableLocation: (FileLocation.t [@default FileLocation.default]);
-    workingDirectory: (FileLocation.t [@default FileLocation.default]);
+    executableLocation: (ArtifactLocation.t [@default ArtifactLocation.default]);
+    workingDirectory: (ArtifactLocation.t [@default ArtifactLocation.default]);
     environmentVariables:
       (Additional_properties.t [@default Additional_properties.default]);
-    stdin: (FileLocation.t [@default FileLocation.default]);
-    stdout: (FileLocation.t [@default FileLocation.default]);
-    stderr: (FileLocation.t [@default FileLocation.default]);
-    stdoutStderr: (FileLocation.t [@default FileLocation.default]);
+    stdin: (ArtifactLocation.t [@default ArtifactLocation.default]);
+    stdout: (ArtifactLocation.t [@default ArtifactLocation.default]);
+    stderr: (ArtifactLocation.t [@default ArtifactLocation.default]);
+    stdoutStderr: (ArtifactLocation.t [@default ArtifactLocation.default]);
     properties: (Properties.t [@default Properties.default]);
   }[@@deriving yojson]
 
@@ -493,17 +540,17 @@ module Invocation = struct
       ?(exitSignalName = "")
       ?(exitSignalNumber = 0)
       ?(processStartFailureMessage = "")
-      ?(toolExecutionSuccessful = true)
+      ?(executionSuccessful = true)
       ?(machine = "")
       ?(account = "")
       ?(processId = 0)
-      ?(executableLocation = FileLocation.default)
-      ?(workingDirectory = FileLocation.default)
+      ?(executableLocation = ArtifactLocation.default)
+      ?(workingDirectory = ArtifactLocation.default)
       ?(environmentVariables = Additional_properties.default)
-      ?(stdin = FileLocation.default)
-      ?(stdout = FileLocation.default)
-      ?(stderr = FileLocation.default)
-      ?(stdoutStderr = FileLocation.default)
+      ?(stdin = ArtifactLocation.default)
+      ?(stdout = ArtifactLocation.default)
+      ?(stderr = ArtifactLocation.default)
+      ?(stdoutStderr = ArtifactLocation.default)
       ?(properties = Properties.default)
       ()
     =
@@ -521,7 +568,7 @@ module Invocation = struct
       exitSignalName;
       exitSignalNumber;
       processStartFailureMessage;
-      toolExecutionSuccessful;
+      executionSuccessful;
       machine;
       account;
       processId;
@@ -543,13 +590,13 @@ module Conversion = struct
   type t = {
     tool: Tool.t;
     invocation: (Invocation.t [@default Invocation.default]);
-    analysisToolLogFiles: (FileLocation.t [@default FileLocation.default]);
+    analysisToolLogFiles: (ArtifactLocation.t [@default ArtifactLocation.default]);
   } [@@deriving yojson]
 
   let default = {
-    tool = Tool.default;
+    tool = {driver = Driver.default};
     invocation = Invocation.default;
-    analysisToolLogFiles = FileLocation.default;
+    analysisToolLogFiles = ArtifactLocation.default;
   }
 end
 
@@ -650,48 +697,53 @@ end
 module Replacement = struct
   type t = {
     deletedRegion: Region.t;
-    insertedContent: (FileContent.t [@default FileContent.default])
+    insertedContent: (ArtifactContent.t [@default ArtifactContent.default])
   }[@@deriving yojson]
 end
 
-module File = struct
+module Artifact = struct
   type t = {
-    fileLocation: (FileLocation.t [@default FileLocation.default]);
-    parentKey: (string [@default ""]);
+    description: (Message.t [@default Message.default]);
+    location: (ArtifactLocation.t [@default ArtifactLocation.default]);
+    parentIndex: (int [@default -1]);
     offset: (int [@default 0]);
-    length: (int [@default 0]);
+    length: (int [@default -1]);
     roles: (Role.t list [@default []]);
     mimeType: (string [@default ""]);
-    contents: (FileContent.t [@default FileContent.default]);
+    contents: (ArtifactContent.t [@default ArtifactContent.default]);
     encoding: (string [@default ""]);
-    hashes: (Hash.t list [@default []]);
-    lastModifiedTime: (string [@default ""]);
+    sourceLanguage: (string [@default ""]);
+    hashes: (JsonStringDictionary.t [@default []]);
+    lastModifiedTimeUtc: (string [@default ""]);
     properties: (Properties.t [@default Properties.default]);
   }[@@deriving yojson]
 
   let create
-      ?(fileLocation = FileLocation.default)
-      ?(parentKey = "")
+      ?(description = Message.default)
+      ?(location = ArtifactLocation.default)
+      ?(parentIndex = -1)
       ?(offset = 0)
-      ?(length = 0)
+      ?(length = -1)
       ?(roles = [])
       ?(mimeType = "")
-      ?(contents = FileContent.default)
+      ?(contents = ArtifactContent.default)
       ?(encoding = "")
+      ?(sourceLanguage = "")
       ?(hashes = [])
-      ?(lastModifiedTime = "")
+      ?(lastModifiedTimeUtc = "")
       ?(properties = Properties.default)
       ()
     =
     {
-      fileLocation; parentKey; offset; length; roles; mimeType; contents;
-      encoding; hashes; lastModifiedTime; properties
+      description; location; parentIndex; offset; length; roles; mimeType;
+      contents; encoding; sourceLanguage; hashes; lastModifiedTimeUtc;
+      properties
     }
 end
 
 module FileChange = struct
   type t = {
-    fileLocation: FileLocation.t;
+    artifactLocation: ArtifactLocation.t;
     replacements: Replacement.t list
   }[@@deriving yojson]
 end
@@ -705,13 +757,13 @@ end
 
 module ExternalFiles = struct
   type t = {
-    conversion: (FileLocation.t [@default FileLocation.default]);
-    files: (FileLocation.t [@default FileLocation.default]);
-    graphs: (FileLocation.t [@default FileLocation.default]);
-    invocations: (FileLocation.t list [@default []]);
-    logicalLocations: (FileLocation.t [@default FileLocation.default]);
-    resources: (FileLocation.t [@default FileLocation.default]);
-    results: (FileLocation.t [@default FileLocation.default]);
+    conversion: (ArtifactLocation.t [@default ArtifactLocation.default]);
+    files: (ArtifactLocation.t [@default ArtifactLocation.default]);
+    graphs: (ArtifactLocation.t [@default ArtifactLocation.default]);
+    invocations: (ArtifactLocation.t list [@default []]);
+    logicalLocations: (ArtifactLocation.t [@default ArtifactLocation.default]);
+    resources: (ArtifactLocation.t [@default ArtifactLocation.default]);
+    results: (ArtifactLocation.t [@default ArtifactLocation.default]);
   }[@@deriving yojson]
 end
 
@@ -728,104 +780,169 @@ end
 module RuleConfigLevel:
 sig
   include Json_type with type t = private string
+  val cl_none: t
   val cl_note: t
   val cl_warning: t
   val cl_error: t
-  val cl_open: t
 end
 =
 struct
   type t = string [@@deriving yojson]
+  let cl_none = "none"
   let cl_note = "note"
   let cl_warning = "warning"
   let cl_error = "error"
-  let cl_open = "open"
 end
 
-module RuleConfiguration = struct
+module ReportingConfiguration = struct
   type t = {
     enabled: (bool [@default false]);
-    defaultLevel: (RuleConfigLevel.t [@default RuleConfigLevel.cl_open]);
-    parameters: (Properties.t [@default Properties.default])
+    defaultLevel: (RuleConfigLevel.t [@default RuleConfigLevel.cl_none]);
+    rank: (int [@default -1]);
+    parameters: (Properties.t [@default Properties.default]);
+    properties: (Properties.t [@default Properties.default]);
   }[@@deriving yojson]
 
   let default = {
     enabled = false;
-    defaultLevel = RuleConfigLevel.cl_open;
+    defaultLevel = RuleConfigLevel.cl_none;
+    rank = -1;
     parameters = Properties.default;
+    properties = Properties.default;
   }
 end
 
-module Rule = struct
+module ToolComponentReference =struct
   type t = {
-    id: (string [@default ""]);
     name: (string [@default ""]);
-    shortDescription: (Message.t [@default Message.default]);
-    fullDescription: (Message.t [@default Message.default]);
-    messageStrings:
-      (Additional_properties.t [@default Additional_properties.default]);
-    richMessageStrings:
-      (Additional_properties.t [@default Additional_properties.default]);
-    configuration: (RuleConfiguration.t [@default RuleConfiguration.default]);
-    helpUri: (string [@default ""]);
+    index: (int [@default -1]);
+    guid: (string [@default ""]);
     properties: (Properties.t [@default Properties.default]);
   }[@@deriving yojson]
 
-  let default = {
-    id = "";
-    name = "";
-    shortDescription = Message.default;
-    fullDescription = Message.default;
-    messageStrings = Additional_properties.default;
-    richMessageStrings = Additional_properties.default;
-    configuration = RuleConfiguration.default;
-    helpUri = "";
-    properties = Properties.default;
-  }
+  let create
+      ?(name="") ?(index = -1) ?(guid = "") ?(properties=Properties.default) () =
+    { name; index; guid; properties }
+
+  let default = create ()
+
+end
+
+module ReportingDescriptorReference =
+struct
+  type t = {
+    id: (string [@default ""]);
+    index: (int [@default -1]);
+    guid: (string [@default ""]);
+    toolComponent:
+      (ToolComponentReference.t [@default ToolComponentReference.default]);
+    properties: (Properties.t [@default Properties.default]);
+  }[@@deriving yojson]
 
   let create
-      ~id
-      ?(name="")
-      ?(shortDescription=Message.default)
-      ?(fullDescription=Message.default)
-      ?(messageStrings=Additional_properties.default)
-      ?(richMessageStrings=Additional_properties.default)
-      ?(configuration=RuleConfiguration.default)
-      ?(helpUri="")
-      ?(properties=Properties.default)
-      ()
-    =
-    { id; name; shortDescription; fullDescription; messageStrings;
-      richMessageStrings; configuration; helpUri; properties }
+      ?(id="") ?(index = -1) ?(guid="")
+      ?(toolComponent=ToolComponentReference.default)
+      ?(properties=Properties.default) () =
+    { id; index; guid; toolComponent; properties }
 
+  let default = create ()
 end
 
-module Rule_dictionary = Json_dictionary(Rule)
+module ReportingDescriptorRelationship = struct
+  type t = {
+    target: ReportingDescriptorReference.t;
+    kinds: (string list [@default ["relevant"]]);
+    description: (Message.t [@default Message.default]);
+    properties: (Properties.t [@default Properties.default]);
+  }[@@deriving yojson]
 
-module Resources = struct
+  let create
+      ~target
+      ?(kinds=["relevant"])
+      ?(description=Message.default)
+      ?(properties=Properties.default) () =
+    { target; kinds; description; properties }
+
+  let default = create ~target:ReportingDescriptorReference.default ()
+end
+
+module ReportingDescriptor = struct
   type t = {
+    id: string;
+    deprecatedIds: (string list [@default []]);
+    guid: (string [@default ""]);
+    deprecatedGuids: (string list [@default []]);
+    name: (string [@default ""]);
+    deprecatedNames: (string list [@default []]);
+    shortDescription:
+      (MultiformatMessageString.t [@default MultiformatMessageString.default]);
+    fullDescription:
+      (MultiformatMessageString.t [@default MultiformatMessageString.default]);
     messageStrings:
-      (Additional_properties.t [@default Additional_properties.default]);
-    rules: (Rule_dictionary.t [@default []]);
+      (MultiformatMessageStringDictionary.t [@default []]);
+    defaultConfiguration:
+      (ReportingConfiguration.t [@default ReportingConfiguration.default]);
+    helpUri: (string [@default ""]);
+    help:
+      (MultiformatMessageString.t [@default MultiformatMessageString.default]);
+    relationships:
+      (ReportingDescriptorRelationship.t list [@default []]);
+    properties: (Properties.t [@default Properties.default]);
   }[@@deriving yojson]
 
-  let default = {
-    messageStrings = Additional_properties.default;
-    rules = [] }
-
   let create
-      ?(messageStrings=Additional_properties.default)
-      ?(rules=[])
+      ~id
+      ?(deprecatedIds=[])
+      ?(guid="")
+      ?(deprecatedGuids=[])
+      ?(name="")
+      ?(deprecatedNames=[])
+      ?(shortDescription=MultiformatMessageString.default)
+      ?(fullDescription=MultiformatMessageString.default)
+      ?(messageStrings=[])
+      ?(defaultConfiguration=ReportingConfiguration.default)
+      ?(helpUri="")
+      ?(help=MultiformatMessageString.default)
+      ?(relationships=[])
+      ?(properties=Properties.default)
       ()
     =
-    { messageStrings; rules }
+    { id; deprecatedIds; guid; deprecatedGuids; name; deprecatedNames;
+      shortDescription; fullDescription; messageStrings;
+      defaultConfiguration; helpUri; help; relationships; properties }
+
+  let default = create ~id:"id" ()
+
 end
 
-module Result_level:
+module Result_kind:
 sig
   type t = private string
   val notApplicable: t
   val pass: t
+  val fail: t
+  val review: t
+  val open_: t
+  val informational: t
+
+  val to_yojson: t -> Yojson.Safe.t
+  val of_yojson: Yojson.Safe.t -> (t,string) result
+end
+=
+struct
+  type t = string[@@deriving yojson]
+  let notApplicable = "notApplicable"
+  let pass = "pass"
+  let fail = "fail"
+  let review = "review"
+  let open_ = "open"
+  let informational = "informational"
+end
+
+module Result_level:
+sig
+  type t = private string
+  val none: t
   val note: t
   val warning: t
   val error: t
@@ -836,8 +953,7 @@ end
 =
 struct
   type t = string[@@deriving yojson]
-  let notApplicable = "notApplicable"
-  let pass = "pass"
+  let none = "none"
   let note = "note"
   let warning = "warning"
   let error = "error"
@@ -875,9 +991,10 @@ end
 module Sarif_result = struct
   type t = {
     ruleId: (string [@default ""]);
-    level: (Result_level.t[@default Result_level.notApplicable]);
+    kind: (Result_kind.t[@default Result_kind.fail]);
+    level: (Result_level.t[@default Result_level.warning]);
     message: (Message.t [@default Message.default]);
-    analysisTarget: (FileLocation.t [@default FileLocation.default]);
+    analysisTarget: (ArtifactLocation.t [@default ArtifactLocation.default]);
     locations: (Location.t list [@default []]);
     instanceGuid: (string [@default ""]);
     correlationGuid: (string [@default ""]);
@@ -902,10 +1019,11 @@ module Sarif_result = struct
   }[@@deriving yojson]
 
   let create
-      ?(ruleId = "")
-      ?(level=Result_level.notApplicable)
+      ~ruleId
+      ?(kind=Result_kind.pass)
+      ?(level=Result_level.none)
       ?(message=Message.default)
-      ?(analysisTarget=FileLocation.default)
+      ?(analysisTarget=ArtifactLocation.default)
       ?(locations=[])
       ?(instanceGuid="")
       ?(correlationGuid="")
@@ -927,7 +1045,7 @@ module Sarif_result = struct
       ()
     =
     {
-      ruleId;level; message; analysisTarget; locations; instanceGuid;
+      ruleId; kind; level; message; analysisTarget; locations; instanceGuid;
       correlationGuid; occurrenceCount; partialFingerprints; fingerprints;
       stacks; codeFlows; graphs; graphTraversals; relatedLocations;
       suppressionStates; baselineState; attachments; workItemsUris;
@@ -946,10 +1064,6 @@ module VersionControlDetails = struct
   }[@@deriving yojson]
 end
 
-module File_dictionary = Json_dictionary(File)
-
-module LogicalLocation_dictionary = Json_dictionary(LogicalLocation)
-
 module ColumnKind: sig
   include Json_type with type t = private string
   val utf16CodeUnits: t
@@ -962,75 +1076,355 @@ struct
   let unicodeCodePoints = "unicodeCodePoints"
 end
 
+module RunAutomationDetails = struct
+  type t = {
+    description: (Message.t [@default Message.default]);
+    id: (string [@default ""]);
+    guid: (string [@default ""]);
+    correlationGuid: (string [@default ""]);
+    properties: (Properties.t [@default Properties.default]);
+  } [@@deriving yojson]
+
+  let create
+      ?(description=Message.default) ?(id="") ?(guid="") ?(correlationGuid="")
+      ?(properties=Properties.default) () =
+    { description; id; guid; correlationGuid; properties }
+
+  let default = create ()
+end
+
+module ExternalPropertyFileReferences = struct
+  type t = {
+    location: (ArtifactLocation.t [@default ArtifactLocation.default]);
+    guid: (string [@default ""]);
+    itemCount: (int [@default -1]);
+    properties: (Properties.t [@default Properties.default]);
+  } [@@deriving yojson]
+
+  let create
+      ?(location = ArtifactLocation.default)
+      ?(guid = "")
+      ?(itemCount = -1)
+      ?(properties = Properties.default)
+      () =
+    { location; guid; itemCount; properties }
+
+  let default = create ()
+end
+
+module TranslationMetadata = struct
+  type t = {
+    name: (string [@default ""]);
+    fullName: (string [@default ""]);
+    shortDescription:
+      (MultiformatMessageString.t [@default MultiformatMessageString.default]);
+    fullDescription:
+      (MultiformatMessageString.t [@default MultiformatMessageString.default]);
+    downloadUri: (string [@default ""]);
+    informationUri: (string [@default ""]);
+    properties: (Properties.t [@default Properties.default]);
+  } [@@deriving yojson]
+
+  let create
+      ~name
+      ?(fullName = "")
+      ?(shortDescription = MultiformatMessageString.default)
+      ?(fullDescription = MultiformatMessageString.default)
+      ?(downloadUri = "")
+      ?(informationUri = "")
+      ?(properties = Properties.default)
+      ()
+    =
+    { name; fullName; shortDescription; fullDescription;
+      downloadUri; informationUri; properties }
+
+  let default = create ~name:"" ()
+end
+
+module ToolComponent = struct
+  module Contents: sig
+    include Json_type with type t = private string
+    val localizedData: t
+    val nonLocalizedData: t
+  end = struct
+    type t = string [@@deriving yojson]
+    let localizedData = "localizedData"
+    let nonLocalizedData = "nonLocalizedData"
+  end
+  type t = {
+    guid: (string [@default ""]);
+    name: (string [@default ""]);
+    organization: (string [@default ""]);
+    product: (string [@default ""]);
+    productSuite: (string [@default ""]);
+    shortDescription:
+      (MultiformatMessageString.t [@default MultiformatMessageString.default]);
+    fullDescription:
+      (MultiformatMessageString.t [@default MultiformatMessageString.default]);
+    fullName: (string [@default ""]);
+    version: (string [@default ""]);
+    semanticVersion: (string [@default ""]);
+    dottedQuadFileVersion: (string [@default ""]);
+    releaseDateUtc: (string [@default ""]);
+    downloadUri: (string [@default ""]);
+    informationUri: (string [@default ""]);
+    globalMessageStrings: (MultiformatMessageStringDictionary.t [@default []]);
+    notifications: (ReportingDescriptor.t list [@default []]);
+    rules: (ReportingDescriptor.t list [@default []]);
+    taxa: (ReportingDescriptor.t list [@default []]);
+    locations: (ArtifactLocation.t list [@default []]);
+    language: (string [@default "en-US"]);
+    contents: (Contents.t list [@default []]);
+    isComprehensive: (bool [@default false]);
+    localizedDataSemanticVersion: (string [@default ""]);
+    minimumRequiredLocalizedDataSemanticVersion: (string [@default ""]);
+    associateComponent:
+      (ToolComponentReference.t [@default ToolComponentReference.default]);
+    translationMetadata:
+      (TranslationMetadata.t [@default TranslationMetadata.default]);
+    supportedTaxonomies: (ToolComponentReference.t list [@default []]);
+    properties: (Properties.t [@default Properties.default]);
+  }[@@deriving yojson]
+  let create
+      ?(guid="")
+      ~name
+      ?(organization="")
+      ?(product="")
+      ?(productSuite="")
+      ?(shortDescription=MultiformatMessageString.default)
+      ?(fullDescription=MultiformatMessageString.default)
+      ?(fullName="")
+      ?(version="")
+      ?(semanticVersion="")
+      ?(dottedQuadFileVersion="")
+      ?(releaseDateUtc="")
+      ?(downloadUri="")
+      ?(informationUri="")
+      ?(globalMessageStrings=[])
+      ?(notifications=[])
+      ?(rules=[])
+      ?(taxa=[])
+      ?(locations=[])
+      ?(language="en-US")
+      ?(contents=[Contents.nonLocalizedData])
+      ?(isComprehensive=false)
+      ?(localizedDataSemanticVersion="")
+      ?(minimumRequiredLocalizedDataSemanticVersion="")
+      ?(associateComponent=ToolComponentReference.default)
+      ?(translationMetadata=TranslationMetadata.default)
+      ?(supportedTaxonomies=[])
+      ?(properties=Properties.default)
+      ()
+    =
+    { guid; name; organization; product; productSuite; shortDescription;
+      fullDescription; fullName; version; semanticVersion;
+      dottedQuadFileVersion; releaseDateUtc; downloadUri; informationUri;
+      globalMessageStrings; notifications; rules; taxa; locations; language;
+      contents; isComprehensive; localizedDataSemanticVersion;
+      minimumRequiredLocalizedDataSemanticVersion;
+      associateComponent; translationMetadata; supportedTaxonomies; properties }
+  let default = create ~name:"" ()
+end
+
+module Address = struct
+  type t = {
+    absoluteAddress: (int [@default -1]);
+    relativeAddress: (int [@default 0]);
+    length: (int [@default 0]);
+    kind: (string [@default ""]);
+    name: (string [@default ""]);
+    fullyQualifiedName: (string [@default ""]);
+    offsetFromParent: (int [@default 0]);
+    index: (int [@default -1]);
+    parentIndex: (int [@default -1]);
+    properties: (Properties.t [@default Properties.default]);
+  } [@@deriving yojson]
+
+  let create
+      ?(absoluteAddress = -1)
+      ?(relativeAddress = 0)
+      ?(length = 0)
+      ?(kind = "")
+      ?(name = "")
+      ?(fullyQualifiedName = "")
+      ?(offsetFromParent = 0)
+      ?(index = -1)
+      ?(parentIndex = -1)
+      ?(properties = Properties.default)
+      ()
+    =
+    { absoluteAddress; relativeAddress; length; kind; name;
+      fullyQualifiedName; offsetFromParent; index; parentIndex; properties }
+
+  let default = create ()
+end
+
+module WebRequest = struct
+  type t = {
+    index: (int [@default -1]);
+    protocol: (string [@default ""]);
+    version: (string [@default ""]);
+    target: (string [@default ""]);
+    method_: (string [@default ""]) [@key "method"];
+    headers: (JsonStringDictionary.t [@default []]);
+    parameters: (JsonStringDictionary.t [@default []]);
+    body: (ArtifactContent.t [@default ArtifactContent.default]);
+    properties: (Properties.t [@default Properties.default]);
+  } [@@deriving yojson]
+
+  let create
+      ?(index = -1)
+      ?(protocol = "")
+      ?(version = "")
+      ?(target = "")
+      ?(method_ = "")
+      ?(headers = [])
+      ?(parameters = [])
+      ?(body = ArtifactContent.default)
+      ?(properties = Properties.default)
+      ()
+    =
+    { index; protocol; version; target; method_; headers; parameters;
+      body; properties }
+
+  let default = create ()
+
+end
+
+module WebResponse = struct
+  type t = {
+    index: (int [@default -1]);
+    protocol: (string [@default ""]);
+    version: (string [@default ""]);
+    statusCode: (int [@default 0]);
+    reasonPhrase: (string [@default ""]);
+    headers: (JsonStringDictionary.t [@default []]);
+    body: (ArtifactContent.t [@default ArtifactContent.default]);
+    noResponseReceived: (bool [@default false]);
+    properties: (Properties.t [@default Properties.default]);
+  } [@@deriving yojson]
+
+  let create
+      ?(index = -1)
+      ?(protocol = "")
+      ?(version = "")
+      ?(statusCode = 0)
+      ?(reasonPhrase = "")
+      ?(headers = [])
+      ?(body = ArtifactContent.default)
+      ?(noResponseReceived = false)
+      ?(properties = Properties.default)
+      ()
+    =
+    { index; protocol; version; statusCode; reasonPhrase;
+      headers; body; noResponseReceived; properties }
+
+  let default = create ()
+
+end
+
+module SpecialLocations = struct
+  type t = {
+    displayBase: (ArtifactLocation.t [@default ArtifactLocation.default]);
+    properties: (Properties.t [@default Properties.default])
+  } [@@deriving yojson]
+  let create
+      ?(displayBase = ArtifactLocation.default)
+      ?(properties = Properties.default)
+      ()
+    =
+    { displayBase; properties }
+
+  let default = create ()
+end
+
 module Run = struct
   type t = {
     tool: Tool.t;
     invocations: (Invocation.t list [@default []]);
     conversion: (Conversion.t [@default Conversion.default]);
+    language: (string [@default "en-US"]);
     versionControlProvenance: (VersionControlDetails.t list [@default []]);
     originalUriBaseIds:
-      (Additional_properties.t [@default Additional_properties.default]);
-    files: (File_dictionary.t [@default []]);
-    logicalLocations: (LogicalLocation_dictionary.t [@default []]);
-    graphs: (Graph_dictionary.t [@default []]);
+      (ArtifactLocationDictionary.t [@default []]);
+    artifacts: (Artifact.t list [@default []]);
+    logicalLocations: (LogicalLocation.t list [@default []]);
+    graphs: (Graph.t list [@default []]);
     results: (Sarif_result.t list [@default []]);
-    resources: (Resources.t [@default Resources.default]);
-    instanceGuid: (string [@default ""]);
-    correlationGuid: (string [@default ""]);
-    logicalId: (string [@default ""]);
-    description: (Message.t [@default Message.default]);
-    automationLogicalId: (string [@default ""]);
-    baselineInstanceGuid: (string [@default ""]);
-    architecture: (string [@default ""]);
-    richMessageMimeType: (string [@default "text/markdown;variant=GFM" ]);
-    redactionToken: (string [@default ""]);
-    defaultFileEncoding: (string [@default "utf-8"]);
+    automationDetails:
+      (RunAutomationDetails.t [@default RunAutomationDetails.default]);
+    runAggregates: (RunAutomationDetails.t list [@default []]);
+    baselineGuid: (string [@default ""]);
+    redactionToken: (string list [@default []]);
+    defaultEncoding: (string [@default "utf-8"]);
+    defaultSourceLanguage: (string [@default ""]);
+    newlineSequences: (string list [@default ["\r\n"; "\n"]]);
     columnKind: (ColumnKind.t [@default ColumnKind.unicodeCodePoints]);
+    externalPropertyFileReferences:
+      (ExternalPropertyFileReferences.t
+         [@default ExternalPropertyFileReferences.default]);
+    threadFlowLocations: (ThreadFlowLocation.t list [@default []]);
+    taxonomies: (ToolComponent.t list [@default []]);
+    addresses: (Address.t list [@default []]);
+    translations: (ToolComponent.t list [@default []]);
+    policies: (ToolComponent.t list [@default[]]);
+    webRequests: (WebRequest.t list [@default[]]);
+    webResponses: (WebResponse.t list [@default[]]);
+    specialLocations: (SpecialLocations.t [@default SpecialLocations.default]);
     properties: (Properties.t [@default Properties.default]);
   }
   [@@deriving yojson]
 
   let create
       ~tool
-      ~invocations
+      ?(invocations=[])
       ?(conversion=Conversion.default)
+      ?(language="en-US")
       ?(versionControlProvenance=[])
-      ?(originalUriBaseIds=Additional_properties.default)
-      ?(files=[])
+      ?(originalUriBaseIds=[])
+      ?(artifacts=[])
       ?(logicalLocations=[])
       ?(graphs=[])
       ?(results=[])
-      ?(resources=Resources.default)
-      ?(instanceGuid="")
-      ?(correlationGuid="")
-      ?(logicalId="")
-      ?(description=Message.default)
-      ?(automationLogicalId="")
-      ?(baselineInstanceGuid="")
-      ?(architecture="")
-      ?(richMessageMimeType="text/markdown;variant=GFM")
-      ?(redactionToken="")
-      ?(defaultFileEncoding="utf-8")
+      ?(automationDetails=RunAutomationDetails.default)
+      ?(runAggregates=[])
+      ?(baselineGuid="")
+      ?(redactionToken=[])
+      ?(defaultEncoding="utf-8")
+      ?(defaultSourceLanguage="C")
+      ?(newlineSequences=["\r\n"; "\n"])
       ?(columnKind=ColumnKind.unicodeCodePoints)
+      ?(externalPropertyFileReferences=ExternalPropertyFileReferences.default)
+      ?(threadFlowLocations=[])
+      ?(taxonomies=[])
+      ?(addresses=[])
+      ?(translations=[])
+      ?(policies=[])
+      ?(webRequests=[])
+      ?(webResponses=[])
+      ?(specialLocations=SpecialLocations.default)
       ?(properties=Properties.default)
       ()
     =
     {
-      tool; invocations; conversion; versionControlProvenance; originalUriBaseIds;
-      files; logicalLocations; graphs; results; resources; instanceGuid;
-      correlationGuid; logicalId; description; automationLogicalId;
-      baselineInstanceGuid; architecture; richMessageMimeType;
-      redactionToken; defaultFileEncoding; columnKind; properties
+      tool; invocations; conversion; versionControlProvenance;
+      language; originalUriBaseIds;
+      artifacts; logicalLocations; graphs; results;
+      automationDetails; runAggregates; baselineGuid; redactionToken;
+      defaultEncoding; defaultSourceLanguage; newlineSequences; columnKind;
+      externalPropertyFileReferences; threadFlowLocations; taxonomies;
+      addresses; translations; policies; webRequests; webResponses;
+      specialLocations; properties;
     }
 end
 
 module Schema = struct
   type t = {
-    schema: (Uri.t [@default Uri.sarif_github]) [@key "$schema"];
+    schema: Uri.t [@key "$schema"];
     version: Version.t;
     runs: Run.t list
   } [@@deriving yojson]
 
-  let create ?(schema=Uri.sarif_github) ?(version=Version.v2_0_0) ~runs () =
+  let create ?(schema=Uri.sarif_github) ?(version=Version.v2_1_0) ~runs () =
     { schema; version; runs }
 end
diff --git a/src/plugins/markdown-report/sarif_gen.ml b/src/plugins/markdown-report/sarif_gen.ml
index f3e3ed9226d9aefc42ce456d75c9be0db374004c..278073346ff33b4e1250082da7ab6c53033016af 100644
--- a/src/plugins/markdown-report/sarif_gen.ml
+++ b/src/plugins/markdown-report/sarif_gen.ml
@@ -29,8 +29,7 @@ let frama_c_sarif =
   let fullName = name ^ "-" ^ version in
   let downloadUri = "https://frama-c.com/download.html" in
   Tool.create
-    ~name ~version ~semanticVersion ~fullName ~downloadUri ()
-
+    (Driver.create ~name ~version ~semanticVersion ~fullName ~downloadUri ())
 
 let get_remarks () =
   let f = Mdr_params.Remarks.get () in
@@ -63,22 +62,32 @@ let gen_remark alarm =
   [ Block
       [ Text
           (plain
-             (Printf.sprintf "This alarms represents a potential %s."
+             (Printf.sprintf "This alarm represents a potential %s."
                 (Alarms.get_description alarm)
              )
           )
       ]
   ]
 
-let level_of_status =
+let kind_of_status =
   let open Property_status.Feedback in
-  let open Sarif.Result_level in
+  let open Sarif.Result_kind in
   function
   | Never_tried -> notApplicable
   | Considered_valid | Valid | Valid_under_hyp | Valid_but_dead -> pass
-  | Unknown | Unknown_but_dead -> warning
+  | Unknown | Unknown_but_dead -> open_
+  | Invalid | Invalid_under_hyp | Invalid_but_dead -> fail
+  | Inconsistent -> review
+
+let level_of_status =
+  let open Property_status.Feedback in
+  let open Sarif.Result_level in
+  function
+  | Never_tried -> none
+  | Considered_valid | Valid | Valid_under_hyp | Valid_but_dead -> none
+  | Unknown | Unknown_but_dead -> none
   | Invalid | Invalid_under_hyp | Invalid_but_dead -> error
-  | Inconsistent -> note
+  | Inconsistent -> none
 
 let make_message alarm annot remark =
   let open Markdown in
@@ -92,11 +101,15 @@ let make_message alarm annot remark =
     | [] -> summary :: gen_remark alarm
     | _ -> summary :: remark
   in
-  let richText =
+  let markdown =
     String.trim
       (Format.asprintf "@[%a@]" (Markdown.pp_elements ~page:"") markdown)
   in
-  Message.create ~text ~richText ()
+  Message.create ~text ~markdown ()
+
+let opt_physical_location_of_loc loc =
+  if loc = Cil_datatype.Location.unknown then []
+  else [ Location.of_loc loc ]
 
 let gen_results remarks =
   let treat_alarm _e kf s ~rank:_ alarm annot (i, rules, content) =
@@ -106,12 +119,13 @@ let gen_results remarks =
       Datatype.String.Map.add ruleId (Alarms.get_description alarm) rules
     in
     let label = "Alarm-" ^ string_of_int i in
+    let kind = kind_of_status (Property_status.Feedback.get prop) in
     let level = level_of_status (Property_status.Feedback.get prop) in
     let remark = get_remark remarks label in
     let message = make_message alarm annot remark in
-    let locations = [ Location.of_loc (Cil_datatype.Stmt.loc s) ] in
+    let locations = opt_physical_location_of_loc (Cil_datatype.Stmt.loc s) in
     let res =
-      Sarif_result.create ~level ~ruleId ~message ~locations ()
+      Sarif_result.create ~kind ~level ~ruleId ~message ~locations ()
     in
     (i+1, rules, res :: content)
   in
@@ -128,12 +142,14 @@ let make_ip_message ip =
   let text = Format.asprintf "@[%a.@]" Property.short_pretty ip in
   Message.plain_text ~text ()
 
+let user_annot_id = "user-spec"
+
 let gen_status ip =
   let status = Property_status.Feedback.get ip in
   let level = level_of_status status in
-  let locations = [ Location.of_loc (Property.location ip) ] in
+  let locations = opt_physical_location_of_loc (Property.location ip) in
   let message = make_ip_message ip in
-  Sarif_result.create ~level ~locations ~message ()
+  Sarif_result.create ~ruleId:user_annot_id ~level ~locations ~message ()
 
 let gen_statuses () =
   let f ip content =
@@ -141,29 +157,27 @@ let gen_statuses () =
   in
   List.rev (Property_status.fold f [])
 
-let gen_files () =
+let gen_artifacts () =
   let add_src_file f =
-    let key =
-      let fname = Filepath.Normalized.to_pretty_string f in
-      Filename.chop_extension (Filename.basename fname)
-    in
-    let fileLocation = FileLocation.create ~uri:(f :> string) () in
+    let uri = (f:Filepath.Normalized.t :> string) in
+    let location = ArtifactLocation.create ~uri () in
     let roles = [ Role.analysisTarget ] in
     let mimeType = "text/x-csrc" in
-    key, File.create ~fileLocation ~roles ~mimeType ()
+    Artifact.create ~location ~roles ~mimeType ()
   in
   List.map add_src_file (Kernel.Files.get ())
 
 let add_rule id desc l =
   let text = desc ^ "." in
-  let shortDescription = Message.plain_text ~text () in
-  let rule = Rule.create ~id ~shortDescription () in
-  (id, rule) :: l
+  let shortDescription = MultiformatMessageString.create ~text () in
+  let rule = ReportingDescriptor.create ~id ~shortDescription () in
+  rule :: l
 
-let make_rule_dictionary rules = Datatype.String.Map.fold add_rule rules []
+let make_taxonomies rules = Datatype.String.Map.fold add_rule rules []
 
 let gen_run remarks =
   let tool = frama_c_sarif in
+  let name = "frama-c" in
   let invocations = [gen_invocation ()] in
   let rules, results = gen_results remarks in
   let user_annot_results = gen_statuses () in
@@ -172,13 +186,13 @@ let gen_run remarks =
     | [] -> rules
     | _ ->
       Datatype.String.Map.add
-        "user-spec" "User written ACSL specification" rules
+        user_annot_id "User-written ACSL specification" rules
   in
-  let rules = make_rule_dictionary rules in
-  let resources = Resources.create ~rules () in
+  let rules = make_taxonomies rules in
+  let taxonomies = [ToolComponent.create ~name ~rules ()] in
   let results = results @ user_annot_results in
-  let files = gen_files () in
-  Run.create ~tool ~invocations ~results ~resources ~files ()
+  let artifacts = gen_artifacts () in
+  Run.create ~tool ~invocations ~results ~taxonomies ~artifacts ()
 
 let generate () =
   let remarks = get_remarks () in
diff --git a/src/plugins/metrics/metrics_base.ml b/src/plugins/metrics/metrics_base.ml
index c4c0934db605687aeb685d16abaebc37a0b4e5d6..baf2ca5fd2b43f6e3bb9a1f82b6e8621948e722e 100644
--- a/src/plugins/metrics/metrics_base.ml
+++ b/src/plugins/metrics/metrics_base.ml
@@ -256,11 +256,11 @@ let get_file_type filename =
       | "html" | "htm" -> Html
       | "txt" | "text" -> Text
       | s ->
-        Metrics_parameters.fatal
+        Metrics_parameters.abort
           "Unknown file extension %s. Cannot produce output.@." s
   with
     | No_suffix ->
-       Metrics_parameters.fatal
+       Metrics_parameters.abort
          "File %s has no suffix. Cannot produce output.@." filename
 
 module VarinfoByName = struct
diff --git a/src/plugins/nonterm/nonterm_run.ml b/src/plugins/nonterm/nonterm_run.ml
index 007d64d2489222988c70aab46b2e4f6e9ac3b35d..a4f74bc205af61d14b74d1eb2858549055584bd5 100644
--- a/src/plugins/nonterm/nonterm_run.ml
+++ b/src/plugins/nonterm/nonterm_run.ml
@@ -239,7 +239,7 @@ let check_unreachable_statements kf ~to_ignore ~dead_code ~warned_kfs =
    are ignored if:
    1. the function is in the list of functions to be ignored;
    2. or the function has a body AND its specification is not being used
-      via -val-use-spec.
+      via -eva-use-spec.
    In case 2, the call is ignored because non-terminating statements inside
    it will already be reported. *)
 let ignore_kf name =
diff --git a/src/plugins/nonterm/tests/nonterm/builtin_termination.c b/src/plugins/nonterm/tests/nonterm/builtin_termination.c
index 514e4202b09dcbed1e566fe0dd3d9ad6259937fe..dff850dc8ae96f040640768d57556b09b73aeedb 100644
--- a/src/plugins/nonterm/tests/nonterm/builtin_termination.c
+++ b/src/plugins/nonterm/tests/nonterm/builtin_termination.c
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: #"-val-builtin strlen:Frama_C_strlen"
+   STDOPT: #"-eva-builtin strlen:Frama_C_strlen"
  */
 
 #include <string.h>
diff --git a/src/plugins/nonterm/tests/nonterm/n6.c b/src/plugins/nonterm/tests/nonterm/n6.c
index 1e4af5d6d67b75e8bb8b4124e1bda8e552a45444..e75e048ec1fc1ff024374bca11425471f09bc9f3 100644
--- a/src/plugins/nonterm/tests/nonterm/n6.c
+++ b/src/plugins/nonterm/tests/nonterm/n6.c
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: #"-val-builtin memcpy:Frama_C_memcpy"
+   STDOPT: #"-eva-builtin memcpy:Frama_C_memcpy"
  */
 
 #include <string.h>
diff --git a/src/plugins/nonterm/tests/test_config b/src/plugins/nonterm/tests/test_config
index 1d678ae3e1a635f06f7c8fbf7e30a0da5d6f7ffe..91f0e5ec1ff948b34ba561fc9d7369be7fd38b87 100644
--- a/src/plugins/nonterm/tests/test_config
+++ b/src/plugins/nonterm/tests/test_config
@@ -1 +1 @@
-OPT: -no-autoload-plugins -load-module from,inout,nonterm,scope -val -val-show-progress -eva-msg-key=-summary -then -nonterm -nonterm-verbose 2
+OPT: -no-autoload-plugins -load-module from,inout,nonterm,scope -eva -eva-show-progress -eva-msg-key=-summary -then -nonterm -nonterm-verbose 2
diff --git a/src/plugins/obfuscator/obfuscate.ml b/src/plugins/obfuscator/obfuscate.ml
index 5cf8be87e632f5db30d2b4cce7477fb4e65dfde6..adbe1215a838a78ebd76bbfc1f087e3aa716e9be 100644
--- a/src/plugins/obfuscator/obfuscate.ml
+++ b/src/plugins/obfuscator/obfuscate.ml
@@ -150,11 +150,14 @@ class visitor = object
       Cil.SkipChildren
     else begin
       Identified_predicate.Hashtbl.add id_pred_visited p ();
-      let names = p.ip_content.pred_name in
+      let { tp_only_check = only_check; tp_statement = pred } = p.ip_content in
+      let names = pred.pred_name in
       let names' =
         List.map (Dictionary.fresh Obfuscator_kind.Predicate) names
       in
-      let p' = { p with ip_content = { p.ip_content with pred_name = names'}} in
+      let pred' = { pred with pred_name = names' } in
+      let ip_content = Logic_const.toplevel_predicate ~only_check pred' in
+      let p' = { p with ip_content } in
       Cil.ChangeDoChildrenPost (p', Extlib.id)
     end
 
diff --git a/src/plugins/qed/logic.ml b/src/plugins/qed/logic.ml
index 5e55e6c4308390dc3cf71e38f469724b8b628f83..5c5979042ea3885bb6b28004405381c6af693060 100644
--- a/src/plugins/qed/logic.ml
+++ b/src/plugins/qed/logic.ml
@@ -448,7 +448,7 @@ sig
 
   (** {3 Support for Builtins} *)
 
-  val set_builtin : Fun.t -> (term list -> term) -> unit
+  val set_builtin : ?force: bool -> Fun.t -> (term list -> term) -> unit
   (** Register a simplifier for function [f]. The computation code
         may raise [Not_found], in which case the symbol is not interpreted.
 
@@ -458,33 +458,58 @@ sig
 
         Highest priority is [0].
         Recursive calls must be performed on strictly smaller terms.
+
+        The [force] parameters defaults to [false], when it is [true], if there
+        exist another builtin, it is replaced with the new one. Use with care.
+
+        @modify Frama-C+dev add optional [force] parameter
   *)
 
-  val set_builtin' : Fun.t -> (term list -> tau option -> term) -> unit
+  val set_builtin' :
+    ?force: bool -> Fun.t -> (term list -> tau option -> term) -> unit
 
-  val set_builtin_map : Fun.t -> (term list -> term list) -> unit
+  val set_builtin_map :
+    ?force: bool ->  Fun.t -> (term list -> term list) -> unit
   (** Register a builtin for rewriting [f a1..an] into [f b1..bm].
 
       This is short cut for [set_builtin], where the head application of [f] avoids
       to run into an infinite loop.
+
+      The [force] parameters defaults to [false], when it is [true], if there
+      exist another builtin, it is replaced with the new one. Use with care.
+
+      @modify Frama-C+dev add optional [force] parameter
   *)
 
-  val set_builtin_get : Fun.t -> (term list -> tau option -> term -> term) -> unit
+  val set_builtin_get :
+    ?force: bool -> Fun.t -> (term list -> tau option -> term -> term) -> unit
   (** [set_builtin_get f rewrite] register a builtin
       for rewriting [(f a1..an)[k]] into [rewrite (a1..an) k].
       The type given is the type of (f a1..an).
+
+      The [force] parameters defaults to [false], when it is [true], if there
+      exist another builtin, it is replaced with the new one. Use with care.
+
+      @modify Frama-C+dev add optional [force] parameter
   *)
 
-  val set_builtin_eq : Fun.t -> (term -> term -> term) -> unit
+  val set_builtin_eq :
+    ?force: bool -> Fun.t -> (term -> term -> term) -> unit
   (** Register a builtin equality for comparing any term with head-symbol.
         {b Must} only use recursive comparison for strictly smaller terms.
         The recognized term with head function symbol is passed first.
 
         Highest priority is [0].
         Recursive calls must be performed on strictly smaller terms.
+
+        The [force] parameters defaults to [false], when it is [true], if there
+        exist another builtin, it is replaced with the new one. Use with care.
+
+        @modify Frama-C+dev add optional [force] parameter
   *)
 
-  val set_builtin_leq : Fun.t -> (term -> term -> term) -> unit
+  val set_builtin_leq :
+    ?force: bool -> Fun.t -> (term -> term -> term) -> unit
   (** Register a builtin for comparing any term with head-symbol.
         {b Must} only use recursive comparison for strictly smaller terms.
         The recognized term with head function symbol can be on both sides.
@@ -492,6 +517,11 @@ sig
 
         Highest priority is [0].
         Recursive calls must be performed on strictly smaller terms.
+
+        The [force] parameters defaults to [false], when it is [true], if there
+        exist another builtin, it is replaced with the new one. Use with care.
+
+        @modify Frama-C+dev add optional [force] parameter
   *)
 
   (** {3 Specific Patterns} *)
diff --git a/src/plugins/qed/term.ml b/src/plugins/qed/term.ml
index c533be908fb938cb2cc419a53579da64bb6b1d13..bc8331ad3c9efd8c9fa18a649cf7e98f0ff840a8 100644
--- a/src/plugins/qed/term.ml
+++ b/src/plugins/qed/term.ml
@@ -1009,40 +1009,41 @@ struct
   let c_builtin_lt  a b = distribute_if_over_operation true (fun a b -> operation (CMP(LT ,a,b))) a b !extern_lt  a b
   let c_builtin_leq a b = distribute_if_over_operation true (fun a b -> operation (CMP(LEQ,a,b))) a b !extern_leq a b
 
-  let prepare_builtin f m =
+  let prepare_builtin ~force f m =
     release () ;
-    if BUILTIN.mem f m then
+    if BUILTIN.mem f m && not force then
       let msg = Printf.sprintf
           "Builtin already registered for '%s'" (Fun.debug f) in
       raise (Failure msg)
 
-  let set_builtin' f p =
+  let set_builtin' ?(force=false) f p =
     begin
-      prepare_builtin f !state.builtins_fun ;
+      prepare_builtin ~force f !state.builtins_fun ;
       !state.builtins_fun <- BUILTIN.add f p !state.builtins_fun ;
     end
 
-  let set_builtin f p = set_builtin' f (fun es _ -> p es)
+  let set_builtin ?force f p = set_builtin' ?force f (fun es _ -> p es)
 
-  let set_builtin_get f p =
+  let set_builtin_get ?(force=false) f p =
     begin
-      prepare_builtin f !state.builtins_get ;
+      prepare_builtin ~force f !state.builtins_get ;
       !state.builtins_get <- BUILTIN.add f p !state.builtins_get ;
     end
 
-  let set_builtin_eq f p =
+  let set_builtin_eq ?(force=false) f p =
     begin
-      prepare_builtin f !state.builtins_eq ;
+      prepare_builtin ~force f !state.builtins_eq ;
       !state.builtins_eq <- BUILTIN.add f p !state.builtins_eq ;
     end
 
-  let set_builtin_leq f p =
+  let set_builtin_leq ?(force=false) f p =
     begin
-      prepare_builtin f !state.builtins_leq ;
+      prepare_builtin ~force f !state.builtins_leq ;
       !state.builtins_leq <- BUILTIN.add f p !state.builtins_leq ;
     end
 
-  let set_builtin_map f phi = set_builtin' f (fun es tau -> c_fun f (phi es) tau)
+  let set_builtin_map ?force f phi =
+    set_builtin' ?force f (fun es tau -> c_fun f (phi es) tau)
 
   (* -------------------------------------------------------------------------- *)
   (* --- Negation                                                           --- *)
diff --git a/src/plugins/report/tests/report/csv.c b/src/plugins/report/tests/report/csv.c
index 3bd7c80288ace2904e9724cdcea46b67ba38123c..536cfb432f2702af8035011868cad8ee785095d9 100644
--- a/src/plugins/report/tests/report/csv.c
+++ b/src/plugins/report/tests/report/csv.c
@@ -1,6 +1,6 @@
 /* run.config
    LOG: csv.csv
-   OPT: -no-autoload-plugins -load-module from,inout,report,scope,eva -eva-warn-copy-indeterminate=-main4 -eva -eva-show-progress -remove-redundant-alarms -eva-warn-key=alarm=inactive -then -report-csv @PTEST_RESULT@/csv.csv -report-no-proven -then -report-csv= -eva-warn-key=alarm -slevel 1
+   OPT: -no-autoload-plugins -load-module from,inout,report,scope,eva -eva-warn-copy-indeterminate=-main4 -eva -eva-show-progress -eva-remove-redundant-alarms -eva-warn-key=alarm=inactive -then -report-csv @PTEST_RESULT@/csv.csv -report-no-proven -then -report-csv= -eva-warn-key=alarm -eva-slevel 1
    COMMENT: first, do an analysis without any message, but check that the .csv is complete. Then, redo the analysis with value warnings. slevel 1 is just there to force Value to restart
 */
 volatile v;
diff --git a/src/plugins/report/tests/report/no_hyp.ml b/src/plugins/report/tests/report/no_hyp.ml
index cb651465511efe31508fe10453ec0bc0f76d1b87..a145963f447e8e630717bf5a0a162627a51bf43f 100644
--- a/src/plugins/report/tests/report/no_hyp.ml
+++ b/src/plugins/report/tests/report/no_hyp.ml
@@ -1,4 +1,4 @@
-let emitter = 
+let emitter =
   Emitter.create "Test" [ Emitter.Property_status ] ~correctness:[] ~tuning:[]
 
 let set_status s =
@@ -11,7 +11,7 @@ let set_status s =
 let print_status =
   Dynamic.get
     ~plugin:"Report"
-    "print" 
+    "print"
     (Datatype.func Datatype.unit Datatype.unit)
 
 let clear () =
@@ -20,26 +20,36 @@ let clear () =
     ()
 
 let main () =
-  Ast.compute ();
-  Kernel.feedback "SETTING STATUS TO dont_know";
-  set_status Property_status.Dont_know;
-  print_status ();
-  Kernel.feedback "SETTING STATUS TO true";
-  set_status Property_status.True;
-  print_status ();
+  begin
+    Ast.compute ();
+    Kernel.feedback "SETTING STATUS TO dont_know";
+    set_status Property_status.Dont_know;
+    print_status ();
+    Kernel.feedback "SETTING STATUS TO true";
+    set_status Property_status.True;
+    print_status ();
+    Kernel.feedback "SETTING STATUS TO false_if_reachable";
+    set_status Property_status.False_if_reachable;
+    print_status ();
+    Kernel.feedback "SETTING STATUS TO dont_know";
+    set_status Property_status.Dont_know;
+    print_status ();
+    Kernel.feedback "SETTING STATUS TO true";
+    set_status Property_status.True;
+    print_status ();
+    Kernel.feedback "SETTING STATUS TO false_if_reachable";
+    set_status Property_status.False_if_reachable;
+    print_status ();
+  (*
   Kernel.feedback "SETTING STATUS TO false_if_reachable";
   (try set_status Property_status.False_if_reachable
    with Property_status.Inconsistent_emitted_status(s1, s2) ->
-     Kernel.result "inconsistency between %a and %a" 
+     Kernel.result "inconsistency between %a and %a"
        Property_status.Emitted_status.pretty s1
        Property_status.Emitted_status.pretty s2);
   Kernel.feedback "CLEARING";
   clear ();
-  Kernel.feedback "SETTING STATUS TO false_if_reachable";
-  set_status Property_status.False_if_reachable;
-  print_status ();
-  Kernel.feedback "SETTING STATUS TO false_and_reachable";
-  set_status Property_status.False_and_reachable;
-  print_status ()
+  *)
+  end
 
 let () = Db.Main.extend main
diff --git a/src/plugins/report/tests/report/oracle/single.1.res.oracle b/src/plugins/report/tests/report/oracle/single.1.res.oracle
index a47026150e026717af27c229e66c8b3ff8bd1ae6..088835a7a6788b5f36665493ce3d57f1b512377b 100644
--- a/src/plugins/report/tests/report/oracle/single.1.res.oracle
+++ b/src/plugins/report/tests/report/oracle/single.1.res.oracle
@@ -32,9 +32,6 @@
      1 Total
 --------------------------------------------------------------------------------
 [kernel] SETTING STATUS TO false_if_reachable
-[kernel] inconsistency between **NOT** VALID and VALID
-[kernel] CLEARING
-[kernel] SETTING STATUS TO false_if_reachable
 [report] Computing properties status...
 
 --------------------------------------------------------------------------------
@@ -51,19 +48,54 @@
      1 Alarm emitted
      1 Total
 --------------------------------------------------------------------------------
-[kernel] SETTING STATUS TO false_and_reachable
+[kernel] SETTING STATUS TO dont_know
 [report] Computing properties status...
 
 --------------------------------------------------------------------------------
 --- Properties of Function 'main'
 --------------------------------------------------------------------------------
 
-[   Bug   ] Assertion (file tests/report/single.i, line 9)
-            by Test.
+[  Alarm  ] Assertion (file tests/report/single.i, line 9)
+            By Test, with pending:
+             - Unreachable program point (file tests/report/single.i, line 9)
 
 --------------------------------------------------------------------------------
 --- Status Report Summary
 --------------------------------------------------------------------------------
-     1 Bugs found
+     1 Alarm emitted
+     1 Total
+--------------------------------------------------------------------------------
+[kernel] SETTING STATUS TO true
+[report] Computing properties status...
+
+--------------------------------------------------------------------------------
+--- Properties of Function 'main'
+--------------------------------------------------------------------------------
+
+[  Alarm  ] Assertion (file tests/report/single.i, line 9)
+            By Test, with pending:
+             - Unreachable program point (file tests/report/single.i, line 9)
+
+--------------------------------------------------------------------------------
+--- Status Report Summary
+--------------------------------------------------------------------------------
+     1 Alarm emitted
+     1 Total
+--------------------------------------------------------------------------------
+[kernel] SETTING STATUS TO false_if_reachable
+[report] Computing properties status...
+
+--------------------------------------------------------------------------------
+--- Properties of Function 'main'
+--------------------------------------------------------------------------------
+
+[  Alarm  ] Assertion (file tests/report/single.i, line 9)
+            By Test, with pending:
+             - Unreachable program point (file tests/report/single.i, line 9)
+
+--------------------------------------------------------------------------------
+--- Status Report Summary
+--------------------------------------------------------------------------------
+     1 Alarm emitted
      1 Total
 --------------------------------------------------------------------------------
diff --git a/src/plugins/scope/datascope.ml b/src/plugins/scope/datascope.ml
index 6c190670c612e36b26f3bf757832171056c6de0d..1fb31afa260c5dd460f811a9024fede3e1ee27cb 100644
--- a/src/plugins/scope/datascope.ml
+++ b/src/plugins/scope/datascope.ml
@@ -488,15 +488,17 @@ let add_proven_annot (ca, stmt_ca) (ca_because, stmt_because) acc =
 let check_stmt_annots (ca, stmt_ca) stmt acc =
   let check _ annot acc =
     match ca.annot_content, annot.annot_content with
-    | AAssert (_, Assert, p'), AAssert (_, _, p) ->
-        if Logic_utils.is_same_predicate_node p.pred_content p'.pred_content then
-          let acc, added = add_proven_annot (annot, stmt) (ca, stmt_ca) acc in
-          if added then
-            R.debug "annot at stmt %d could be removed: %a"
-              stmt.sid Printer.pp_code_annotation annot;
-          acc
-        else
-          acc
+    | AAssert (_, p'), AAssert (_, p) when not p'.tp_only_check ->
+      let p = p.tp_statement.pred_content in
+      let p' = p'.tp_statement.pred_content in
+      if Logic_utils.is_same_predicate_node p p' then
+        let acc, added = add_proven_annot (annot, stmt) (ca, stmt_ca) acc in
+        if added then
+          R.debug "annot at stmt %d could be removed: %a"
+            stmt.sid Printer.pp_code_annotation annot;
+        acc
+      else
+        acc
     | _ -> acc
   in
   Annotations.fold_code_annot check stmt acc
diff --git a/src/plugins/server/kernel_properties.ml b/src/plugins/server/kernel_properties.ml
index ef20336fc6af9a5cce418d9e9c50a068dd85c7fa..9ca090505b8adc0c4cfe86d339f3c8f3abdc63ec 100644
--- a/src/plugins/server/kernel_properties.ml
+++ b/src/plugins/server/kernel_properties.ml
@@ -114,8 +114,8 @@ struct
     | IPDisjoint _ -> t_disjoint
     | IPCodeAnnot { ica_ca={ annot_content } } ->
       begin match annot_content with
-        | AAssert (_, Assert, _) -> t_assert
-        | AAssert (_, Check, _) -> t_check
+        | AAssert (_, {tp_only_check = false}) -> t_assert
+        | AAssert (_, {tp_only_check = true }) -> t_check
         | AStmtSpec _ -> t_code_contract
         | AInvariant(_,false,_) -> t_code_invariant
         | AInvariant(_,true,_) -> t_loop_invariant
diff --git a/src/plugins/slicing/slicingCmds.ml b/src/plugins/slicing/slicingCmds.ml
index a549613bcff45232e21da27a3c709cae9b1b14da..f4f31d5622ae6f8614aff90945b21ee9aa54ed87 100644
--- a/src/plugins/slicing/slicingCmds.ml
+++ b/src/plugins/slicing/slicingCmds.ml
@@ -529,6 +529,7 @@ let select_stmt_annots set mark ~spare  ~threat ~user_assert ~slicing_pragma ~lo
 (** Registered as a slicing selection function:
     Add a selection of the annotations related to a function. *)
 let select_func_annots set mark ~spare ~threat ~user_assert ~slicing_pragma ~loop_inv ~loop_var kf =
+  try
   let zones_decl_vars,pragmas =
     !Db.Properties.Interp.To_zone.from_func_annots Kinstr.iter_from_func
          (Some
@@ -538,6 +539,13 @@ let select_func_annots set mark ~spare ~threat ~user_assert ~slicing_pragma ~loo
       kf
   in let set = select_ZoneAnnot_pragmas set ~spare pragmas kf
   in select_ZoneAnnot_zones_decl_vars set mark (get_or_raise zones_decl_vars) kf
+  with Kernel_function.No_Definition ->
+    SlicingParameters.warning ~wkey:SlicingParameters.wkey_cmdline
+      "No definition for function '%a'. \
+       Slicing requests from the command line are ignored."
+      Kernel_function.pretty kf;
+    Cil_datatype.Varinfo.Map.empty
+
 
 (** Registered as a slicing selection function:
     Add selection of function outputs.
diff --git a/src/plugins/studia/tests/test_config b/src/plugins/studia/tests/test_config
index 0875cfb7318e90da7861ddc6596bba50d8040b3d..dc79c97068c8125cbff6a916b7fed6d7b881d5f2 100644
--- a/src/plugins/studia/tests/test_config
+++ b/src/plugins/studia/tests/test_config
@@ -1 +1 @@
-OPT: -val -journal-disable -out -input -deps
+OPT: -eva -journal-disable -out -input -deps
diff --git a/src/plugins/value/utils/state_import.mli b/src/plugins/value/Eva.ml
similarity index 58%
rename from src/plugins/value/utils/state_import.mli
rename to src/plugins/value/Eva.ml
index b1c140858e281e095bf70f5e95b955d2ea462db9..ad7918068b7045dd87b083946c0b5f43cfb7f3e2 100644
--- a/src/plugins/value/utils/state_import.mli
+++ b/src/plugins/value/Eva.ml
@@ -20,24 +20,30 @@
 (*                                                                        *)
 (**************************************************************************)
 
-(** Saving/loading of Value states, possibly among different ASTs.
-    Used by the command-line options defined by
-    [Value_parameters.SaveFunctionState] and
-    [Value_parameters.LoadFunctionState].
-    @since Aluminium-20160501 *)
-
-(** Loads the saved initial global state, and merges it with the given state
-    (locals plus new globals which were not present in the original AST).
-    The saved state may come from a different project.
-    Note that, to ensure soundness of the merge, some constraints must be
-    respected according to where the merge takes place.
-    The intended use is to replace costly function calls, in which case
-    the state of local variables should not be modified by the function. *)
-val load_and_merge_function_state: Cvalue.Model.t -> Cvalue.Model.t
-
-(** Saves the final state of globals variables after the return statement of
-    the function defined via [Value_parameters.SaveFunctionState]. The result
-    is saved in the file defined by the same option.
-    The function must have been called exactly once during the value analysis,
-    otherwise the saved state is unspecified. *)
-val save_globals_state: unit -> unit
+module Value_results = Value_results
+module Value_parameters = Value_parameters
+module Eval_terms = Eval_terms
+module Unit_tests = Unit_tests
+module Eva_annotations = Eva_annotations
+module Private = struct
+  module Abstractions = Eva__Abstractions
+  module Analysis = Eva__Analysis
+  module Alarmset = Eva__Alarmset
+  module Main_values = Eva__Main_values
+  module Value_parameters =Eva__Value_parameters
+  module Eval = Eva__Eval
+  module Eval_terms = Eva__Eval_terms
+  module Red_statuses = Eva__Red_statuses
+  module Abstract_value = Eva__Abstract_value
+  module Abstract_domain = Eva__Abstract_domain
+  module Mark_noresults = Eva__Mark_noresults
+  module Simple_memory = Eva__Simple_memory
+  module Structure = Eva__Structure
+  module Eval_typ = Eva__Eval_typ
+  module Eval_op = Eva__Eval_op
+  module Value_util = Eva__Value_util
+  module Value_results = Eva__Value_results
+  module Domain_builder = Eva__Domain_builder
+  module Main_locations = Eva__Main_locations
+  module Eval_annots = Eva__Eval_annots
+end
diff --git a/src/plugins/value/Eva.mli b/src/plugins/value/Eva.mli
new file mode 100644
index 0000000000000000000000000000000000000000..096db791027aa2b7fcf56f3ed2e0ea041b122c3b
--- /dev/null
+++ b/src/plugins/value/Eva.mli
@@ -0,0 +1,124 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of Frama-C.                                         *)
+(*                                                                        *)
+(*  Copyright (C) 2007-2020                                               *)
+(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
+(*         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).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(** Analysis for values and pointers *)
+
+module Value_results: sig
+  type results
+
+  val get_results: unit -> results
+  val set_results: results -> unit
+  val merge: results -> results -> results
+  val change_callstacks:
+    (Value_types.callstack -> Value_types.callstack) -> results -> results
+end
+
+module Value_parameters: sig
+  (** Returns the list (name, descr) of currently enabled abstract domains. *)
+  val enabled_domains: unit -> (string * string) list
+
+  (** [use_builtin kf name] instructs the analysis to use the builtin [name]
+      to interpret calls to function [kf].
+      Raises [Not_found] if there is no builtin of name [name]. *)
+  val use_builtin: Cil_types.kernel_function -> string -> unit
+end
+
+module Eval_terms: sig
+  (** Evaluation environment, built by [env_annot]. *)
+  type eval_env
+
+  (** Dependencies needed to evaluate a term or a predicate. *)
+  type logic_deps = Locations.Zone.t Cil_datatype.Logic_label.Map.t
+
+  type labels_states = Db.Value.state Cil_datatype.Logic_label.Map.t
+
+  val env_annot :
+    ?c_labels:labels_states -> pre:Db.Value.state -> here:Db.Value.state ->
+    unit -> eval_env
+
+  (** [predicate_deps env p] computes the logic dependencies needed to evaluate
+      [p] in the given evaluation environment [env].
+      @return None on either an evaluation error or on unsupported construct. *)
+  val predicate_deps: eval_env -> Cil_types.predicate -> logic_deps option
+end
+
+
+module Unit_tests: sig
+  (** Runs the unit tests of Eva. *)
+  val run: unit -> unit
+end
+
+(** Register special annotations to locally guide the partitioning of states
+    performed by an Eva analysis. *)
+module Eva_annotations: sig
+
+  (** Annotations tweaking the behavior of the -eva-slevel paramter. *)
+  type slevel_annotation =
+    | SlevelMerge        (** Join all states separated by slevel. *)
+    | SlevelDefault      (** Use the limit defined by -eva-slevel. *)
+    | SlevelLocal of int (** Use the given limit instead of -eva-slevel. *)
+    | SlevelFull         (** Remove the limit of number of separated states. *)
+
+  (** Loop unroll annotations. *)
+  type unroll_annotation =
+    | UnrollAmount of Cil_types.term (** Unroll the n first iterations. *)
+    | UnrollFull (** Unroll amount defined by -eva-default-loop-unroll. *)
+
+  (** Split/merge annotations for value partitioning.  *)
+  type flow_annotation =
+    | FlowSplit of Cil_types.term (** Split states according to a term. *)
+    | FlowMerge of Cil_types.term (** Merge states separated by a previous split. *)
+
+  val add_slevel_annot : emitter:Emitter.t -> loc:Cil_types.location ->
+    Cil_types.stmt -> slevel_annotation -> unit
+  val add_unroll_annot : emitter:Emitter.t -> loc:Cil_types.location ->
+    Cil_types.stmt -> unroll_annotation -> unit
+  val add_flow_annot : emitter:Emitter.t -> loc:Cil_types.location ->
+    Cil_types.stmt -> flow_annotation -> unit
+  val add_subdivision_annot : emitter:Emitter.t -> loc:Cil_types.location ->
+    Cil_types.stmt -> int -> unit
+end
+
+(** For internal use *)
+
+module Private: sig
+  module Abstractions = Eva__Abstractions
+  module Analysis = Eva__Analysis
+  module Alarmset = Eva__Alarmset
+  module Main_values = Eva__Main_values
+  module Value_parameters =Eva__Value_parameters
+  module Eval = Eva__Eval
+  module Eval_terms = Eva__Eval_terms
+  module Red_statuses = Eva__Red_statuses
+  module Abstract_value = Eva__Abstract_value
+  module Abstract_domain = Eva__Abstract_domain
+  module Mark_noresults = Eva__Mark_noresults
+  module Simple_memory = Eva__Simple_memory
+  module Structure = Eva__Structure
+  module Eval_typ = Eva__Eval_typ
+  module Eval_op = Eva__Eval_op
+  module Value_util = Eva__Value_util
+  module Value_results = Eva__Value_results
+  module Domain_builder = Eva__Domain_builder
+  module Main_locations = Eva__Main_locations
+  module Eval_annots = Eva__Eval_annots
+end
diff --git a/src/plugins/value/alarmset.ml b/src/plugins/value/alarmset.ml
index b0bd8fb82ac6e22c451e767cf9b015e9dbb8e2b6..4a88c3eee32a50a552c5ebe5c42ef36845f68844 100644
--- a/src/plugins/value/alarmset.ml
+++ b/src/plugins/value/alarmset.ml
@@ -216,9 +216,10 @@ let local_printer: Printer.extensible_printer =
     method! code_annotation fmt ca =
       temporaries <- Cil_datatype.Varinfo.Set.empty;
       match ca.annot_content with
-      | AAssert (_, _, p) ->
+      | AAssert (_, p) ->
         (* ignore the ACSL name *)
-        Format.fprintf fmt "@[<v>@[assert@ %a;@]" self#predicate_node p.pred_content;
+        let p = p.tp_statement.pred_content in
+        Format.fprintf fmt "@[<v>@[assert@ %a;@]" self#predicate_node p;
         (* print temporary variables information *)
         if not (Cil_datatype.Varinfo.Set.is_empty temporaries) then begin
           Format.fprintf fmt "@ @[(%t)@]" self#pp_temporaries
diff --git a/src/plugins/value/domains/cvalue/builtins.ml b/src/plugins/value/domains/cvalue/builtins.ml
index f992d2c0885c3703f754a4e23eb3ca7a1b3bb23d..e8478f7c7f85c0dd5a0c5952b8ce024ff93d5480 100644
--- a/src/plugins/value/domains/cvalue/builtins.ml
+++ b/src/plugins/value/domains/cvalue/builtins.ml
@@ -27,7 +27,7 @@ exception Invalid_nb_of_args of int
 
 (* 'Always' means the builtin will always be used to replace a function
    with its name. 'OnAuto' means that the function will be replaced only
-   if -val-builtins-auto is set. *)
+   if -eva-builtins-auto is set. *)
 type use_builtin = Always | OnAuto
 
 (* Table of all registered builtins; filled by [register_builtin] calls.  *)
@@ -83,7 +83,7 @@ let () =
          Log.print_on_output
            (fun fmt ->
               Format.fprintf fmt "@[*** LIST OF EVA BUILTINS@\n@\n\
-                                  ** Replacements set by -val-builtins-auto:\
+                                  ** Replacements set -eva-builtins-auto:\
                                   @\n   unless otherwise specified, \
                                   function <f> is replaced by builtin \
                                   Frama_C_<f>:@\n@\n   @[%a@]@]@\n"
@@ -97,7 +97,7 @@ let () =
          Log.print_on_output
            (fun fmt ->
               Format.fprintf fmt "@\n@[** Full list of builtins \
-                                  (configurable via -val-builtin):@\n\
+                                  (configurable via -eva-builtin):@\n\
                                   @\n   @[%a@]@]@\n"
                 (Pretty_utils.pp_list ~sep:",@ "
                    Format.pp_print_string) stand_alone);
diff --git a/src/plugins/value/domains/cvalue/builtins_malloc.ml b/src/plugins/value/domains/cvalue/builtins_malloc.ml
index 3387cb48196b592ded4465313f97293ec2586884..576d50e93ce9e1f11f25433ecae4e35b2ffce24e 100644
--- a/src/plugins/value/domains/cvalue/builtins_malloc.ml
+++ b/src/plugins/value/domains/cvalue/builtins_malloc.ml
@@ -297,7 +297,7 @@ let add_zeroes = add_v (V_Or_Uninitialized.initialized Cvalue.V.singleton_zero)
    [orig_state]: state before any allocation, returned in case of failure;
    [state_after_alloc]: state in case the allocation is successful;
    [returns_null]: if given, forces the result to consider/ignore the
-   possibility of failure, despite -val-alloc-returns-null. *)
+   possibility of failure, despite -eva-alloc-returns-null. *)
 let wrap_fallible_alloc ?returns_null ret orig_state state_after_alloc =
   let default_returns_null = Value_parameters.AllocReturnsNull.get () in
   let returns_null = Extlib.opt_conv default_returns_null returns_null in
diff --git a/src/plugins/value/domains/cvalue/builtins_print_c.ml b/src/plugins/value/domains/cvalue/builtins_print_c.ml
index bba8b1b0900724fe2ebc9f53dbfcc4720078a7b7..1ac0850f13ad7937f856416fc5ea43ade0a44e74 100644
--- a/src/plugins/value/domains/cvalue/builtins_print_c.ml
+++ b/src/plugins/value/domains/cvalue/builtins_print_c.ml
@@ -140,7 +140,7 @@ let pretty_pointer_assignment fmt typname lv v =
     Kernel.abort ~current:true
       "pretty_pointer_assignment expected cardinal zero or one@ \
        for value %a (lv %s);@ \
-       (did you forget -val-no-alloc-returns-null?)" Cvalue.V.pretty v lv
+       (did you forget -eva-no-alloc-returns-null?)" Cvalue.V.pretty v lv
 
 let types = Hashtbl.create 7;;
 
diff --git a/src/plugins/value/domains/cvalue/builtins_string.ml b/src/plugins/value/domains/cvalue/builtins_string.ml
index 9a474137e2f8c36eb5616461674397fa3d080d5f..b4ac08862493c3272bd84e284c68b5995b20ba74 100644
--- a/src/plugins/value/domains/cvalue/builtins_string.ml
+++ b/src/plugins/value/domains/cvalue/builtins_string.ml
@@ -59,6 +59,9 @@ let pos_min_int ival =
   | None -> Integer.zero
   | Some i -> Integer.(max zero i)
 
+let make_interval ~min ~max =
+  Ival.inject_interval ~min:(Some min) ~max:(Some max)
+
 (* Backward reduction of an ival against an integer.*)
 let backward_comp_left comp ival integer =
   Ival.backward_comp_int_left comp ival (Ival.inject_singleton integer)
@@ -145,95 +148,80 @@ let read_char kind offset cvalue acc =
   let new_acc = read_one_char kind ~offset ~from:acc.from cvalue in
   { new_acc with read = join acc.read new_acc.read }
 
-(* Reads the [offsetmap] character by character, starting from [index], with a
-   period of [kind.size], until reaching [max]. Precise but inefficient. *)
-let rec search_each_index kind ~validity ~index ~max offsetmap acc =
-  let offsets = Ival.inject_singleton index in
+(* Searches the range [min..max] of the [offsetmap], that contains a repeated
+   value of size [v_size]. *)
+let search_offsetmap_range kind offsetmap validity ~min ~max ~v_size acc =
   let size = kind.size in
-  let cvalue = Cvalue.V_Offsetmap.find ~validity ~offsets ~size offsetmap in
-  let acc = read_char kind offsets cvalue acc in
-  let index = Integer.add index size in
-  if acc.stop || Integer.gt index max
-  then acc
-  else search_each_index kind ~validity ~index ~max offsetmap acc
-
-(* Reads at once the characters of size [kind.size] in the range [min..max] in
-   the [offsetmap], that contains the repeated value [v] of size [v_size].
-   Assumes that [min] and [max] match the start and the end of the values. *)
-let search_range kind ~min ~max (v, v_size, _v_shift) acc =
-  let make_interval ~min ~max =
-    Ival.inject_interval ~min:(Some min) ~max:(Some max)
-  in
-  (* Case where only one read is needed. *)
-  if Cvalue.V_Or_Uninitialized.is_isotropic v || Integer.equal kind.size v_size
-  then
-    let offset = make_interval ~min ~max ~rem:Integer.zero ~modu:kind.size in
-    read_char kind offset v acc
-  else
-    (* The value [v] contains [nb_chars] characters: need [nb_chars] reads. *)
-    let nb_chars = Integer.e_div v_size kind.size in
-    (* Reads the [count]-nth character in [v]. *)
-    let rec do_one_char count ~max res =
-      let start = Integer.mul kind.size count in
-      let min = Integer.add min start in
-      if Integer.ge count nb_chars || Integer.gt min max
+  (* Reads will repeat themselves every [modu] bits. *)
+  let modu = Integer.ppcm v_size size in
+  let max_reads = Integer.(to_int (e_div modu size)) in
+  (* Performs [max_reads] consecutive reads from offsets {[min] + k[modu]},
+     bound by [max]. *)
+  let search_until ~max acc =
+    let rec read_index count ~min res =
+      let rem = Integer.e_rem min modu in
+      let offsets = make_interval ~min ~max ~rem ~modu in
+      let cvalue = Cvalue.V_Offsetmap.find ~validity ~offsets ~size offsetmap in
+      (* Be careful to not use this result [t] for the reads of the next
+         characters, as the reduction of [acc.from] assumes that the reads at
+         [offset] are consecutive, which is not the case here. Thus, we always
+         read with the initial [acc], and accumulate the result in [res]. *)
+      let t = read_char kind offsets cvalue acc in
+      let read = join res.read t.read in
+      (* At the end, all the reads are indeed consecutive, and we can
+         use the narrow of the [from] for the next ranges of the offsetmap. *)
+      let from = Ival.narrow res.from t.from in
+      let res = { read; from; stop = res.stop || t.stop; } in
+      let min = Integer.add min kind.size in
+      if (Ival.is_singleton_int offsets && res.stop)
+      || Integer.gt min max || count >= max_reads
       then res
-      else
-        let stop = Integer.(add start (pred kind.size)) in
-        let _, cvalue =
-          Cvalue.V_Or_Uninitialized.extract_bits
-            ~topify:Origin.K_Misalign_read ~start ~stop ~size:v_size v
-        in
-        let rem = Integer.mul count kind.size in
-        let offset = make_interval ~min ~max ~rem ~modu:v_size in
-        (* Be careful to not use this result [t] for the reads of the next
-           characters, as the reduction of [acc.from] assumes that the reads at
-           [offset] are consecutive, which is not the case here. Thus, we always
-           read with the initial [acc], and accumulate the result in [res]. *)
-        let t = read_char kind offset cvalue acc in
-        let read = join res.read t.read in
-        (* At the end, the [nb_chars] reads are indeed consecutive, and we can
-           use the narrow of the [from] for the next ranges of the offsetmap. *)
-        let from = Ival.narrow res.from t.from in
-        let res = { read; from; stop = res.stop || t.stop; } in
-        do_one_char (Integer.succ count) ~max res
-    in
-    (* The maximal offset we are sure to read. *)
-    let sure_offset = Integer.max (the_max_int acc.from) min in
-    let sure_max = Integer.add sure_offset v_size in
-    (* If one of the read characters stops the search, the other characters will
-       lead to imprecise results — as they are all periodic until [max]. Thus we
-       perform a first read until the maximal sure read offset. *)
-    let acc =
-      if Integer.lt sure_max max
-      then do_one_char Integer.zero ~max:sure_max acc
-      else acc
+      else read_index (count + 1) ~min res
     in
-    if acc.stop then acc else do_one_char Integer.zero ~max acc
+    read_index 1 ~min acc
+  in
+  (* The maximal offset we are sure to read from. *)
+  let sure_offset = Integer.max min (the_max_int acc.from) in
+  let sure_max = Integer.pred (Integer.add sure_offset modu) in
+  (* If one of the read characters stops the search, the other characters will
+     lead to imprecise results — as they are all periodic until [max]. Thus we
+     perform a first read of the range until the maximal sure read offset. *)
+  let acc =
+    if Integer.lt sure_max max
+    then search_until ~max:sure_max acc
+    else acc
+  in
+  if acc.stop then acc else search_until ~max acc
 
 (* Folds the [offsetmap] from [start] to [max]. *)
-let fold_offsm kind ~validity ~start ~max offsetmap acc =
+let fold_offsm kind ~validity ~start ~max ~rem offsetmap acc =
   let modu = kind.size in
   let process_range (start, max) (v, v_size, v_shift) acc =
     if acc.stop then acc else
-      let index = Integer.round_up_to_r ~min:start ~r:Integer.zero ~modu in
-      let v_start = Abstract_interp.Rel.add_abs start v_shift in
-      (* Process the whole range at once when:
-         - the ending cut is aligned with the reads, meaning that no read
-           overlaps between two ranges of the offsetmap.
-         - and either the value is isotropic, or the reads are aligned with the
-           repeated values. *)
-      if Integer.is_zero (Integer.e_rem (Integer.succ max) modu) &&
-         (Cvalue.V_Or_Uninitialized.is_isotropic v ||
-          Integer.(equal index v_start && is_zero (e_rem v_size kind.size)))
-      then search_range kind ~min:index ~max (v, v_size, v_shift) acc
-      else search_each_index kind ~validity ~index ~max offsetmap acc
+      let min = Integer.round_up_to_r ~min:start ~r:rem ~modu in
+      if Integer.gt min max then acc else
+        let v_start = Abstract_interp.Rel.add_abs start v_shift in
+        (* Only one read of the value is needed when:
+           - the ending cut is aligned with the reads, meaning that no read
+             overlaps between two ranges of the offsetmap.
+           - and either the value is isotropic, or the repeated value has the
+             same size than the reads. *)
+        if Integer.equal rem (Integer.e_rem (Integer.succ max) modu) &&
+           (Cvalue.V_Or_Uninitialized.is_isotropic v ||
+            Integer.equal min v_start && Integer.equal v_size kind.size)
+        then
+          let offset = make_interval ~min ~max ~rem ~modu in
+          read_char kind offset v acc
+        else
+          (* Otherwise, search the range by reading the offsetmap for each
+             required offset. Less efficient, but equally precise. *)
+          search_offsetmap_range kind offsetmap validity ~min ~max ~v_size acc
   in
   Cvalue.V_Offsetmap.fold_between
     ~entire:false (start, max) process_range offsetmap acc
 
 (* Performs the search in the [offsetmap]. *)
-let search_offsm kind ~validity ~offset offsetmap =
+let search_offsm kind ~validity ~offset ~rem offsetmap =
   let start = pos_min_int offset in
   (* Compute the maximal bit that can be read in the offsetmap. *)
   let base_max = match Base.valid_range validity with
@@ -251,7 +239,7 @@ let search_offsm kind ~validity ~offset offsetmap =
   in
   (* Starts the search with an empty accumulator. *)
   let acc = { read = empty; from = offset; stop = false } in
-  let acc = fold_offsm kind ~validity ~start ~max offsetmap acc in
+  let acc = fold_offsm kind ~validity ~start ~max ~rem offsetmap acc in
   (* Alarm if the search does not stop before the end of the offsetmap. *)
   if not acc.stop && Integer.gt (Integer.add max kind.size) base_max
   then { acc.read with alarm = true }
@@ -273,9 +261,14 @@ let search_base kind ~offset base state =
   | `Top -> assert false
   | `Value offsetmap ->
     let validity = Base.validity base in
-    let search_one_char offset char =
+    let search_one_rem ~offset ~char ~rem acc =
       let kind = { kind with search = char } in
-      search_offsm kind ~validity ~offset offsetmap
+      let res = search_offsm kind ~validity ~offset ~rem offsetmap in
+      join acc res
+    in
+    let search_one_char offset char =
+      let rems = Ival.scale_rem ~pos:true kind.size offset in
+      Ival.fold_int (fun rem -> search_one_rem ~offset ~char ~rem) rems empty
     in
     let search_one_offset offset =
       search_by_folding kind.search (search_one_char offset)
@@ -346,7 +339,12 @@ let reduce_by_validity ~size cvalue =
   let loc_bits = Locations.loc_bytes_to_loc_bits cvalue in
   let loc = Locations.make_loc loc_bits (Int_Base.inject size) in
   if Locations.(is_valid Read loc)
-  then loc.Locations.loc, true
+  then
+    let is_aligned _base ival =
+      Ival.is_zero (Ival.scale_rem ~pos:true size ival)
+    in
+    let valid = Locations.Location_Bits.for_all is_aligned loc_bits in
+    loc.Locations.loc, valid
   else
     let valid_loc = Locations.(valid_part Read ~bitfield:true loc) in
     valid_loc.Locations.loc, false
diff --git a/src/plugins/value/domains/traces_domain.ml b/src/plugins/value/domains/traces_domain.ml
index 32548a62121bc92a17f752c05235b6fdfe1e6960..1ac089b9834bef79962cfe1bf1613ab331c64c08 100644
--- a/src/plugins/value/domains/traces_domain.ml
+++ b/src/plugins/value/domains/traces_domain.ml
@@ -1082,7 +1082,8 @@ let rec stmts_of_cfg cfg current var_map locals return_exp acc =
         let exp = subst_in_exp var_map exp in
         let predicate = Logic_utils.expr_to_predicate exp in
         let predicate = if b then predicate else Logic_const.pnot predicate in
-        let code_node = Cil_types.AAssert([],Assert,predicate) in
+        let predicate = Logic_const.toplevel_predicate predicate in
+        let code_node = Cil_types.AAssert([],predicate) in
         let code_annot = Logic_const.new_code_annotation code_node in
         let stmt_kind = Cil_types.Code_annot(code_annot,exp.eloc) in
         let stmt = Cil.mkStmtOneInstr ~valid_sid stmt_kind in
diff --git a/src/plugins/value/dune b/src/plugins/value/dune
index 8372f21124756f2c2172d9d5434fbb3d6fdc9c85..a5540380798d00b8361861bbe3a6ba716eef15a8 100644
--- a/src/plugins/value/dune
+++ b/src/plugins/value/dune
@@ -18,7 +18,7 @@
   (name eva)
   (optional)
   (public_name frama-c-eva.core)
-  (modules unit_tests
+  (modules eva unit_tests
    split_strategy value_parameters
         value_perf value_util
         mark_noresults
@@ -35,7 +35,6 @@
         builtins_memory
         builtins_print_c
         builtins_watchpoint
-        state_import
         function_args split_return
         per_stmt_slevel
         eval structure
@@ -80,7 +79,7 @@
 ( library
   (name numerors)
   (public_name frama-c-eva.numerors)
-  (flags -open Frama_c_kernel -open Eva)
+  (flags -open Frama_c_kernel -open Eva.Private)
   (modules numerors_domain numerors_utils numerors_float numerors_interval numerors_arithmetics numerors_value)
   (libraries frama-c.kernel frama-c-eva.core gmp)
   (optional)
@@ -91,7 +90,7 @@
 ( library
   (name apron_domain)
   (public_name frama-c-eva.apron)
-  (flags -open Frama_c_kernel -open Eva)
+  (flags -open Frama_c_kernel -open Eva.Private)
   (modules apron_domain)
   (libraries frama-c.kernel frama-c-eva.core apron.octMPQ apron.boxMPQ apron.polkaMPQ apron.apron)
   (optional)
@@ -105,7 +104,7 @@
   (optional)
   (modules gui_callstacks_filters gui_callstacks_manager gui_eval gui_types register_gui gui_red)
 ;  (public_interfaces ())
-  (flags -open Frama_c_kernel -open Frama_c_gui -open Eva)
+  (flags -open Frama_c_kernel -open Frama_c_gui -open Eva.Private)
   (libraries eva frama-c.kernel frama-c.gui)
 )
 
diff --git a/src/plugins/value/engine/compute_functions.ml b/src/plugins/value/engine/compute_functions.ml
index 6fbf9dbd503689a5cbbdf2bec599130f24442f68..2e3d42bdb5d29f4e24c625d3902c56a1e2b14d56 100644
--- a/src/plugins/value/engine/compute_functions.ml
+++ b/src/plugins/value/engine/compute_functions.ml
@@ -55,7 +55,7 @@ let options_ok () =
   Value_parameters.UsePrototype.iter (fun kf -> check_assigns kf)
 
 (* Do something tasteless in case the user did not put a spec on functions
-   for which he set [-val-use-spec]:  generate an incorrect one ourselves *)
+   for which he set [-eva-use-spec]:  generate an incorrect one ourselves *)
 let generate_specs () =
   let aux kf =
     if need_assigns kf then begin
@@ -91,12 +91,9 @@ let post_analysis_cleanup ~aborted =
   if Value_parameters.JoinResults.get () then
     Db.Value.Table_By_Callstack.iter
       (fun s _ -> ignore (Db.Value.get_stmt_state s));
-  if not aborted then begin
+  if not aborted then
     (* Keep memexec results for users that want to resume the analysis *)
-    Mem_exec.cleanup_results ();
-    if not (Value_parameters.SaveFunctionState.is_empty ()) then
-      State_import.save_globals_state ();
-  end
+    Mem_exec.cleanup_results ()
 
 let post_analysis () =
   (* Garbled mix must be dumped here -- at least before the call to
@@ -159,7 +156,7 @@ module Make (Abstract: Abstractions.Eva) = struct
 
   (* Compute a call to [kf] in the state [state]. The evaluation will
      be done either using the body of [kf] or its specification, depending
-     on whether the body exists and on option [-val-use-spec]. [call_kinstr]
+     on whether the body exists and on option [-eva-use-spec]. [call_kinstr]
      is the instruction at which the call takes place, and is used to update
      the statuses of the preconditions of [kf]. If [show_progress] is true,
      the callstack and additional information are printed. *)
diff --git a/src/plugins/value/engine/transfer_logic.ml b/src/plugins/value/engine/transfer_logic.ml
index 294b81b7245753a7e05e23047eb3aa8c25ecbd54..a6efdf17d21b8abfa3ff22fabffb1155fd11ecfe 100644
--- a/src/plugins/value/engine/transfer_logic.ml
+++ b/src/plugins/value/engine/transfer_logic.ml
@@ -137,7 +137,7 @@ let emit_message_and_status kind kf behavior ~active ~empty property named_pred
 let create_conjunction l=
   let loc = match l with
     | [] -> None
-    | p :: _ -> Some p.ip_content.pred_loc
+    | p :: _ -> Some (Logic_const.pred_of_id_pred p).pred_loc
   in
   Logic_const.(List.fold_right (fun p1 p2 -> pand ?loc (p1, p2)) (List.map pred_of_id_pred l) ptrue)
 
@@ -384,11 +384,11 @@ module Make
     else (* Not enough slevel to split, and reduction not required *)
       States.singleton state
 
-  let eval_split_and_reduce limit active pred build_env state =
+  let eval_split_and_reduce limit ~reduce pred build_env state =
     let env = build_env state in
     let status = Domain.evaluate_predicate env state pred in
     let  reduced_states =
-      if active then
+      if reduce then
         match status with
         | Alarmset.False   -> States.empty
         | Alarmset.True    ->
@@ -453,6 +453,7 @@ module Make
     let emit = emit_message_and_status kind kf behavior ~active in
     let aux_pred states pred =
       let pr = Logic_const.pred_of_id_pred pred in
+      let reduce = active && not pred.ip_content.tp_only_check in
       let ip = build_prop pred in
       if ignore_predicate pr then
         states
@@ -465,7 +466,7 @@ module Make
           States.fold
             (fun state (acc_status, acc_states) ->
                let status, reduced_states =
-                 eval_split_and_reduce limit active pr build_env state
+                 eval_split_and_reduce limit ~reduce pr build_env state
                in
                (status :: acc_status,
                 fst (States.merge ~into:acc_states reduced_states)))
@@ -580,8 +581,8 @@ module Make
 
   let code_annotation_text ca =
     match ca.annot_content with
-    | AAssert (_, Assert, _) ->  "assertion"
-    | AAssert (_, Check, _) -> "check"
+    | AAssert (_,{tp_only_check = false}) ->  "assertion"
+    | AAssert (_,{tp_only_check = true}) -> "check"
     | AInvariant _ ->  "loop invariant"
     | APragma _  | AVariant _ | AAssigns _ | AAllocation _ | AStmtSpec _
     | AExtended _ ->
@@ -687,9 +688,9 @@ module Make
         aux_interp ~reduce code_annot behav p
     in
     match code_annot.annot_content with
-    | AAssert (behav, Check, p) -> aux ~reduce:false code_annot behav p
-    | AAssert (behav, Assert, p)
-    | AInvariant (behav, true, p) -> aux ~reduce:true code_annot behav p
+    | AAssert (behav, p)
+    | AInvariant (behav, true, p) ->
+      aux ~reduce:(not p.tp_only_check) code_annot behav p.tp_statement
     | APragma _
     | AInvariant (_, false, _)
     | AVariant _ | AAssigns _ | AAllocation _ | AExtended _
diff --git a/src/plugins/value/engine/transfer_stmt.ml b/src/plugins/value/engine/transfer_stmt.ml
index 6fb1f72709bfc725960f7f3546fc242e3668b048..d7bb71ccae05b325d7b83953d4f3af716a8b3f6b 100644
--- a/src/plugins/value/engine/transfer_stmt.ml
+++ b/src/plugins/value/engine/transfer_stmt.ml
@@ -239,7 +239,7 @@ module Make (Abstract: Abstractions.Eva) = struct
     | `Value (valuation, lloc, ltyp) ->
       (* Tries to interpret the assignment as a copy for the returned value
          of a function call, on struct and union types, and when
-         -val-warn-copy-indeterminate is disabled. *)
+         -eva-warn-copy-indeterminate is disabled. *)
       let lval_copy =
         if is_ret || Cil.isStructOrUnionType ltyp || do_copy_at kinstr
         then find_lval expr
diff --git a/src/plugins/value/gui_files/gui_red.ml b/src/plugins/value/gui_files/gui_red.ml
index 1e6c0ffb11d8e7f62fa1bb8831407e67b413feed..f0b81cb0d842fcce673f5c358f2cd698143f6d34 100644
--- a/src/plugins/value/gui_files/gui_red.ml
+++ b/src/plugins/value/gui_files/gui_red.ml
@@ -69,7 +69,8 @@ type red_alarm = {
 
 let get_predicate ca =
   match ca.annot_content with
-  | AAssert (_, _, p) -> { p with pred_name = [] }
+  | AAssert (_, p) ->
+    { p with tp_statement = { p.tp_statement with pred_name = [] }}
   | _ -> assert false
 
 let make_red_alarm function_name ki alarm callstacks =
@@ -84,7 +85,9 @@ let make_red_alarm function_name ki alarm callstacks =
   let ip = Property.ip_of_code_annot_single kf stmt ca in
   let kind = String.capitalize_ascii (Alarms.get_name alarm) in
   let p = get_predicate ca in
-  let acsl = Format.asprintf "@[<hov>%a@]" Cil_datatype.Predicate.pretty p in
+  let acsl =
+    Format.asprintf "@[<hov>%a@]" Cil_datatype.Toplevel_predicate.pretty p
+  in
   let alarm_or_prop = Red_statuses.Alarm alarm in
   { function_name; ip; kind; alarm_or_prop; acsl; callstacks }
 
diff --git a/src/plugins/value/gui_files/register_gui.ml b/src/plugins/value/gui_files/register_gui.ml
index dc46ee11e7e5528f14f49c0d9ca4d2cc4861ff30..19d46c75109c13781b61f0069a2258aa9b916ec6 100644
--- a/src/plugins/value/gui_files/register_gui.ml
+++ b/src/plugins/value/gui_files/register_gui.ml
@@ -461,13 +461,17 @@ module Select (Eval: Eval) = struct
       | PVDecl (Some kf, Kstmt stmt, vi) ->
         let lv = (Var vi, NoOffset) in
         select_lv main_ui (GL_Stmt (kf, stmt)) lv
-      | PIP (IPCodeAnnot {ica_kf = kf; ica_stmt = stmt;
-                          ica_ca = {annot_content =
-                                      AAssert (_, _, p)
-                                    | AInvariant (_, true, p)} as ca
-                         } as ip) ->
+      | PIP (
+          IPCodeAnnot {
+            ica_kf = kf; ica_stmt = stmt;
+            ica_ca = {
+              annot_content =
+                AAssert (_, p) | AInvariant (_, true, p)
+            } as ca
+          } as ip) ->
         begin
           let loc = GL_Stmt (kf, stmt) in
+          let p = p.tp_statement in
           let alarm_or_property =
             match Alarms.find ca with
             | None -> Red_statuses.Prop ip
diff --git a/src/plugins/value/legacy/eval_annots.ml b/src/plugins/value/legacy/eval_annots.ml
index e043c43a0b809b5727ee35e0d7868ac84dc8a94d..978309b89bba0f5296392d41e793d4783e1be46f 100644
--- a/src/plugins/value/legacy/eval_annots.ml
+++ b/src/plugins/value/legacy/eval_annots.ml
@@ -29,8 +29,8 @@ let has_requires spec =
 
 let code_annotation_text ca =
   match ca.annot_content with
-  | AAssert (_, Assert, _) ->  "assertion"
-  | AAssert (_, Check, _) -> "check"
+  | AAssert (_, {tp_only_check=false}) ->  "assertion"
+  | AAssert (_, {tp_only_check=true}) -> "check"
   | AInvariant _ ->  "loop invariant"
   | APragma _  | AVariant _ | AAssigns _ | AAllocation _ | AStmtSpec _
   | AExtended _  ->
@@ -203,7 +203,8 @@ let mark_green_and_red () =
        currently skipped during evaluation. *)
     if contains_c_at ca || (Alarms.find ca <> None) then
       match ca.annot_content with
-      | AAssert (_, _, p) | AInvariant (_, true, p) ->
+      | AAssert (_, p) | AInvariant (_, true, p) ->
+        let p = p.tp_statement in
         let loc = code_annotation_loc ca stmt in
         Cil.CurrentLoc.set loc;
         let kf = Kernel_function.find_englobing_kf stmt in
@@ -246,7 +247,8 @@ let mark_invalid_initializers () =
     | None -> ()
     | Some _ ->
       match ca.annot_content with
-      | AAssert (_, _, p) ->
+      | AAssert (_, p) ->
+        let p = p.tp_statement in
         let ip = Property.ip_of_code_annot_single kf first_stmt ca in
         (* Evaluate in a fully empty state. Only predicates that do not
            depend on the memory will result in 'False' *)
diff --git a/src/plugins/value/partitioning/auto_loop_unroll.ml b/src/plugins/value/partitioning/auto_loop_unroll.ml
index ac50025173cccc8707fe4d6e5385fd79365d821c..b2c114233e6414c9ea5823d06d9abe7f2cd0a7f2 100644
--- a/src/plugins/value/partitioning/auto_loop_unroll.ml
+++ b/src/plugins/value/partitioning/auto_loop_unroll.ml
@@ -415,7 +415,8 @@ module Make (Abstract: Abstractions.Eva) = struct
     try
       let zero_delta = { current = `Value Val.zero; final = `Bottom; } in
       let delta = delta_block zero_delta loop in
-      final_delta delta >> fun d -> Some d
+      final_delta delta >> fun d ->
+      if is_true (Val.assume_non_zero d) then Some d else None
     with NoIncrement -> None
 
   (* If in the block [loop], [lval] is assigned once to the value of another
diff --git a/src/plugins/value/partitioning/partitioning_parameters.ml b/src/plugins/value/partitioning/partitioning_parameters.ml
index f2f107b7d71bcab897a117084bf09c75464a1e2f..22658b485c9c1ccf9cb4a8a4aeece5a4ecfeb2df 100644
--- a/src/plugins/value/partitioning/partitioning_parameters.ml
+++ b/src/plugins/value/partitioning/partitioning_parameters.ml
@@ -83,8 +83,8 @@ struct
     in
     match get_unroll_annot stmt with
     | [] -> warn_no_loop_unroll stmt; default
-    | [None] -> Partition.IntLimit default_loop_unroll
-    | [(Some t)] -> begin
+    | [UnrollFull] -> Partition.IntLimit default_loop_unroll
+    | [UnrollAmount t] -> begin
         (* Inlines the value of const variables in [t]. *)
         let global_init vi =
           try (Globals.Vars.find vi).init with Not_found -> None
diff --git a/src/plugins/value/partitioning/per_stmt_slevel.ml b/src/plugins/value/partitioning/per_stmt_slevel.ml
index a049166ade12cae16ad8544c61b0be248e0e9992..cf9f8d15a7497032db2e87127515d4fe91d1ec36 100644
--- a/src/plugins/value/partitioning/per_stmt_slevel.ml
+++ b/src/plugins/value/partitioning/per_stmt_slevel.ml
@@ -87,9 +87,14 @@ let compute kf =
         Cil_datatype.Stmt.Hashtbl.add h_local s (Stack.top local_slevel);
         if d <> None then Cil_datatype.Stmt.Hashtbl.add h_merge s ();
       | Some (SlevelLocal i) ->
-        if debug then Format.printf "Vising split %d, pushing %d@." s.sid i;
+        if debug then Format.printf "Visiting split %d, pushing %d@." s.sid i;
         Cil_datatype.Stmt.Hashtbl.add h_local s i;
         Stack.push i local_slevel;
+      | Some SlevelFull ->
+        let cap = max_int in
+        if debug then Format.printf "Visiting split %d, pushing %d@." s.sid cap;
+        Cil_datatype.Stmt.Hashtbl.add h_local s cap;
+        Stack.push cap local_slevel;
       | Some SlevelDefault ->
         let top = Stack.pop local_slevel in
         if debug then
@@ -102,7 +107,7 @@ let compute kf =
     and post s =
       match get_slevel_annot s with
       | None | Some SlevelMerge -> ()
-      | Some (SlevelLocal _) ->
+      | Some (SlevelLocal _ | SlevelFull) ->
         if debug then Format.printf "Leaving split %d, poping@." s.sid;
         ignore (Stack.pop local_slevel);
       | Some SlevelDefault ->
diff --git a/src/plugins/value/register.ml b/src/plugins/value/register.ml
index 1a396420b8edc343b6cbcffbebca0fb02c996ada..00dc42fad17577e1bf50f5a2c2114c41342b46a7 100644
--- a/src/plugins/value/register.ml
+++ b/src/plugins/value/register.ml
@@ -138,8 +138,7 @@ let use_spec_instead_of_definition kf =
   not (Kernel_function.is_definition kf) ||
   Ast_info.is_frama_c_builtin (Kernel_function.get_name kf) ||
   Builtins.is_builtin_overridden kf ||
-  Kernel_function.Set.mem kf (Value_parameters.UsePrototype.get ()) ||
-  Value_parameters.LoadFunctionState.mem kf
+  Kernel_function.Set.mem kf (Value_parameters.UsePrototype.get ())
 
 let eval_predicate ~pre ~here p =
   let open Eval_terms in
diff --git a/src/plugins/value/utils/eva_annotations.ml b/src/plugins/value/utils/eva_annotations.ml
index 59d825232185d389fc4365e3bec52135f73c2780..600a28b386b1a43bc6db77eda4d9c015471fa0bd 100644
--- a/src/plugins/value/utils/eva_annotations.ml
+++ b/src/plugins/value/utils/eva_annotations.ml
@@ -27,8 +27,11 @@ type slevel_annotation =
   | SlevelMerge
   | SlevelDefault
   | SlevelLocal of int
+  | SlevelFull
 
-type unroll_annotation = term option
+type unroll_annotation =
+  | UnrollAmount of Cil_types.term
+  | UnrollFull
 
 type flow_annotation =
   | FlowSplit of term
@@ -112,6 +115,7 @@ module Slevel = Register (struct
     let parse ~typing_context:_ = function
       | [{lexpr_node = PLvar "default"}] -> SlevelDefault
       | [{lexpr_node = PLvar "merge"}] -> SlevelMerge
+      | [{lexpr_node = PLvar "full"}] -> SlevelFull
       | [{lexpr_node = PLconstant (IntConstant i)}] ->
         let i =
           try int_of_string i
@@ -125,12 +129,14 @@ module Slevel = Register (struct
       | SlevelDefault -> Ext_terms [Logic_const.tstring "default"]
       | SlevelMerge -> Ext_terms [Logic_const.tstring "merge"]
       | SlevelLocal i -> Ext_terms [Logic_const.tinteger i]
+      | SlevelFull -> Ext_terms [Logic_const.tstring "full"]
 
     let import = function
       | Ext_terms [{term_node}] ->
         begin match term_node with
           | TConst (LStr "default") -> SlevelDefault
           | TConst (LStr "merge") -> SlevelMerge
+          | TConst (LStr "full") -> SlevelFull
           | TConst (Integer (i, _)) -> SlevelLocal (Integer.to_int i)
           | _ -> SlevelDefault (* be kind. Someone is bound to write a visitor
                                   that will simplify our term into something
@@ -142,6 +148,7 @@ module Slevel = Register (struct
       | SlevelDefault -> Format.pp_print_string fmt "default"
       | SlevelMerge -> Format.pp_print_string fmt "merge"
       | SlevelLocal i -> Format.pp_print_int fmt i
+      | SlevelFull -> Format.pp_print_string fmt "full"
   end)
 
 module SimpleTermAnnotation =
@@ -164,31 +171,32 @@ struct
   let print = Printer.pp_term
 end
 
-module OptionalTermAnnotation =
-struct
-  type t = term option
+module Unroll = Register (struct
+    type t = unroll_annotation
 
-  let parse ~typing_context = function
-    | [] -> None
-    | [t] ->
-      let open Logic_typing in
-      Some (typing_context.type_term typing_context typing_context.pre_state t)
-    | _ -> raise Parse_error
+    let name = "unroll"
+    let is_loop_annot = true
 
-  let export t =
-    Ext_terms (Extlib.list_of_opt t)
+    let parse ~typing_context = function
+      | [] -> UnrollFull
+      | [t] ->
+        let open Logic_typing in
+        UnrollAmount
+          (typing_context.type_term typing_context typing_context.pre_state t)
+      | _ -> raise Parse_error
 
-  let import = function
-    | Ext_terms l -> Extlib.opt_of_list l
-    | _ -> assert false
+    let export = function
+      | UnrollFull -> Ext_terms []
+      | UnrollAmount t -> Ext_terms [t]
 
-  let print = Pretty_utils.pp_opt Printer.pp_term
-end
+    let import = function
+      | Ext_terms [] -> UnrollFull
+      | Ext_terms [t] -> UnrollAmount t
+      | _ -> assert false
 
-module Unroll = Register (struct
-    include OptionalTermAnnotation
-    let name = "unroll"
-    let is_loop_annot = true
+    let print fmt = function
+      | UnrollFull -> ()
+      | UnrollAmount t -> Printer.pp_term fmt t
   end)
 
 module Split = Register (struct
diff --git a/src/plugins/value/utils/eva_annotations.mli b/src/plugins/value/utils/eva_annotations.mli
index 6a7ba48f7bee2fbf74401728d580429aaa495d20..ab29469ee7102d9232128475653456b1e7fbaff2 100644
--- a/src/plugins/value/utils/eva_annotations.mli
+++ b/src/plugins/value/utils/eva_annotations.mli
@@ -32,8 +32,11 @@ type slevel_annotation =
   | SlevelMerge
   | SlevelDefault
   | SlevelLocal of int
+  | SlevelFull
 
-type unroll_annotation = Cil_types.term option
+type unroll_annotation =
+  | UnrollAmount of Cil_types.term
+  | UnrollFull
 
 type flow_annotation =
   | FlowSplit of Cil_types.term
diff --git a/src/plugins/value/utils/state_import.ml b/src/plugins/value/utils/state_import.ml
deleted file mode 100644
index f20c361e9917300ae24e9bc8741cb91a3ddd0d52..0000000000000000000000000000000000000000
--- a/src/plugins/value/utils/state_import.ml
+++ /dev/null
@@ -1,308 +0,0 @@
-(**************************************************************************)
-(*                                                                        *)
-(*  This file is part of Frama-C.                                         *)
-(*                                                                        *)
-(*  Copyright (C) 2007-2020                                               *)
-(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
-(*         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 Cvalue
-open Cil_types
-
-let dkey = Value_parameters.register_category "restart"
-
-let base_cache : (int, Base.t) Hashtbl.t = Hashtbl.create 41
-let v_cache = V.Hashtbl.create 53
-
-(* Used to identify and remove escaping values from globals *)
-exception Possibly_escaping_value
-
-let import_varinfo (vi : varinfo) ~importing_value =
-  try
-    if Cil.isFunctionType vi.vtype then
-      let kf = Globals.Functions.find_by_name vi.vname in
-      Kernel_function.get_vi kf
-    else begin
-      let vi' = Globals.Vars.find_from_astinfo vi.vname VGlobal in
-      if vi.vstorage = Static then
-        Value_parameters.warning ~once:true
-          "loaded state contains static variables;@ AST ordering@ \
-           cannot be enforced and must be manually checked for soundness@ \
-           (e.g. ensure that files are processed in the same order)";
-      vi'
-    end
-  with Not_found ->
-    (* search in the state *)
-    if importing_value then begin
-      (* Variable may be an escaping local value *)
-      Value_parameters.warning "variable `%a' is not global, \
-                                possibly an escaping value; ignoring"
-        Printer.pp_varinfo vi;
-      raise Possibly_escaping_value
-    end else
-      Value_parameters.abort "global not found: `%a'"
-        Printer.pp_varinfo vi
-
-let import_validity = function
-  | Base.Empty | Base.Known _ | Base.Unknown _ | Base.Invalid as v -> v
-  | Base.Variable { Base.weak; min_alloc; max_alloc; max_allocable } ->
-    let var = Base.create_variable_validity ~weak ~min_alloc ~max_alloc in
-    if Integer.equal max_allocable var.Base.max_allocable then
-      Base.Variable var
-    else Kernel.abort "Incompatible maximum size for variable %a vs. %a"
-        Abstract_interp.Int.pretty max_allocable
-        Abstract_interp.Int.pretty var.Base.max_allocable
-
-let import_base (base : Base.t) ~importing_value =
-  let make_base = function
-    | Base.Var (vi, _validity) ->
-      Base.of_varinfo (import_varinfo vi ~importing_value)
-    | Base.CLogic_Var (lv, _ty, _validity) ->
-      (* Value states do not contain logic variables anyway
-         (except when evaluating ACSL clauses, which is not the case here *)
-      Value_parameters.fatal "importing logic variables (%a) is unsupported"
-        Printer.pp_logic_var lv
-    | Base.Null -> Base.null
-    | Base.String (_, s) ->
-      (* TODO: currently, we recreate a new string unrelated to the original
-         one. This is probably not the good solution *)
-      let c = match s with
-        | Base.CSString s -> Const (CStr s)
-        | Base.CSWstring s -> Const (CWStr s)
-      in
-      let e = Cil.new_exp Cil_datatype.Location.unknown c in
-      Base.of_string_exp e
-    | Base.Allocated (vi, deallocation, validity) ->
-      Value_parameters.feedback ~dkey "recreating allocated base for alloc: `%a'"
-        Printer.pp_varinfo vi;
-      let new_vi = Value_util.create_new_var vi.vname vi.vtype in
-      let validity = import_validity validity in
-      let new_base = Base.register_allocated_var new_vi deallocation validity in
-      Builtins_malloc.register_malloced_base new_base;
-      new_base
-  in
-  let id = Base.id base in
-  try
-    let res = Hashtbl.find base_cache id in
-    res
-  with Not_found ->
-    let base' = make_base base in
-    Hashtbl.replace base_cache id base';
-    base'
-
-let import_base_setlattice (sl : Base.SetLattice.t) ~importing_value =
-  Base.SetLattice.fold (fun base acc ->
-      let b' = import_base base ~importing_value in
-      Base.Hptset.add b' acc
-    ) sl Base.Hptset.empty
-
-let import_ival = Ival.rehash
-
-let import_map (m : Cvalue.V.M.t) =
-  let add base ival m =
-    let new_base = import_base base ~importing_value:true in
-    let new_ival = import_ival ival in
-    Cvalue.V.add new_base new_ival m
-  in
-  Cvalue.V.M.fold add m Cvalue.V.bottom
-
-let import_v (v : Cvalue.V.t) =
-  match v with
-  | Cvalue.V.Top (sl, o) ->
-    Value_parameters.warning ~once:true
-      "importing garbled mix, locations may have changed";
-    (*let o' = import_origin o in*)
-    let s = import_base_setlattice sl ~importing_value:true in
-    Cvalue.V.inject_top_origin o s
-  | Cvalue.V.Map m ->
-    import_map m
-
-let import_v_or_uninit (vu : Cvalue.V_Or_Uninitialized.t) =
-  let find v =
-    try
-      let res = V.Hashtbl.find v_cache v in
-      res
-    with Not_found ->
-      let v' = import_v v
-      in
-      V.Hashtbl.replace v_cache v v';
-      v'
-  in
-  try
-    V_Or_Uninitialized.map find vu
-  with Possibly_escaping_value ->
-    (* replace variable with ESCAPINGADDR *)
-    Cvalue.V_Or_Uninitialized.C_init_esc V.bottom
-
-let import_offsetmap (offsetmap : V_Offsetmap.t) =
-  V_Offsetmap.map_on_values import_v_or_uninit offsetmap
-
-let import_model (state : Model.t) =
-  match state with
-  | Model.Bottom -> Model.bottom
-  | Model.Top -> Model.top
-  | Model.Map map ->
-    let add base offsetmap map =
-      let new_offsetmap = import_offsetmap offsetmap in
-      let new_base = import_base base ~importing_value:false in
-      Model.add_base new_base new_offsetmap map
-    in
-    Model.fold add map Model.empty_map
-
-(*and import_origin (o : Origin.t) =
-  (* the "new" origin location is arbitrary, since no guarantees about the
-     actual location can be given *)
-  let loc = Origin.LocationSetLattice.currentloc_singleton () in
-  match o with
-  | Origin.Misalign_read _ -> Origin.Misalign_read loc
-  | Origin.Leaf _ -> Origin.Leaf loc
-  | Origin.Merge _ -> Origin.Merge loc
-  | Origin.Arith _ -> Origin.Arith loc
-  | Origin.Well | Origin.Unknown -> o*)
-
-let load_globals_from_file filename : Model.t =
-  let ic = open_in_bin filename in
-  let (state : Model.t) = Marshal.from_channel ic in
-  close_in ic;
-  Value_parameters.feedback ~dkey "DE-MARSHALLED STATE (before import):@.%a"
-    Cvalue.Model.pretty state;
-  import_model state
-
-let save_globals_to_file kf state_with_locals filename =
-  Value_parameters.feedback "Saving globals state after call to function: %a"
-    Kernel_function.pretty kf;
-  let state = Model.filter_base Base.is_global state_with_locals in
-  Value_parameters.feedback ~dkey "SAVED STATE:@.%a" Model.pretty state;
-  let oc = open_out_bin filename in
-  Marshal.to_channel oc state [];
-  close_out oc
-
-let load_and_merge_function_state state : Model.t =
-  let (kf, filename) = Value_parameters.get_LoadFunctionState () in
-  Value_parameters.feedback
-    "@[<hov 0>Skipping call to %a,@ loading globals state from file:@ %s@]"
-    Kernel_function.pretty kf filename;
-  let saved_state = load_globals_from_file filename in
-  Value_parameters.debug ~dkey "LOADED STATE:@.%a"
-    Cvalue.Model.pretty saved_state;
-  (* warn about missing globals in the new AST, and add new globals that were
-     not present before *)
-  let saved_map = match saved_state with
-    | Model.Map m -> m
-    | _ -> assert false
-  in
-  let locals =
-    Model.filter_base (fun base -> not (Base.is_global base)) state
-  in
-  let state_without_locals =
-    Model.filter_base (fun base -> Base.is_global base) state
-  in
-  Value_parameters.debug ~dkey "Merging state with locals: %a@."
-    Model.pretty locals;
-  let new_globals =
-    Model.filter_base
-      (fun base ->
-         try
-           let _ = Model.find_base base saved_state in
-           false (* previously existing global *)
-         with
-         | Not_found ->
-           Value_parameters.warning "found new global variable `%a'"
-             Base.pretty base;
-           true (* new global *)
-      ) state_without_locals
-  in
-  let merged_globals_state =
-    Model.fold (fun new_base offsm acc ->
-        Model.add_base new_base offsm acc
-      ) saved_map new_globals
-  in
-  let map_with_globals = match merged_globals_state with
-    | Model.Map m -> m
-    | _ -> Value_parameters.fatal "invalid saved state: %a"
-             Model.pretty saved_state
-  in
-  let merged_globals_and_locals =
-    Model.fold (fun new_base offsm acc ->
-        Model.add_base new_base offsm acc
-      ) map_with_globals locals
-  in
-  merged_globals_and_locals
-
-let save_globals_state () : unit =
-  let (kf, filename) = Value_parameters.get_SaveFunctionState () in
-  let ret_stmt = Kernel_function.find_return kf in
-  try
-    let ret_state = Db.Value.get_stmt_state ret_stmt in
-    match ret_state with
-    | Model.Top ->
-      Value_parameters.abort "cannot save state at return statement of %a \
-                              (too imprecise)" Kernel_function.pretty kf
-    | Model.Bottom ->
-      Value_parameters.abort "cannot save state at return statement of %a \
-                              (bottom)" Kernel_function.pretty kf
-    | Model.Map _ -> save_globals_to_file kf ret_state filename
-  with Not_found ->
-    if Value_parameters.LoadFunctionState.is_set () then
-      let (load_kf, _) = Value_parameters.get_LoadFunctionState () in
-      Value_parameters.abort "could not find saved state for function `%a';@ \
-                              this can happen if it is called from `%a'"
-        Kernel_function.pretty kf Kernel_function.pretty load_kf;
-    else
-      Value_parameters.failure "could not find saved state for function `%a'"
-        Kernel_function.pretty kf
-
-
-exception Warn_local_addresses
-(* visitor used by frama_c_load_state *)
-class locals_visitor = object(_self) inherit Visitor.frama_c_inplace
-  method! vlval (lhost, _) =
-    match lhost with
-    | Var vi ->
-      if not vi.vglob then raise Warn_local_addresses;
-      Cil.DoChildren
-    | Mem _ -> Cil.DoChildren
-end
-
-
-(* Builtin to load a saved analysis state *)
-let frama_c_load_state state actuals =
-  (* Warn if arguments contain pointers to local variables,
-     in which case the loaded state may be unsound. *)
-  begin
-    try
-      List.iter (fun (exp_arg, arg, _) ->
-          let vis = new locals_visitor in
-          if Cil.isPointerType (Cil.typeOf exp_arg) then
-            ignore (Visitor.visitFramacExpr vis exp_arg);
-          if Cvalue.V.contains_addresses_of_any_locals arg then
-            raise Warn_local_addresses
-        ) actuals;
-    with Warn_local_addresses ->
-      Value_parameters.warning ~current:true ~once:true
-        "arguments to loaded function state contain local addresses,@ \
-         possible unsoundness";
-  end;
-  let merged_loaded_state = load_and_merge_function_state state in
-  {
-    Value_types.c_values = [None, merged_loaded_state];
-    c_clobbered = Base.SetLattice.empty;
-    c_cacheable = Value_types.NoCacheCallers;
-    c_from = None
-  }
-
-let () = Builtins.register_builtin "Frama_C_load_state" frama_c_load_state
diff --git a/src/plugins/value/utils/value_perf.ml b/src/plugins/value/utils/value_perf.ml
index 6dea7f2ed2919b1dce27acfa2f1bc8aaa2d10de9..de12cb45574f55de6f26fcacb0b4d585c7fdfff1 100644
--- a/src/plugins/value/utils/value_perf.ml
+++ b/src/plugins/value/utils/value_perf.ml
@@ -356,7 +356,7 @@ let reset_perf () =
 (* --- Flamegraphs                                                        --- *)
 (* -------------------------------------------------------------------------- *)
 
-(* Set to [Some _] if option [-val-dump-flamegraph] is set and [main] is
+(* Set to [Some _] if option [-eva-flamegraph] is set and [main] is
    currently being analyzed and the file is ok. Otherwise, set to [None]. *)
 let oc_flamegraph = ref None
 
diff --git a/src/plugins/value/value_parameters.ml b/src/plugins/value/value_parameters.ml
index e0f41ccf3bebd776cd5201444f0ff4bca79f1459..1446dd8d796c00da0756d64a22a00301a6bbaa0f 100644
--- a/src/plugins/value/value_parameters.ml
+++ b/src/plugins/value/value_parameters.ml
@@ -25,6 +25,7 @@ let kernel_parameters_correctness = [
   Kernel.MainFunction.parameter;
   Kernel.LibEntry.parameter;
   Kernel.AbsoluteValidRange.parameter;
+  Kernel.InitializedPaddingLocals.parameter;
   Kernel.SafeArrays.parameter;
   Kernel.UnspecifiedAccess.parameter;
   Kernel.SignedOverflow.parameter;
@@ -33,6 +34,10 @@ let kernel_parameters_correctness = [
   Kernel.RightShiftNegative.parameter;
   Kernel.SignedDowncast.parameter;
   Kernel.UnsignedDowncast.parameter;
+  Kernel.PointerDowncast.parameter;
+  Kernel.SpecialFloat.parameter;
+  Kernel.InvalidBool.parameter;
+  Kernel.InvalidPointer.parameter;
 ]
 
 let parameters_correctness = ref Typed_parameter.Set.empty
@@ -64,8 +69,8 @@ include Plugin.Register
         "automatically computes variation domains for the variables of the program"
     end)
 
-let () = Help.add_aliases [ "-value-h"; "-val-h" ]
-let () = add_plugin_output_aliases [ "value" ]
+let () = Help.add_aliases ~visible:false [ "-value-h"; "-val-h" ]
+let () = add_plugin_output_aliases ~visible:false ~deprecated:true [ "value" ]
 
 (* Debug categories. *)
 let dkey_initial_state = register_category "initial-state"
@@ -106,10 +111,10 @@ module ForceValues =
   WithOutput
     (struct
       let option_name = "-eva"
-      let help = "compute values"
+      let help = "Compute values"
       let output_by_default = true
     end)
-let () = ForceValues.add_aliases ["-val"]
+let () = ForceValues.add_aliases ~deprecated:true ["-val"]
 
 let domains = add_group "Abstract Domains"
 let precision_tuning = add_group "Precision vs. time"
@@ -225,7 +230,7 @@ module DomainsFunction =
     end)
     (struct
       let option_name = "-eva-domains-function"
-      let help = "Enables a domain only for the given functions. \
+      let help = "Enable a domain only for the given functions. \
                   <d:f+> enables the domain [d] from function [f] \
                   (the domain is enabled in all functions called from [f]). \
                   <d:f-> disables the domain [d] from function [f]."
@@ -248,12 +253,13 @@ module EqualityCall =
   String
     (struct
       let option_name = "-eva-equality-through-calls"
-      let help = "Equalities propagated through function calls (from the caller \
+      let help = "Propagate equalities through function calls (from the caller \
                   to the called function): none, only equalities between formal \
                   parameters and concrete arguments, or all. "
       let default = "formals"
       let arg_name = "none|formals|all"
     end)
+let () = EqualityCall.set_possible_values ["none"; "formals"; "all"]
 let () = add_precision_dep EqualityCall.parameter
 
 let () = Parameter_customize.set_group domains
@@ -269,7 +275,7 @@ module EqualityCallFunction =
     end)
     (struct
       let option_name = "-eva-equality-through-calls-function"
-      let help = "Equalities propagated through calls to specific functions. \
+      let help = "Propagate equalities through calls to specific functions. \
                   Overrides -eva-equality-call."
       let default = Kernel_function.Map.empty
       let arg_name = "f:none|formals|all"
@@ -281,8 +287,8 @@ module OctagonCall =
   Bool
     (struct
       let option_name = "-eva-octagon-through-calls"
-      let help = "Whether the relations inferred by the octagon domain are \
-                  propagated through function calls. Disabled by default: \
+      let help = "Propagate relations inferred by the octagon domain \
+                  through function calls. Disabled by default: \
                   the octagon analysis is intra-procedural, starting \
                   each function with an empty octagon state, \
                   and losing the octagons inferred at the end. \
@@ -299,9 +305,10 @@ module Numerors_Real_Size =
       let option_name = "-eva-numerors-real-size"
       let arg_name = "n"
       let help =
-        "set <n> as the significand size of the MPFR representation \
+        "Set <n> as the significand size of the MPFR representation \
          of reals used by the numerors domain (defaults to 128)"
     end)
+let () = Numerors_Real_Size.set_range 1 max_int
 let () = add_precision_dep Numerors_Real_Size.parameter
 
 let () = Parameter_customize.set_group domains
@@ -309,7 +316,7 @@ module Numerors_Mode =
   String
     (struct
       let option_name = "-eva-numerors-interaction"
-      let help = "defines how the numerors domain infers the absolute and the \
+      let help = "Define how the numerors domain infers the absolute and the \
                   relative errors:\n\
                   - relative: the relative is deduced from the absolute;\n\
                   - absolute: the absolute is deduced from the relative;\n\
@@ -369,38 +376,35 @@ module NoResultsFunctions =
     (struct
       let option_name = "-eva-no-results-function"
       let arg_name = "f"
-      let help = "do not record the values obtained for the statements of \
+      let help = "Do not record the values obtained for the statements of \
                   function f"
     end)
 let () = add_dep NoResultsFunctions.parameter
-let () = NoResultsFunctions.add_aliases ["-no-results-function"]
 
 let () = Parameter_customize.set_group performance
 module ResultsAll =
   True
     (struct
       let option_name = "-eva-results"
-      let help = "record values for any of the statements of the program."
+      let help = "Record values for each of the statements of the program."
     end)
 let () = add_dep ResultsAll.parameter
-let () = ResultsAll.add_aliases ["-results"]
 
 let () = Parameter_customize.set_group performance
 module JoinResults =
   Bool
     (struct
       let option_name = "-eva-join-results"
-      let help = "precompute consolidated states once value is computed"
+      let help = "Precompute consolidated states once Eva is computed"
       let default = true
     end)
-let () = JoinResults.add_aliases ["-val-join-results"]
 
 let () = Parameter_customize.set_group performance
 module EqualityStorage =
   Bool
     (struct
       let option_name = "-eva-equality-storage"
-      let help = "Stores the states of the equality domain during \
+      let help = "Store the states of the equality domain during \
                   the analysis."
       let default = true
     end)
@@ -411,7 +415,7 @@ module SymbolicLocsStorage =
   Bool
     (struct
       let option_name = "-eva-symbolic-locations-storage"
-      let help = "Stores the states of the symbolic locations domain during \
+      let help = "Store the states of the symbolic locations domain during \
                   the analysis."
       let default = true
     end)
@@ -422,7 +426,7 @@ module GaugesStorage =
   Bool
     (struct
       let option_name = "-eva-gauges-storage"
-      let help = "Stores the states of the gauges domain during the analysis."
+      let help = "Store the states of the gauges domain during the analysis."
       let default = true
     end)
 let () = add_precision_dep GaugesStorage.parameter
@@ -432,7 +436,7 @@ module ApronStorage =
   Bool
     (struct
       let option_name = "-eva-apron-storage"
-      let help = "Stores the states of the apron domains during the \
+      let help = "Store the states of the apron domains during the \
                   analysis."
       let default = false
     end)
@@ -443,7 +447,7 @@ module BitwiseOffsmStorage =
   Bool
     (struct
       let option_name = "-eva-bitwise-storage"
-      let help = "Stores the states of the bitwise domain during the \
+      let help = "Store the states of the bitwise domain during the \
                   analysis."
       let default = true
     end)
@@ -458,53 +462,35 @@ module AllRoundingModesConstants =
   False
     (struct
       let option_name = "-eva-all-rounding-modes-constants"
-      let help = "Take into account the possibility of constants not being converted to the nearest representable value, or being converted to higher precision"
+      let help = "Take into account the possibility of constants not being \
+                  converted to the nearest representable value, \
+                  or being converted to higher precision"
     end)
 let () = add_correctness_dep AllRoundingModesConstants.parameter
-let () = AllRoundingModesConstants.add_aliases ["-all-rounding-modes-constants"]
 
 let () = Parameter_customize.set_group alarms
 module UndefinedPointerComparisonPropagateAll =
   False
     (struct
       let option_name = "-eva-undefined-pointer-comparison-propagate-all"
-      let help = "if the target program appears to contain undefined pointer comparisons, propagate both outcomes {0; 1} in addition to the emission of an alarm"
+      let help = "If the target program appears to contain undefined pointer \
+                  comparisons, propagate both outcomes {0; 1} in addition to \
+                  the emission of an alarm"
     end)
 let () = add_correctness_dep UndefinedPointerComparisonPropagateAll.parameter
-let () =
-  UndefinedPointerComparisonPropagateAll.add_aliases
-    ["-undefined-pointer-comparison-propagate-all"]
 
 let () = Parameter_customize.set_group alarms
 module WarnPointerComparison =
   String
     (struct
       let option_name = "-eva-warn-undefined-pointer-comparison"
-      let help = "warn on all pointer comparisons, on comparisons where \
+      let help = "Warn on all pointer comparisons, on comparisons where \
                   the arguments have pointer type (default), or never warn"
       let default = "pointer"
       let arg_name = "all|pointer|none"
     end)
 let () = WarnPointerComparison.set_possible_values ["all"; "pointer"; "none"]
 let () = add_correctness_dep WarnPointerComparison.parameter
-let () = WarnPointerComparison.add_aliases ["-val-warn-undefined-pointer-comparison"]
-
-
-let () = Parameter_customize.set_group alarms
-let () = Parameter_customize.is_invisible ()
-module WarnLeftShiftNegative =
-  True
-    (struct
-      let option_name = "-val-warn-left-shift-negative"
-      let help =
-        "Emit alarms when left-shifting negative integers"
-    end)
-let () = add_correctness_dep WarnLeftShiftNegative.parameter
-let () = WarnLeftShiftNegative.add_update_hook
-    (fun _ v ->
-       warning "This option is deprecated. Use %s instead"
-         Kernel.LeftShiftNegative.name;
-       Kernel.LeftShiftNegative.set v)
 
 let () = Parameter_customize.set_group alarms
 module WarnSignedConvertedDowncast =
@@ -517,9 +503,6 @@ module WarnSignedConvertedDowncast =
                   destination range."
     end)
 let () = add_correctness_dep WarnSignedConvertedDowncast.parameter
-let () =
-  WarnSignedConvertedDowncast.add_aliases
-    ["-val-warn-signed-converted-downcast"]
 
 
 let () = Parameter_customize.set_group alarms
@@ -533,7 +516,6 @@ module WarnPointerSubstraction =
          offsets. When unset, do not warn but generate imprecise offsets."
     end)
 let () = add_correctness_dep WarnPointerSubstraction.parameter
-let () = WarnPointerSubstraction.add_aliases ["-val-warn-pointer-subtraction"]
 
 let () = Parameter_customize.set_group alarms
 module IgnoreRecursiveCalls =
@@ -544,7 +526,6 @@ module IgnoreRecursiveCalls =
         "Pretend function calls that would be recursive do not happen. Causes unsoundness"
     end)
 let () = add_correctness_dep IgnoreRecursiveCalls.parameter
-let () = IgnoreRecursiveCalls.add_aliases ["-val-ignore-recursive-calls"]
 
 let () = Parameter_customize.set_group alarms
 
@@ -553,13 +534,12 @@ module WarnCopyIndeterminate =
     (struct
       let option_name = "-eva-warn-copy-indeterminate"
       let arg_name = "f | @all"
-      let help = "warn when a statement of the specified functions copies a \
+      let help = "Warn when a statement of the specified functions copies a \
                   value that may be indeterminate (uninitialized or containing escaping address). \
                   Set by default; can be deactivated for function 'f' by '=-f', or for all \
                   functions by '=-@all'."
     end)
 let () = add_correctness_dep WarnCopyIndeterminate.parameter
-let () = WarnCopyIndeterminate.add_aliases ["-val-warn-copy-indeterminate"]
 let () = WarnCopyIndeterminate.Category.(set_default (all ()))
 
 let () = Parameter_customize.set_group alarms
@@ -568,10 +548,9 @@ module ReduceOnLogicAlarms =
     (struct
       let option_name = "-eva-reduce-on-logic-alarms"
       let help = "Force reductions by a predicate to ignore logic alarms \
-                  emitted while the predicated is evaluated (experimental)"
+                  emitted while the predicate is evaluated (experimental)"
     end)
 let () = add_correctness_dep ReduceOnLogicAlarms.parameter
-let () = ReduceOnLogicAlarms.add_aliases ["-val-reduce-on-logic-alarms"]
 
 let () = Parameter_customize.set_group alarms
 module InitializedLocals =
@@ -583,7 +562,6 @@ module InitializedLocals =
                   initialization."
     end)
 let () = add_correctness_dep InitializedLocals.parameter
-let () = InitializedLocals.add_aliases ["-val-initialized-locals"]
 
 (* ------------------------------------------------------------------------- *)
 (* --- Initial context                                                   --- *)
@@ -596,10 +574,10 @@ module AutomaticContextMaxDepth =
       let option_name = "-eva-context-depth"
       let default = 2
       let arg_name = "n"
-      let help = "use <n> as the depth of the default context for Eva. (defaults to 2)"
+      let help = "Use <n> as the depth of the default context for Eva. (defaults to 2)"
     end)
+let () = AutomaticContextMaxDepth.set_range 0 max_int
 let () = add_correctness_dep AutomaticContextMaxDepth.parameter
-let () = AutomaticContextMaxDepth.add_aliases ["-context-depth"]
 
 let () = Parameter_customize.set_group initial_context
 module AutomaticContextMaxWidth =
@@ -608,21 +586,20 @@ module AutomaticContextMaxWidth =
       let option_name = "-eva-context-width"
       let default = 2
       let arg_name = "n"
-      let help = "use <n> as the width of the default context for Eva. (defaults to 2)"
+      let help = "Use <n> as the width of the default context for Eva. (defaults to 2)"
     end)
 let () = AutomaticContextMaxWidth.set_range ~min:1 ~max:max_int
 let () = add_correctness_dep AutomaticContextMaxWidth.parameter
-let () = AutomaticContextMaxWidth.add_aliases ["-context-width"]
 
 let () = Parameter_customize.set_group initial_context
 module AllocatedContextValid =
   False
     (struct
       let option_name = "-eva-context-valid-pointers"
-      let help = "only allocate valid pointers until context-depth, and then use NULL (defaults to false)"
+      let help = "Only allocate valid pointers until context-depth, \
+                  and then use NULL (defaults to false)"
     end)
 let () = add_correctness_dep AllocatedContextValid.parameter
-let () = AllocatedContextValid.add_aliases ["-context-valid-pointers"]
 
 let () = Parameter_customize.set_group initial_context
 module InitializationPaddingGlobals =
@@ -638,7 +615,6 @@ module InitializationPaddingGlobals =
     end)
 let () = InitializationPaddingGlobals.set_possible_values ["yes"; "no"; "maybe"]
 let () = add_correctness_dep InitializationPaddingGlobals.parameter
-let () = InitializationPaddingGlobals.add_aliases ["-val-initialization-padding-globals"]
 
 (* ------------------------------------------------------------------------- *)
 (* --- Tuning                                                            --- *)
@@ -669,7 +645,7 @@ module HierarchicalConvergence =
     (struct
       let option_name = "-eva-hierarchical-convergence"
       let help = "Experimental and unsound. Separate the convergence process \
-                  of each levels of nested  loops. This implies that the convergence of \
+                  of each level of nested loops. This implies that the convergence of \
                   inner loops will be completely recomputed when doing another iteration \
                   of the outer loops."
     end)
@@ -683,10 +659,9 @@ module WideningDelay =
       let option_name = "-eva-widening-delay"
       let arg_name = "n"
       let help =
-        "do not widen before the <n>-th iteration (defaults to 3)"
+        "Do not widen before the <n>-th iteration (defaults to 3)"
     end)
 let () = WideningDelay.set_range ~min:1 ~max:max_int
-let () = WideningDelay.add_aliases ["-wlevel"]
 let () = add_precision_dep WideningDelay.parameter
 
 let () = Parameter_customize.set_group precision_tuning
@@ -697,9 +672,9 @@ module WideningPeriod =
       let option_name = "-eva-widening-period"
       let arg_name = "n"
       let help =
-        "after the first widening, widen each <n> iterations (defaults to 2)"
+        "After the first widening, widen each <n> iterations (defaults to 2)"
     end)
-let () = WideningDelay.set_range ~min:1 ~max:max_int
+let () = WideningPeriod.set_range ~min:1 ~max:max_int
 let () = add_precision_dep WideningPeriod.parameter
 
 (* --- Partitioning --- *)
@@ -711,10 +686,12 @@ module SemanticUnrollingLevel =
       let option_name = "-eva-slevel"
       let arg_name = "n"
       let help =
-        "superpose up to <n> states when unrolling control flow. The larger n, the more precise and expensive the analysis (defaults to 0)"
+        "Superpose up to <n> states when unrolling control flow. \
+         The larger n, the more precise and expensive the analysis \
+         (defaults to 0)"
     end)
+let () = SemanticUnrollingLevel.set_range 0 max_int
 let () = add_precision_dep SemanticUnrollingLevel.parameter
-let () = SemanticUnrollingLevel.add_aliases ["-slevel"]
 
 let () = Parameter_customize.set_group precision_tuning
 let () = Parameter_customize.argument_may_be_fundecl ()
@@ -735,11 +712,10 @@ module SlevelFunction =
     (struct
       let option_name = "-eva-slevel-function"
       let arg_name = "f:n"
-      let help = "override slevel with <n> when analyzing <f>"
+      let help = "Override slevel with <n> when analyzing <f>"
       let default = Kernel_function.Map.empty
     end)
 let () = add_precision_dep SlevelFunction.parameter
-let () = SlevelFunction.add_aliases ["-slevel-function"]
 
 let () = Parameter_customize.set_group precision_tuning
 module SlevelMergeAfterLoop =
@@ -748,11 +724,10 @@ module SlevelMergeAfterLoop =
       let option_name = "-eva-slevel-merge-after-loop"
       let arg_name = "f | @all"
       let help =
-        "when set, the different execution paths that originate from the body \
+        "When set, the different execution paths that originate from the body \
          of a loop are merged before entering the next excution."
     end)
 let () = add_precision_dep SlevelMergeAfterLoop.parameter
-let () = SlevelMergeAfterLoop.add_aliases ["-val-slevel-merge-after-loop"]
 
 let () = Parameter_customize.set_group precision_tuning
 module MinLoopUnroll =
@@ -762,9 +737,9 @@ module MinLoopUnroll =
       let arg_name = "n"
       let default = 0
       let help =
-        "unroll <n> loop iterations for each loop, regardless of the slevel \
+        "Unroll <n> loop iterations for each loop, regardless of the slevel \
          settings and the number of states already propagated. \
-         Can be overwritten on a case by case basis by loop unroll annotations."
+         Can be overwritten on a case-by-case basis by loop unroll annotations."
     end)
 let () = add_precision_dep MinLoopUnroll.parameter
 let () = MinLoopUnroll.set_range 0 max_int
@@ -776,7 +751,7 @@ module AutoLoopUnroll =
       let option_name = "-eva-auto-loop-unroll"
       let arg_name = "n"
       let default = 0
-      let help = "limit of the automatic loop unrolling: all loops whose \
+      let help = "Limit of the automatic loop unrolling: all loops whose \
                   number of iterations can be easily bounded by <n> \
                   are completely unrolled."
     end)
@@ -791,8 +766,8 @@ module DefaultLoopUnroll =
       let arg_name = "n"
       let default = 100
       let help =
-        "defines the default limit for loop unroll annotations that do\
-         not explicitely provide a limit."
+        "Define the default limit for loop unroll annotations that do \
+         not explicitly provide a limit."
     end)
 let () = add_precision_dep DefaultLoopUnroll.parameter
 let () = DefaultLoopUnroll.set_range 0 max_int
@@ -805,7 +780,7 @@ module HistoryPartitioning =
       let arg_name = "n"
       let default = 0
       let help =
-        "keep states distincts as long as the <n> last branching in their\
+        "Keep states distinct as long as the <n> last branching in their \
          traces are also distinct. (A value of 0 deactivates this feature)"
     end)
 let () = add_precision_dep HistoryPartitioning.parameter
@@ -816,7 +791,7 @@ module ValuePartitioning =
   String_set
     (struct
       let option_name = "-eva-partition-value"
-      let help = "partition the space of reachable states according to the \
+      let help = "Partition the space of reachable states according to the \
                   possible values of the global(s) variable(s) V."
       let arg_name = "V"
     end)
@@ -829,8 +804,8 @@ module SplitLimit =
       let option_name = "-eva-split-limit"
       let arg_name = "N"
       let default = 100
-      let help = "prevents the split annotations or -eva-partition-value to \
-                  enumerate more than N cases"
+      let help = "Prevent split annotations or -eva-partition-value from \
+                  enumerating more than N cases"
     end)
 let () = add_precision_dep SplitLimit.parameter
 let () = SplitLimit.set_range 0 max_int
@@ -853,12 +828,11 @@ module SplitReturnFunction =
     (struct
       let option_name = "-eva-split-return-function"
       let arg_name = "f:n"
-      let help = "split return states of function <f> according to \
+      let help = "Split return states of function <f> according to \
                   \\result == n and \\result != n"
       let default = Kernel_function.Map.empty
     end)
 let () = add_precision_dep SplitReturnFunction.parameter
-let () = SplitReturnFunction.add_aliases ["-val-split-return-function"]
 
 let () = Parameter_customize.set_group precision_tuning
 module SplitReturn =
@@ -867,8 +841,8 @@ module SplitReturn =
       let option_name = "-eva-split-return"
       let arg_name = "mode"
       let default = ""
-      let help = "when 'mode' is a number, or 'full', this is equivalent \
-                  to -val-split-return-function f:mode for all functions f. \
+      let help = "When 'mode' is a number, or 'full', this is equivalent \
+                  to -eva-split-return-function f:mode for all functions f. \
                   When mode is 'auto', automatically split states at the end \
                   of all functions, according to the function return code"
     end)
@@ -886,7 +860,6 @@ let () =
            abort "@[@[incorrect argument for option %s@ (%s).@]"
              SplitReturn.name s))
 let () = add_precision_dep SplitReturn.parameter
-let () = SplitReturn.add_aliases ["-val-split-return"]
 
 (* --- Misc --- *)
 
@@ -903,7 +876,6 @@ module ILevel =
          (defaults to 8, must be between 4 and 128)"
     end)
 let () = add_precision_dep ILevel.parameter
-let () = ILevel.add_aliases ["-val-ilevel"]
 let () = ILevel.add_update_hook (fun _ i -> Int_set.set_small_cardinal i)
 let () = ILevel.set_range 4 256
 
@@ -934,13 +906,12 @@ module BuiltinsOverrides =
     (struct
       let option_name = "-eva-builtin"
       let arg_name = "f:ffc"
-      let help = "when analyzing function <f>, try to use Frama-C builtin \
+      let help = "When analyzing function <f>, try to use Frama-C builtin \
                   <ffc> instead. \
                   Fall back to <f> if <ffc> cannot handle its arguments."
       let default = Kernel_function.Map.empty
     end)
-let () = add_precision_dep BuiltinsOverrides.parameter
-let () = BuiltinsOverrides.add_aliases ["-val-builtin"]
+let () = add_correctness_dep BuiltinsOverrides.parameter
 
 (* Exported in Eva.mli. *)
 let use_builtin key name =
@@ -957,7 +928,6 @@ module BuiltinsAuto =
                   known C functions"
     end)
 let () = add_correctness_dep BuiltinsAuto.parameter
-let () = BuiltinsAuto.add_aliases ["-val-builtins-auto"]
 
 let () = Parameter_customize.set_group precision_tuning
 let () = Parameter_customize.set_negative_option_name ""
@@ -965,10 +935,9 @@ module BuiltinsList =
   False
     (struct
       let option_name = "-eva-builtins-list"
-      let help = "Lists the existing builtins, and which functions they \
+      let help = "List existing builtins, and which functions they \
                   are automatically associated to (if any)"
     end)
-let () = BuiltinsList.add_aliases ["-val-builtins-list"]
 
 let () = Parameter_customize.set_group precision_tuning
 module LinearLevel =
@@ -981,8 +950,8 @@ module LinearLevel =
          appears multiple times, by splitting its value at most n times. \
          Defaults to 0."
     end)
+let () = LinearLevel.set_range 0 max_int
 let () = add_precision_dep LinearLevel.parameter
-let () = LinearLevel.add_aliases ["-val-subdivide-non-linear"]
 
 let () = Parameter_customize.set_group precision_tuning
 module LinearLevelFunction =
@@ -1002,7 +971,7 @@ module LinearLevelFunction =
     (struct
       let option_name = "-eva-subdivide-non-linear-function"
       let arg_name = "f:n"
-      let help = "override the global option -eva-subdivide-non-linear with <n>\
+      let help = "Override the global option -eva-subdivide-non-linear with <n>\
                   when analyzing the function <f>."
       let default = Kernel_function.Map.empty
     end)
@@ -1015,21 +984,20 @@ module UsePrototype =
     (struct
       let option_name = "-eva-use-spec"
       let arg_name = "f1,..,fn"
-      let help = "use the ACSL specification of the functions instead of their definitions"
+      let help = "Use the ACSL specification of the functions instead of \
+                  their definitions"
     end)
-let () = add_precision_dep UsePrototype.parameter
-let () = UsePrototype.add_aliases ["-val-use-spec"]
+let () = add_correctness_dep UsePrototype.parameter
 
 let () = Parameter_customize.set_group precision_tuning
 module SkipLibcSpecs =
   True
     (struct
       let option_name = "-eva-skip-stdlib-specs"
-      let help = "skip ACSL specifications on functions originating from the \
+      let help = "Skip ACSL specifications on functions originating from the \
                   standard library of Frama-C, when their bodies are evaluated"
     end)
 let () = add_precision_dep SkipLibcSpecs.parameter
-let () = SkipLibcSpecs.add_aliases ["-val-skip-stdlib-specs"]
 
 
 let () = Parameter_customize.set_group precision_tuning
@@ -1037,10 +1005,10 @@ module RmAssert =
   True
     (struct
       let option_name = "-eva-remove-redundant-alarms"
-      let help = "after the analysis, try to remove redundant alarms, so that the user needs inspect fewer of them"
+      let help = "After the analysis, try to remove redundant alarms, \
+                  so that the user needs to inspect fewer of them"
     end)
 let () = add_precision_dep RmAssert.parameter
-let () = RmAssert.add_aliases ["-remove-redundant-alarms"]
 
 let () = Parameter_customize.set_group precision_tuning
 module MemExecAll =
@@ -1048,20 +1016,10 @@ module MemExecAll =
     (struct
       let option_name = "-eva-memexec"
       let help = "Speed up analysis by not recomputing functions already \
-                  analyzed in the same context. Forces -inout-callwise. \
+                  analyzed in the same context. \
                   Callstacks for which the analysis has not been recomputed \
                   are incorrectly shown as dead in the GUI."
     end)
-let () = MemExecAll.add_aliases ["-memexec-all"]
-let () =
-  MemExecAll.add_set_hook
-    (fun _bold bnew ->
-       if bnew then
-         try
-           Dynamic.Parameter.Bool.set "-inout-callwise" true
-         with Dynamic.Unbound_value _ | Dynamic.Incompatible_type _ ->
-           abort "Cannot set option -eva-memexec. Is plugin Inout registered?"
-    )
 
 let () = Parameter_customize.set_group precision_tuning
 module ArrayPrecisionLevel =
@@ -1070,106 +1028,15 @@ module ArrayPrecisionLevel =
       let default = 200
       let option_name = "-eva-plevel"
       let arg_name = "n"
-      let help = "use <n> as the precision level for arrays accesses. \
+      let help = "Use <n> as the precision level for arrays accesses. \
                   Array accesses are precise as long as the interval for the index contains \
                   less than n values. (defaults to 200)"
     end)
+let () = ArrayPrecisionLevel.set_range 0 max_int
 let () = add_precision_dep ArrayPrecisionLevel.parameter
-let () = ArrayPrecisionLevel.add_aliases ["-plevel"]
 let () = ArrayPrecisionLevel.add_update_hook
     (fun _ v -> Offsetmap.set_plevel v)
 
-(* Options SaveFunctionState and LoadFunctionState are related
-   and mutually dependent for sanity checking.
-   Also, they depend on BuiltinsOverrides, so they cannot be defined before it. *)
-let () = Parameter_customize.set_group initial_context
-module SaveFunctionState =
-  Kernel_function_map
-    (struct
-      include Datatype.String
-      type key = Cil_types.kernel_function
-      let of_string ~key:_ ~prev:_ file = file
-      let to_string ~key:_ file = file
-    end)
-    (struct
-      let option_name = "-eva-save-fun-state"
-      let arg_name = "function:filename"
-      let help = "save state of function <function> in file <filename>"
-      let default = Kernel_function.Map.empty
-    end)
-let () = SaveFunctionState.add_aliases ["-val-save-fun-state"]
-let () = Parameter_customize.set_group initial_context
-module LoadFunctionState =
-  Kernel_function_map
-    (struct
-      include Datatype.String
-      type key = Cil_types.kernel_function
-      let of_string ~key:_ ~prev:_ file = file
-      let to_string ~key:_ file = file
-    end)
-    (struct
-      let option_name = "-eva-load-fun-state"
-      let arg_name = "function:filename"
-      let help = "load state of function <function> from file <filename>"
-      let default = Kernel_function.Map.empty
-    end)
-let () = LoadFunctionState.add_aliases ["-val-load-fun-state"]
-let () = add_correctness_dep SaveFunctionState.parameter
-let () = add_correctness_dep LoadFunctionState.parameter
-(* checks that SaveFunctionState has a unique argument pair, and returns it. *)
-let get_SaveFunctionState () =
-  let is_first = ref true in
-  let (kf, filename) = SaveFunctionState.fold
-      (fun (kf, opt_filename) _acc ->
-         if !is_first then is_first := false
-         else abort "option `%s' requires a single function:filename pair"
-             SaveFunctionState.name;
-         let filename = Extlib.the opt_filename in
-         kf, filename
-      ) (Kernel_function.dummy (), "")
-  in
-  if filename = "" then abort "option `%s' requires a function:filename pair"
-      SaveFunctionState.name
-  else kf, filename
-(* checks that LoadFunctionState has a unique argument pair, and returns it. *)
-let get_LoadFunctionState () =
-  let is_first = ref true in
-  let (kf, filename) = LoadFunctionState.fold
-      (fun (kf, opt_filename) _acc ->
-         if !is_first then is_first := false
-         else abort "option `%s' requires a single function:filename pair"
-             LoadFunctionState.name;
-         let filename = Extlib.the opt_filename in
-         kf, filename
-      ) (Kernel_function.dummy (), "")
-  in
-  if filename = "" then abort "option `%s' requires a function:filename pair"
-      LoadFunctionState.name
-  else kf, filename
-(* perform early sanity checks to avoid aborting the analysis only at the end *)
-let () = Ast.apply_after_computed (fun _ ->
-    (* check the function to save returns 'void' *)
-    if SaveFunctionState.is_set () then begin
-      let (kf, _) = get_SaveFunctionState () in
-      if not (Kernel_function.returns_void kf) then
-        abort "option `%s': function `%a' must return void"
-          SaveFunctionState.name Kernel_function.pretty kf
-    end;
-    if SaveFunctionState.is_set () && LoadFunctionState.is_set () then begin
-      (* check that if both save and load are set, they do not specify the
-         same function name (note: cannot compare using function ids) *)
-      let (save_kf, _) = get_SaveFunctionState () in
-      let (load_kf, _) = get_LoadFunctionState () in
-      if Kernel_function.equal save_kf load_kf then
-        abort "options `%s' and `%s' cannot save/load the same function `%a'"
-          SaveFunctionState.name LoadFunctionState.name
-          Kernel_function.pretty save_kf
-    end;
-    if LoadFunctionState.is_set () then
-      let (kf, _) = get_LoadFunctionState () in
-      BuiltinsOverrides.add (kf, Some "Frama_C_load_state");
-  )
-
 (* ------------------------------------------------------------------------- *)
 (* --- Messages                                                          --- *)
 (* ------------------------------------------------------------------------- *)
@@ -1181,51 +1048,26 @@ module ValShowProgress =
       let option_name = "-eva-show-progress"
       let help = "Show progression messages during analysis"
     end)
-let () = ValShowProgress.add_aliases ["-val-show-progress"]
-
-let () = Parameter_customize.set_group messages
-let () = Parameter_customize.is_invisible ()
-module ValShowInitialState =
-  True
-    (struct
-      let option_name = "-val-show-initial-state"
-      (* deprecated in Silicon *)
-      let help = "[deprecated] Show initial state before analysis starts. \
-                  This option has been replaced by \
-                  -value-msg-key=[-]initial-state and has no effect anymore."
-    end)
-let () =
-  ValShowInitialState.add_set_hook
-    (fun _ new_ ->
-       if new_ then
-         Kernel.warning "@[Option -val-show-initial-state has no effect, \
-                         it has been replaced by -eva-msg-key=initial-state@]"
-       else
-         Kernel.warning "@[Option -no-val-show-initial-state has no effect, \
-                         it has been replaced by -eva-msg-key=-initial-state@]"
-    )
 
 let () = Parameter_customize.set_group messages
 module ValShowPerf =
   False
     (struct
       let option_name = "-eva-show-perf"
-      let help = "Compute and shows a summary of the time spent analyzing function calls"
+      let help = "Compute and show a summary of the time spent analyzing function calls"
     end)
-let () = ValShowPerf.add_aliases ["-val-show-perf"]
 
 let () = Parameter_customize.set_group messages
 module ValPerfFlamegraphs =
   String
     (struct
       let option_name = "-eva-flamegraph"
-      let help = "Dumps a summary of the time spent analyzing function calls \
+      let help = "Dump a summary of the time spent analyzing function calls \
                   in a format suitable for the Flamegraph tool \
                   (http://www.brendangregg.com/flamegraphs.html)"
       let arg_name = "file"
       let default = ""
     end)
-let () = ValPerfFlamegraphs.add_aliases ["-val-flamegraph"]
 
 
 let () = Parameter_customize.set_group messages
@@ -1237,7 +1079,6 @@ module ShowSlevel =
       let arg_name = "n"
       let help = "Period for showing consumption of the alloted slevel during analysis"
     end)
-let () = ShowSlevel.add_aliases ["-val-show-slevel"]
 let () = ShowSlevel.set_range ~min:1 ~max:max_int
 
 let () = Parameter_customize.set_group messages
@@ -1247,35 +1088,6 @@ module PrintCallstacks =
       let option_name = "-eva-print-callstacks"
       let help = "When printing a message, also show the current call stack"
     end)
-let () = PrintCallstacks.add_aliases ["-val-print-callstacks"]
-
-let () = Parameter_customize.set_group messages
-let () = Parameter_customize.is_invisible ()
-module AlarmsWarnings =
-  True
-    (struct
-      let option_name = "-val-warn-on-alarms"
-      let help = "[DEPRECATED: use warning key alarm to manage alarms] \
-                  if set (default), possible alarms are printed in \
-                  the analysis log as warnings, otherwise as plain feedback"
-    end)
-
-let () =
-  AlarmsWarnings.add_set_hook
-    (fun _ f ->
-       match get_warn_status wkey_alarm with
-       | Log.Wabort | Log.Werror | Log.Werror_once ->
-         warning "alarms already set to produce an error. \
-                  Ignoring -val-warn-on-alarms"
-       | Log.Winactive | Log.Wactive | Log.Wfeedback ->
-         set_warn_status wkey_alarm (if f then Log.Wactive else Log.Wfeedback)
-       | Log.Wonce | Log.Wfeedback_once ->
-         (* Keep the 'once' status. Note that this will only happen if user
-            is mixing old and new style of warning management, thus it becomes
-            difficult to interpret the desired action.
-         *)
-         set_warn_status wkey_alarm
-           (if f then Log.Wonce else Log.Wfeedback_once))
 
 let () = Parameter_customize.set_group messages
 module ReportRedStatuses =
@@ -1284,7 +1096,7 @@ module ReportRedStatuses =
       let option_name = "-eva-report-red-statuses"
       let arg_name = "filename"
       let default = ""
-      let help = "output the list of \"red properties\" in a csv file of the \
+      let help = "Output the list of \"red properties\" in a csv file of the \
                   given name. These are the properties which were invalid for \
                   some states. Their consolidated status may not be invalid, \
                   but they should often be investigated first."
@@ -1295,7 +1107,7 @@ module NumerorsLogFile =
   String
     (struct
       let option_name = "-eva-numerors-log-file"
-      let help = "The Numerors Domain will save each call to the DPRINT \
+      let help = "The Numerors domain will save each call to the DPRINT \
                   function in the given file"
       let arg_name = "file"
       let default = ""
@@ -1313,36 +1125,6 @@ module InterpreterMode =
       let help = "Stop at first call to a library function, if main() has \
                   arguments, on undecided branches"
     end)
-let () = InterpreterMode.add_aliases ["-val-interpreter-mode"]
-
-let () = Parameter_customize.set_group interpreter
-let () = Parameter_customize.is_invisible ()
-module ObviouslyTerminatesFunctions =
-  Fundec_set
-    (struct
-      let option_name = "-obviously-terminates-function"
-      let arg_name = "f"
-      let help = "deprecated"
-    end)
-let () = add_dep ObviouslyTerminatesFunctions.parameter
-let () = ObviouslyTerminatesFunctions.add_update_hook
-    (fun _ _ ->
-       warning "Option -obviously-terminates-function is no longer supported. \
-                Ignoring.")
-
-let () = Parameter_customize.set_group interpreter
-let () = Parameter_customize.is_invisible ()
-module ObviouslyTerminatesAll =
-  False
-    (struct
-      let option_name = "-obviously-terminates"
-      let help = "undocumented and deprecated"
-    end)
-let () = add_dep ObviouslyTerminatesAll.parameter
-let () = ObviouslyTerminatesAll.add_update_hook
-    (fun _ _ ->
-       warning "Option -obviously-terminates is no longer supported. \
-                Ignoring.")
 
 let () = Parameter_customize.set_group interpreter
 module StopAtNthAlarm =
@@ -1350,9 +1132,9 @@ module StopAtNthAlarm =
     let option_name = "-eva-stop-at-nth-alarm"
     let default = max_int
     let arg_name = "n"
-    let help = "Aborts the analysis when the nth alarm is emitted."
+    let help = "Abort the analysis when the nth alarm is emitted."
   end)
-let () = StopAtNthAlarm.add_aliases ["-val-stop-at-nth-alarm"]
+let () = StopAtNthAlarm.set_range 0 max_int
 
 (* -------------------------------------------------------------------------- *)
 (* --- Ugliness required for correctness                                  --- *)
@@ -1403,6 +1185,7 @@ module OracleDepth =
       let default = 2
       let arg_name = ""
     end)
+let () = OracleDepth.set_range 0 max_int
 let () = add_precision_dep OracleDepth.parameter
 
 let () = Parameter_customize.set_group precision_tuning
@@ -1415,6 +1198,7 @@ module ReductionDepth =
       let default = 4
       let arg_name = ""
     end)
+let () = ReductionDepth.set_range 0 max_int
 let () = add_precision_dep ReductionDepth.parameter
 
 
@@ -1447,7 +1231,7 @@ module AllocFunctions =
     (struct
       let option_name = "-eva-alloc-functions"
       let arg_name = "f1,...,fn"
-      let help = "Controls call site creation for dynamically allocated bases. \
+      let help = "Control call site creation for dynamically allocated bases. \
                   Dynamic allocation builtins use the call sites of \
                   malloc/calloc/realloc to know \
                   where to create new bases. This detection does not work for \
@@ -1456,7 +1240,6 @@ module AllocFunctions =
                   By default, contains malloc, calloc and realloc."
       let default = Datatype.String.Set.of_list ["malloc"; "calloc"; "realloc"]
     end)
-let () = AllocFunctions.add_aliases ["-val-malloc-functions"]
 let () = AllocFunctions.add_aliases ["-eva-malloc-functions"]
 
 let () = Parameter_customize.set_group malloc
@@ -1467,7 +1250,7 @@ module AllocReturnsNull=
       let help = "Memory allocation built-ins (malloc, calloc, realloc) are \
                   modeled as nondeterministically returning a null pointer"
     end)
-let () = AllocReturnsNull.add_aliases ["-val-alloc-returns-null"]
+let () = add_correctness_dep AllocReturnsNull.parameter
 
 let () = Parameter_customize.set_group malloc
 module MallocLevel =
@@ -1476,10 +1259,66 @@ module MallocLevel =
       let option_name = "-eva-mlevel"
       let default = 0
       let arg_name = "m"
-      let help = "sets to [m] the number of precise dynamic allocations \
+      let help = "Set to [m] the number of precise dynamic allocations \
                   besides the initial one, for each callstack (defaults to 0)"
     end)
-let () = MallocLevel.add_aliases ["-val-mlevel"]
+let () = MallocLevel.set_range 0 max_int
+let () = add_precision_dep MallocLevel.parameter
+
+(* -------------------------------------------------------------------------- *)
+(* --- Deprecated aliases                                                 --- *)
+(* -------------------------------------------------------------------------- *)
+
+let deprecated_aliases : ((module Parameter_sig.S) * string) list =
+  [ (module SemanticUnrollingLevel), "-slevel"
+  ; (module SlevelFunction), "-slevel-function"
+  ; (module NoResultsFunctions), "-no-results-function"
+  ; (module ResultsAll), "-results"
+  ; (module JoinResults), "-val-join-results"
+  ; (module AllRoundingModesConstants), "-all-rounding-modes-constants"
+  ; (module UndefinedPointerComparisonPropagateAll), "-undefined-pointer-comparison-propagate-all"
+  ; (module WarnPointerComparison), "-val-warn-undefined-pointer-comparison"
+  ; (module WarnSignedConvertedDowncast), "-val-warn-signed-converted-downcast"
+  ; (module WarnPointerSubstraction), "-val-warn-pointer-subtraction"
+  ; (module IgnoreRecursiveCalls), "-val-ignore-recursive-calls"
+  ; (module WarnCopyIndeterminate), "-val-warn-copy-indeterminate"
+  ; (module ReduceOnLogicAlarms), "-val-reduce-on-logic-alarms"
+  ; (module InitializedLocals), "-val-initialized-locals"
+  ; (module AutomaticContextMaxDepth), "-context-depth"
+  ; (module AutomaticContextMaxWidth), "-context-width"
+  ; (module AllocatedContextValid), "-context-valid-pointers"
+  ; (module InitializationPaddingGlobals), "-val-initialization-padding-globals"
+  ; (module WideningDelay), "-wlevel"
+  ; (module SlevelMergeAfterLoop), "-val-slevel-merge-after-loop"
+  ; (module SplitReturnFunction), "-val-split-return-function"
+  ; (module SplitReturn), "-val-split-return"
+  ; (module ILevel), "-val-ilevel"
+  ; (module BuiltinsOverrides), "-val-builtin"
+  ; (module BuiltinsAuto), "-val-builtins-auto"
+  ; (module BuiltinsList), "-val-builtins-list"
+  ; (module LinearLevel), "-val-subdivide-non-linear"
+  ; (module UsePrototype), "-val-use-spec"
+  ; (module SkipLibcSpecs), "-val-skip-stdlib-specs"
+  ; (module RmAssert), "-remove-redundant-alarms"
+  ; (module MemExecAll), "-memexec-all"
+  ; (module ArrayPrecisionLevel), "-plevel"
+  ; (module ValShowProgress), "-val-show-progress"
+  ; (module ValShowPerf), "-val-show-perf"
+  ; (module ValPerfFlamegraphs), "-val-flamegraph"
+  ; (module ShowSlevel), "-val-show-slevel"
+  ; (module PrintCallstacks), "-val-print-callstacks"
+  ; (module InterpreterMode), "-val-interpreter-mode"
+  ; (module StopAtNthAlarm), "-val-stop-at-nth-alarm"
+  ; (module AllocFunctions), "-val-malloc-functions"
+  ; (module AllocReturnsNull), "-val-alloc-returns-null"
+  ; (module MallocLevel), "-val-mlevel"
+  ]
+
+let add_deprecated_alias ((module P: Parameter_sig.S), name) =
+  P.add_aliases ~visible:false ~deprecated:true [name]
+
+let () = List.iter add_deprecated_alias deprecated_aliases
+
 
 (* -------------------------------------------------------------------------- *)
 (* --- Meta options                                                       --- *)
diff --git a/src/plugins/value/value_parameters.mli b/src/plugins/value/value_parameters.mli
index 495d7b1fa9a873b7736c2651944fe2a0f9843cf3..573e922bde59f3540e00a19d85516740c142acdd 100644
--- a/src/plugins/value/value_parameters.mli
+++ b/src/plugins/value/value_parameters.mli
@@ -76,7 +76,6 @@ module SemanticUnrollingLevel: Parameter_sig.Int
 module SlevelFunction:
   Parameter_sig.Map with type key = Cil_types.kernel_function
                      and type value = int
-
 module SlevelMergeAfterLoop: Parameter_sig.Kernel_function_set
 
 module MinLoopUnroll : Parameter_sig.Int
@@ -91,15 +90,6 @@ module ArrayPrecisionLevel: Parameter_sig.Int
 module AllocatedContextValid: Parameter_sig.Bool
 module InitializationPaddingGlobals: Parameter_sig.String
 
-module SaveFunctionState:
-  Parameter_sig.Map with type key = Cil_types.kernel_function
-                     and type value = string
-module LoadFunctionState:
-  Parameter_sig.Map with type key = Cil_types.kernel_function
-                     and type value = string
-val get_SaveFunctionState : unit -> Cil_types.kernel_function * string
-val get_LoadFunctionState : unit -> Cil_types.kernel_function * string
-
 module Numerors_Real_Size : Parameter_sig.Int
 module Numerors_Mode : Parameter_sig.String
 
@@ -131,12 +121,10 @@ module SplitReturnFunction:
 module SplitGlobalStrategy: State_builder.Ref with type data = Split_strategy.t
 
 module ValShowProgress: Parameter_sig.Bool
-module ValShowInitialState: Parameter_sig.Bool
 module ValShowPerf: Parameter_sig.Bool
 module ValPerfFlamegraphs: Parameter_sig.String
 module ShowSlevel: Parameter_sig.Int
 module PrintCallstacks: Parameter_sig.Bool
-module AlarmsWarnings: Parameter_sig.Bool
 module ReportRedStatuses: Parameter_sig.String
 module NumerorsLogFile: Parameter_sig.String
 
diff --git a/src/plugins/value/values/cvalue_backward.ml b/src/plugins/value/values/cvalue_backward.ml
index c836d2a9c76353e6af712aaa01089db36d0b0a1e..e97975c050f33847eb9ab812b7681dd24ab44e3f 100644
--- a/src/plugins/value/values/cvalue_backward.ml
+++ b/src/plugins/value/values/cvalue_backward.ml
@@ -339,7 +339,7 @@ let downcast_enabled ~ik_src ~ik_dst =
   if Cil.isSigned ik_dst
   then
     Kernel.SignedDowncast.get () ||
-    (* In this case, -val-warn-signed-converted-downcast behaves exactly
+    (* In this case, -eva-warn-signed-converted-downcast behaves exactly
        as -warn-signed-downcast *)
     (Cil.isSigned ik_src && Value_parameters.WarnSignedConvertedDowncast.get ())
   else Kernel.UnsignedDowncast.get ()
diff --git a/src/plugins/variadic/tests/defined/multiple-va_start.c b/src/plugins/variadic/tests/defined/multiple-va_start.c
index f10b950af4c838805aba204a01e12bd156170ff5..9a3ff2627482f4dafd5936536c0cca47f9c85bf0 100644
--- a/src/plugins/variadic/tests/defined/multiple-va_start.c
+++ b/src/plugins/variadic/tests/defined/multiple-va_start.c
@@ -1,5 +1,5 @@
 /* run.config
-STDOPT: +"-no-val-alloc-returns-null"
+STDOPT: +"-eva-no-alloc-returns-null"
 */
 
 
diff --git a/src/plugins/variadic/tests/defined/va_copy.c b/src/plugins/variadic/tests/defined/va_copy.c
index 3ad479a98de2c3ca4ad8c618d41f9c81fd0ac54f..129708fa9f349eddef4af0f3f4c241ea17a7987a 100644
--- a/src/plugins/variadic/tests/defined/va_copy.c
+++ b/src/plugins/variadic/tests/defined/va_copy.c
@@ -1,5 +1,5 @@
 /* run.config
-STDOPT: +"-no-val-alloc-returns-null"
+STDOPT: +"-eva-no-alloc-returns-null"
 */
 
 
diff --git a/src/plugins/variadic/tests/erroneous/oracle/variadic-builtin.res.oracle b/src/plugins/variadic/tests/erroneous/oracle/variadic-builtin.res.oracle
index 30f7e2cf18c5d3543616fe729f4c0856b7693785..7af1312eace35e3f68a49d3479fb7a3dcdcb9083 100644
--- a/src/plugins/variadic/tests/erroneous/oracle/variadic-builtin.res.oracle
+++ b/src/plugins/variadic/tests/erroneous/oracle/variadic-builtin.res.oracle
@@ -1,5 +1,5 @@
 [variadic] tests/erroneous/variadic-builtin.i:1: 
   Variadic builtin Frama_C_show_each_warning left untransformed.
 [kernel] Plug-in variadic aborted: unimplemented feature.
-  You may send a feature request at http://bts.frama-c.com with:
+  You may send a feature request at https://git.frama-c.com/pub/frama-c/issues with:
   '[Plug-in variadic] The variadic plugin doesn't handle calls to a pointer to the variadic builtin Frama_C_show_each_warning.'.
diff --git a/src/plugins/variadic/tests/test_config b/src/plugins/variadic/tests/test_config
index 9d83090791bf7d3f4f62b2e69990d30fefd28fc8..e076935b23463006f8f89ffcddb93f7f2748c691 100644
--- a/src/plugins/variadic/tests/test_config
+++ b/src/plugins/variadic/tests/test_config
@@ -1 +1 @@
-OPT: -no-autoload-plugins -load-module from,inout,eva,variadic,scope -check -print -kernel-verbose 0 -variadic-verbose 2 -eva -slevel 10 -eva-msg-key=-initial-state,-summary -eva-no-show-progress -eva-print
+OPT: -no-autoload-plugins -load-module from,inout,eva,variadic,scope -check -print -kernel-verbose 0 -variadic-verbose 2 -eva -eva-slevel 10 -eva-msg-key=-initial-state,-summary -eva-no-show-progress -eva-print
diff --git a/src/plugins/wp/Cache.ml b/src/plugins/wp/Cache.ml
index 0a892c66dd7423550ebe6967246874150a15fa73..2c111031395120f66f190312264a58f8ae6139c7 100644
--- a/src/plugins/wp/Cache.ml
+++ b/src/plugins/wp/Cache.ml
@@ -136,21 +136,10 @@ module MODE = WpContext.StaticGenerator(Datatype.Unit)
 let get_mode = MODE.get
 let set_mode m = MODE.clear () ; Wp_parameters.Cache.set (mode_name m)
 
-let task_hash wpo drv prover task =
-  lazy
-    begin
-      let file = Wpo.DISK.file_goal
-          ~pid:wpo.Wpo.po_pid
-          ~model:wpo.Wpo.po_model
-          ~prover:(VCS.Why3 prover) in
-      let _ = Command.print_file file
-          begin fun fmt ->
-            Format.fprintf fmt "(* WP Task for Prover %s *)@\n"
-              (Why3Provers.print_why3 prover) ;
-            Why3.Driver.print_task_prepared drv fmt task ;
-          end
-      in Digest.file file |> Digest.to_hex
-    end
+let is_updating () =
+  match MODE.get () with
+  | NoCache | Replay | Offline -> false
+  | Update | Rebuild | Cleanup -> true
 
 let time_fits time = function
   | None | Some 0 -> true
@@ -251,23 +240,24 @@ let cleanup_cache () =
         Wp_parameters.warning ~current:false
           "Cannot cleanup cache"
 
-type runner =
-  timeout:int option -> steplimit:int option ->
-  Why3.Driver.driver -> Why3Provers.t -> Why3.Task.task ->
+type 'a digest =
+  Why3Provers.t -> 'a -> string
+
+type 'a runner =
+  timeout:int option -> steplimit:int option -> Why3Provers.t -> 'a ->
   VCS.result Task.task
 
-let get_result wpo runner ~timeout ~steplimit drv prover task =
+let get_result ~digest ~runner ~timeout ~steplimit prover goal =
   let mode = get_mode () in
   match mode with
-  | NoCache ->
-      runner ~timeout ~steplimit drv prover task
+  | NoCache -> runner ~timeout ~steplimit prover goal
   | Offline ->
-      let hash = task_hash wpo drv prover task in
+      let hash = lazy (digest prover goal) in
       let result = get_cache_result ~mode hash |> VCS.cached in
       if VCS.is_verdict result then incr hits else incr miss ;
       Task.return result
   | Update | Replay | Rebuild | Cleanup ->
-      let hash = task_hash wpo drv prover task in
+      let hash = lazy (digest prover goal) in
       let result =
         get_cache_result ~mode hash
         |> promote ~timeout ~steplimit |> VCS.cached in
@@ -279,10 +269,12 @@ let get_result wpo runner ~timeout ~steplimit drv prover task =
         end
       else
         Task.finally
-          (runner ~timeout ~steplimit drv prover task)
+          (runner ~timeout ~steplimit prover goal)
           begin function
             | Task.Result result when VCS.is_verdict result ->
                 incr miss ;
                 set_cache_result ~mode hash prover result
             | _ -> ()
           end
+
+(* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/Cache.mli b/src/plugins/wp/Cache.mli
index 39af510514147e3d227b1a69b7b02ca38789e2b9..7197a8dc22207aa1aec096a1a61735d3e43b4bc8 100644
--- a/src/plugins/wp/Cache.mli
+++ b/src/plugins/wp/Cache.mli
@@ -30,11 +30,16 @@ val get_hits : unit -> int
 val get_miss : unit -> int
 val get_removed : unit -> int
 
+val is_updating : unit -> bool
+
 val cleanup_cache : unit -> unit
 
-type runner =
-  timeout:int option -> steplimit:int option ->
-  Why3.Driver.driver -> Why3Provers.t -> Why3.Task.task ->
+type 'a digest = Why3Provers.t -> 'a -> string
+
+type 'a runner =
+  timeout:int option -> steplimit:int option -> Why3Provers.t -> 'a ->
   VCS.result Task.task
 
-val get_result: Wpo.t -> runner -> runner
+val get_result: digest:('a digest) -> runner:('a runner) -> 'a runner
+
+(**************************************************************************)
diff --git a/src/plugins/wp/Changelog b/src/plugins/wp/Changelog
index 7f362c7148689ecbbdda1696585c2a3fd53b0e65..51c3938458848eda30cd366caa3eb5ef6a144261 100644
--- a/src/plugins/wp/Changelog
+++ b/src/plugins/wp/Changelog
@@ -24,6 +24,13 @@
 Plugin WP <next-release>
 #########################
 
+- WP          [2020-09-21] Added support for Why3 Coq interactive prover
+- WP          [2020-09-21] New option -wp-interactive <mode>
+- WP          [2020-09-21] New option -wp-interactive-timeout <seconds>
+- WP          [2020-09-17] New experimental option: -wp-check-model-hypotheses
+                           Generates requires in contracts for model hypotheses
+- WP          [2020-09-17] Hypotheses: assigned memory locations
+- WP          [2020-09-11] Support for generalized @check ACSL annotations
 - WP          [2020-07-06] Removed debug keys "no-xxx-info" (subsumed by "shell")
 - WP          [2020-07-06] Option -wp-cache-env now defaults to false
 - WP          [2020-07-06] New option -wp-cache-print
diff --git a/src/plugins/wp/Cstring.ml b/src/plugins/wp/Cstring.ml
index d5d2ceb8a4cfb3a0ac8dde152e2d289baec2a90c..47574ee58370f4c26c1de04f4ff2dccd581f2e3d 100644
--- a/src/plugins/wp/Cstring.ml
+++ b/src/plugins/wp/Cstring.ml
@@ -76,7 +76,7 @@ module LIT = WpContext.Generator(STR)
         define_lemma {
           l_name = prefix ^ "_literal" ;
           l_cluster = cluster () ;
-          l_assumed = true ;
+          l_kind = `Axiom ;
           l_types = 0 ;
           l_forall = [] ;
           l_triggers = [] ;
diff --git a/src/plugins/wp/Definitions.ml b/src/plugins/wp/Definitions.ml
index 6a5c7ee962d1fb992777297437fd9690e6236c05..ce9733e12df81c3a6107935f569cd168bb746d98 100644
--- a/src/plugins/wp/Definitions.ml
+++ b/src/plugins/wp/Definitions.ml
@@ -54,7 +54,7 @@ type cluster = {
 and dlemma = {
   l_name  : string ;
   l_cluster : cluster ;
-  l_assumed : bool ;
+  l_kind : lkind ;
   l_types : int ;
   l_forall : var list ;
   l_triggers : trigger list list (* OR of AND triggers *) ;
diff --git a/src/plugins/wp/Definitions.mli b/src/plugins/wp/Definitions.mli
index 20beeda15d92f1f238c00c73806dc1c5d4117846..dde165a97268e1ba874ec4097c50e6863f1e8a3c 100644
--- a/src/plugins/wp/Definitions.mli
+++ b/src/plugins/wp/Definitions.mli
@@ -49,7 +49,7 @@ type typedef = (tau,field,lfun) Qed.Engine.ftypedef
 type dlemma = {
   l_name  : string ;
   l_cluster : cluster ;
-  l_assumed : bool ;
+  l_kind : lkind ;
   l_types : int ;
   l_forall : var list ;
   l_triggers : trigger list list ; (** OR of AND-triggers *)
diff --git a/src/plugins/wp/Factory.ml b/src/plugins/wp/Factory.ml
index f6a1a01a5d9e183c1405b213830f25f60c9d4c80..8fea80af863b6d2c7203f5b57d4e5937d3167322 100644
--- a/src/plugins/wp/Factory.ml
+++ b/src/plugins/wp/Factory.ml
@@ -129,13 +129,7 @@ struct
     if S.mem x.vname (get_vars ()) then ByValue else
       V.param x
 
-  let hypotheses () =
-    let kf,init = match WpContext.get_scope () with
-      | WpContext.Global -> None,false
-      | WpContext.Kf f -> Some f, WpStrategy.is_main_init f in
-    let w = ref MemoryContext.empty in
-    V.iter ?kf ~init (fun vi -> w := MemoryContext.set vi (param vi) !w) ;
-    MemoryContext.requires !w
+  let iter = V.iter
 
 end
 
diff --git a/src/plugins/wp/Lang.ml b/src/plugins/wp/Lang.ml
index 43f7709a6ac2a16f7bc8a6fb93d99c01970566d4..2c3dbf5058832c3cca154dcd2b5c66e52e9667b6 100644
--- a/src/plugins/wp/Lang.ml
+++ b/src/plugins/wp/Lang.ml
@@ -726,6 +726,14 @@ struct
   end
   include QED
 
+  (* Hide force parameter. *)
+  let set_builtin f = QZERO.set_builtin f
+  let set_builtin' f = QZERO.set_builtin' f
+  let set_builtin_eq f = QZERO.set_builtin_eq f
+  let set_builtin_leq f = QZERO.set_builtin_leq f
+  let set_builtin_get f = QZERO.set_builtin_get f
+
+
   (* -------------------------------------------------------------------------- *)
   (* --- Term Extensions                                                    --- *)
   (* -------------------------------------------------------------------------- *)
@@ -1042,14 +1050,14 @@ module For_export = struct
   let rebuild ?cache t = QZERO.rebuild_in_state (get_state ()) ?cache t
 
   let set_builtin f c =
-    add_init (fun () -> QZERO.set_builtin f c)
+    add_init (fun () -> QZERO.set_builtin ~force:true f c)
 
   let set_builtin' f c =
-    add_init (fun () -> QZERO.set_builtin' f c)
+    add_init (fun () -> QZERO.set_builtin' ~force:true f c)
   let set_builtin_eq f c =
-    add_init (fun () -> QZERO.set_builtin_eq f c)
+    add_init (fun () -> QZERO.set_builtin_eq ~force:true f c)
   let set_builtin_leq f c =
-    add_init (fun () -> QZERO.set_builtin_leq f c)
+    add_init (fun () -> QZERO.set_builtin_leq ~force:true f c)
 
   let in_state f v = QZERO.in_state (get_state ()) f v
 
diff --git a/src/plugins/wp/LogicCompiler.ml b/src/plugins/wp/LogicCompiler.ml
index 8c88a3af10b1598c786be81e67386363fd551c2a..3227e86dea2f097ef0b1922852f5faab18a5eb43 100644
--- a/src/plugins/wp/LogicCompiler.ml
+++ b/src/plugins/wp/LogicCompiler.ml
@@ -258,6 +258,10 @@ struct
       types = [];
     }
 
+  let has_at_frame frame label =
+    assert (not (Clabels.is_here label));
+    LabelMap.mem label frame.labels
+
   let mem_at_frame frame label =
     assert (not (Clabels.is_here label));
     try LabelMap.find label frame.labels
@@ -498,7 +502,7 @@ struct
     | Pforall(qs,q) -> strip_forall (xs @ qs) q
     | _ -> xs , p
 
-  let compile_lemma cluster name ~assumed types labels lemma =
+  let compile_lemma cluster name ~kind types labels lemma =
     let qs,prop = strip_forall [] lemma in
     let xs,tgs,domain,prop,_ =
       let cc_pred = pred `Positive in
@@ -508,7 +512,7 @@ struct
     {
       l_name = name ;
       l_types = List.length types ;
-      l_assumed = assumed ;
+      l_kind = kind ;
       l_triggers = [tgs] ;
       l_forall = xs ;
       l_cluster = cluster ;
@@ -539,7 +543,7 @@ struct
             let trigger = Trigger.of_term result in
             Definitions.define_lemma {
               l_name = name ;
-              l_assumed = true ;
+              l_kind = `Axiom ;
               l_types = ldef.d_types ;
               l_forall = ldef.d_params ;
               l_triggers = [[trigger]] ;
@@ -721,7 +725,7 @@ struct
     (* Re-compile final cases *)
     let cases = List.map
         (fun (case,labels,types,lemma) ->
-           compile_lemma cluster ~assumed:true case types labels lemma)
+           compile_lemma cluster ~kind:`Axiom case types labels lemma)
         cases in
     Definitions.update_symbol { ldef with d_definition = Inductive cases } ;
     type_for_signature l ldef sigp (* sufficient *) ; SIG sigm
@@ -770,7 +774,7 @@ struct
                     {
                       l_name ;
                       l_types = 0 ;
-                      l_assumed = true ;
+                      l_kind = `Axiom ;
                       l_triggers = [frame.triggers] ;
                       l_forall = vs ;
                       l_cluster = cluster ;
@@ -802,7 +806,7 @@ struct
         "Lemma '%s' has labels, consider using global invariant instead."
         l.lem_name ;
     Definitions.define_lemma
-      (compile_lemma c ~assumed:l.lem_axiom
+      (compile_lemma c ~kind:l.lem_kind
          l.lem_name l.lem_types l.lem_labels l.lem_property)
 
   let define_axiomatic cluster ax =
diff --git a/src/plugins/wp/LogicCompiler.mli b/src/plugins/wp/LogicCompiler.mli
index eece42b069e53292e7326edb822b5f4db55e491d..9a4352ba05bde4383eb022ef259cc19f452200b9 100644
--- a/src/plugins/wp/LogicCompiler.mli
+++ b/src/plugins/wp/LogicCompiler.mli
@@ -76,6 +76,7 @@ sig
 
   val guards : frame -> pred list
   val mem_frame : c_label -> sigma
+  val has_at_frame : frame -> c_label -> bool
   val mem_at_frame : frame -> c_label -> sigma
   val set_at_frame : frame -> c_label -> sigma -> unit
 
diff --git a/src/plugins/wp/LogicSemantics.ml b/src/plugins/wp/LogicSemantics.ml
index a6593bfd5537f3e31fae250c15335bb4713eed4d..47cbf26bed3d5f118d17114336ac8f80ad6721ef 100644
--- a/src/plugins/wp/LogicSemantics.ml
+++ b/src/plugins/wp/LogicSemantics.ml
@@ -63,6 +63,7 @@ struct
   let mk_frame = C.mk_frame
   let in_frame = C.in_frame
   let mem_frame = C.mem_frame
+  let has_at_frame = C.has_at_frame
   let mem_at_frame = C.mem_at_frame
   let set_at_frame = C.set_at_frame
   let mem_at = C.mem_at
diff --git a/src/plugins/wp/LogicUsage.ml b/src/plugins/wp/LogicUsage.ml
index 953d1c9b92b14b94f18577e6653c22df5c06e345..f3ea81418d8d4e96e37af30accd2da4064bfd0ea 100644
--- a/src/plugins/wp/LogicUsage.ml
+++ b/src/plugins/wp/LogicUsage.ml
@@ -57,10 +57,12 @@ let trim name =
 (* --- Definition Blocks                                                  --- *)
 (* -------------------------------------------------------------------------- *)
 
+type lkind = [ `Axiom | `Check | `Lemma ]
+
 type logic_lemma = {
   lem_name : string ;
+  lem_kind : lkind ;
   lem_position : Filepath.position ;
-  lem_axiom : bool ;
   lem_types : string list ;
   lem_labels : logic_label list ;
   lem_property : predicate ;
@@ -192,27 +194,36 @@ let pp_profile fmt l =
 
 let ip_lemma l =
   let open Property in
-  (if l.lem_axiom then Property.ip_axiom else Property.ip_lemma)
+  let mk_prop, only_check =
+    match l.lem_kind with
+    | `Axiom -> Property.ip_axiom, false
+    | `Lemma -> Property.ip_lemma, false
+    | `Check -> Property.ip_lemma, true
+  in
+  mk_prop
     {il_name = l.lem_name; il_labels = l.lem_labels;
      il_args = l.lem_types; il_loc = (l.lem_position, l.lem_position);
-     il_pred = l.lem_property}
-
-let lemma_of_global proof = function
-  | Dlemma(name,axiom,labels,types,pred,_,loc) -> {
-      lem_name = name ;
-      lem_position = fst loc ;
-      lem_types = types ;
-      lem_labels = labels ;
-      lem_axiom = axiom ;
-      lem_property = pred ;
-      lem_depends = proof ;
-    }
+     il_pred = Logic_const.toplevel_predicate ~only_check l.lem_property}
+
+let lemma_of_global ~context = function
+  | Dlemma(name,axiom,labels,types,pred,_,loc) ->
+      let kind = if axiom then `Axiom else
+        if pred.tp_only_check then `Check else `Lemma in
+      {
+        lem_name = name ;
+        lem_position = fst loc ;
+        lem_types = types ;
+        lem_labels = labels ;
+        lem_kind = kind ;
+        lem_property = pred.tp_statement ;
+        lem_depends = context ;
+      }
   | _ -> assert false
 
-let populate a proof = function
+let populate a ~context = function
   | Dfun_or_pred(l,_) -> a.ax_logics <- l :: a.ax_logics
   | Dtype(t,_) -> a.ax_types <- t :: a.ax_types
-  | Dlemma _ as g -> a.ax_lemmas <- lemma_of_global proof g :: a.ax_lemmas
+  | Dlemma _ as g -> a.ax_lemmas <- lemma_of_global ~context g :: a.ax_lemmas
   | _ -> ()
 
 let ip_of_axiomatic g =
@@ -220,7 +231,7 @@ let ip_of_axiomatic g =
   | None -> assert false
   | Some ip -> ip
 
-let axiomatic_of_global proof = function
+let axiomatic_of_global ~context = function
   | Daxiomatic(name,globals,_,loc) as g ->
       let a = {
         ax_name = name ;
@@ -229,7 +240,7 @@ let axiomatic_of_global proof = function
         ax_reads = Varinfo.Set.empty ;
         ax_types = [] ; ax_lemmas = [] ; ax_logics = [] ;
       } in
-      List.iter (populate a proof) globals ;
+      List.iter (populate a ~context) globals ;
       a.ax_types <- List.rev a.ax_types ;
       a.ax_logics <- List.rev a.ax_logics ;
       a.ax_lemmas <- List.rev a.ax_lemmas ;
@@ -402,7 +413,8 @@ class visitor =
       | Dlemma _ ->
           let lem = lemma_of_global database.proofcontext global in
           register_lemma database self#section lem ;
-          database.proofcontext <- lem :: database.proofcontext ;
+          if lem.lem_kind <> `Check then
+            database.proofcontext <- lem :: database.proofcontext ;
           SkipChildren
 
       | Dtype(t,_) ->
@@ -489,6 +501,11 @@ let iter_lemmas f =
   let d = Database.get () in
   SMap.iter (fun _name (lem,_) -> f lem) d.lemmas
 
+let fold_lemmas f =
+  compute () ;
+  let d = Database.get () in
+  SMap.fold (fun _name (lem,_) -> f lem) d.lemmas
+
 let logic_lemma l = fst (get_lemma l)
 
 let section_of_lemma l = snd (get_lemma l)
@@ -502,9 +519,9 @@ let proof_context () =
 (* --- Dump API                                                           --- *)
 (* -------------------------------------------------------------------------- *)
 
-let dump_type fmt t = Format.fprintf fmt " * type '%s'@\n" t.lt_name
+let pp_type fmt t = Format.fprintf fmt " * type '%s'@\n" t.lt_name
 
-let dump_profile fmt kind l =
+let pp_sig fmt kind l =
   begin
     Format.fprintf fmt " * %s '%s'@\n" kind (compute_logicname l) ;
     if is_overloaded l then
@@ -513,11 +530,11 @@ let dump_profile fmt kind l =
       Format.fprintf fmt "   recursive@\n" ;
   end
 
-let dump_logic fmt d l =
+let pp_decl fmt d l =
   begin
     try
       let cases = LMap.find l d.cases in
-      dump_profile fmt "inductive" l ;
+      pp_sig fmt "inductive" l ;
       List.iter
         (fun ind ->
            Format.fprintf fmt "   @[case %s:" ind.ind_case ;
@@ -532,14 +549,16 @@ let dump_logic fmt d l =
         ) cases ;
     with Not_found ->
       let kind = if l.l_type = None then "predicate" else "function" in
-      dump_profile fmt kind l ;
+      pp_sig fmt kind l ;
   end
 
-let dump_lemma fmt l =
-  if l.lem_axiom then
-    Format.fprintf fmt " * axiom '%s'@\n" l.lem_name
-  else
-    Format.fprintf fmt " * lemma '%s'@\n" l.lem_name
+let pp_kind fmt = function
+  | `Axiom -> Format.pp_print_string fmt "axiom"
+  | `Lemma -> Format.pp_print_string fmt "lemma"
+  | `Check -> Format.pp_print_string fmt "check lemma"
+
+let pp_lemma fmt l =
+  Format.fprintf fmt " * %a '%s'@\n" pp_kind l.lem_kind l.lem_name
 
 let get_name l = compute () ; compute_logicname l
 
@@ -556,9 +575,9 @@ let dump () =
       SMap.iter
         (fun _ a ->
            Format.fprintf fmt "Axiomatic %s {@\n" a.ax_name ;
-           List.iter (dump_type fmt) a.ax_types ;
-           List.iter (dump_logic fmt d) a.ax_logics ;
-           List.iter (dump_lemma fmt) a.ax_lemmas ;
+           List.iter (pp_type fmt) a.ax_types ;
+           List.iter (pp_decl fmt d) a.ax_logics ;
+           List.iter (pp_lemma fmt) a.ax_lemmas ;
            Format.fprintf fmt "}@\n"
         ) d.axiomatics ;
       TMap.iter
@@ -573,8 +592,8 @@ let dump () =
         d.logics ;
       SMap.iter
         (fun l (lem,s) ->
-           Format.fprintf fmt " * %s '%s' in %a@\n"
-             (if lem.lem_axiom then "axiom" else "lemma")
+           Format.fprintf fmt " * %a '%s' in %a@\n"
+             pp_kind lem.lem_kind
              l pp_section s)
         d.lemmas ;
       Format.fprintf fmt "-------------------------------------------------@." ;
diff --git a/src/plugins/wp/LogicUsage.mli b/src/plugins/wp/LogicUsage.mli
index 4ae195a680c70fe9ffa329b0c725dd105417f90d..ef9e2cb0360979e65cefe994813b4f13f38cd900 100644
--- a/src/plugins/wp/LogicUsage.mli
+++ b/src/plugins/wp/LogicUsage.mli
@@ -30,10 +30,12 @@ open Clabels
 
 val basename : varinfo -> string (** Trims the original name *)
 
+type lkind = [ `Axiom | `Check | `Lemma ]
+
 type logic_lemma = {
   lem_name : string ;
+  lem_kind : lkind ;
   lem_position : Filepath.position ;
-  lem_axiom : bool ;
   lem_types : string list ;
   lem_labels : logic_label list ;
   lem_property : predicate ;
@@ -58,6 +60,7 @@ val compute : unit -> unit (** To force computation *)
 
 val ip_lemma : logic_lemma -> Property.t
 val iter_lemmas : (logic_lemma -> unit) -> unit
+val fold_lemmas : (logic_lemma -> 'a -> 'a) -> 'a -> 'a
 val logic_lemma : string -> logic_lemma
 val axiomatic : string -> axiomatic
 val section_of_lemma : string -> logic_section
diff --git a/src/plugins/wp/Makefile.in b/src/plugins/wp/Makefile.in
index dc8b2c99ecea03e5415df621ca826a3db8c40aeb..2ab8ab0e65898a650b80a0e9f5b4db42800298ba 100644
--- a/src/plugins/wp/Makefile.in
+++ b/src/plugins/wp/Makefile.in
@@ -67,7 +67,7 @@ PLUGIN_CMO:= \
 	LogicUsage RefUsage \
 	Layout Region \
 	RegionAnnot RegionAccess RegionDump RegionAnalysis \
-	cil2cfg normAtLabels wpPropId mcfg \
+	cil2cfg normAtLabels wpPropId wpStrategy mcfg \
 	Lang Repr Matrix Passive Splitter \
 	LogicBuiltins Definitions \
 	Cmath Cint Cfloat Vset Vlist Cstring Cvalues \
@@ -81,7 +81,7 @@ PLUGIN_CMO:= \
 	Sigma MemLoader \
 	MemEmpty MemZeroAlias MemVar \
 	MemMemory MemTyped MemRegion \
-	wpReached wpStrategy wpRTE wpAnnot \
+	wpReached wpRTE wpAnnot \
 	CfgCompiler StmtSemantics \
 	VCS script proof wpo wpReport \
 	Footprint Tactical Strategy \
diff --git a/src/plugins/wp/MemEmpty.ml b/src/plugins/wp/MemEmpty.ml
index 5435ab551b6dbc7d0894ec12734805e1902134ba..837d3f28f39ba069e34cc8093e574fb97cedc744 100644
--- a/src/plugins/wp/MemEmpty.ml
+++ b/src/plugins/wp/MemEmpty.ml
@@ -43,7 +43,7 @@ let configure () =
 let no_binder = { bind = fun _ f v -> f v }
 let configure_ia _ = no_binder
 
-let hypotheses () = []
+let hypotheses p = p
 
 module Chunk =
 struct
diff --git a/src/plugins/wp/MemLoader.ml b/src/plugins/wp/MemLoader.ml
index 33815ea85957317b24de5f143b300f918bb56049..b1abfb6af8f8d565f167aa4674e9632c2423a3eb 100644
--- a/src/plugins/wp/MemLoader.ml
+++ b/src/plugins/wp/MemLoader.ml
@@ -155,7 +155,7 @@ struct
                     prefix name Chunk.pretty chunk i in
                 let l_lemma = F.p_hyps conditions (p_equal value1 value2) in
                 Definitions.define_lemma {
-                  l_assumed = true ;
+                  l_kind = `Axiom ;
                   l_name ; l_types = 0 ;
                   l_triggers ;
                   l_forall = F.p_vars l_lemma ;
@@ -245,7 +245,7 @@ struct
               pp_rid r (Matrix.id ds) (Matrix.natural_id obj_e)
           in
           let prefix = Lang.Fun.debug lfun in
-          let axiom = prefix ^ "_access" in
+          let name = prefix ^ "_access" in
           let xmem,chunks,sigma = signature domain in
           let denv = Matrix.denv ds in
           let phi = e_fun lfun (v :: denv.size_val @ List.map e_var xmem) in
@@ -261,8 +261,8 @@ struct
             d_cluster = cluster ;
           } ;
           Definitions.define_lemma {
-            l_assumed = true ;
-            l_name = axiom ; l_types = 0 ;
+            l_kind = `Axiom ;
+            l_name = name ; l_types = 0 ;
             l_forall = F.p_vars lemma ;
             l_triggers = [[Trigger.of_term va]] ;
             l_lemma = lemma ;
@@ -323,7 +323,7 @@ struct
     let low = M.is_init_range sigma obj loc e_one in
     let lemma = p_equiv high low in
     {
-      l_assumed = true ;
+      l_kind = `Axiom ;
       l_name = name ^ "_low" ; l_types = 0 ;
       l_forall = F.p_vars lemma ;
       l_triggers = [] ;
diff --git a/src/plugins/wp/MemMemory.ml b/src/plugins/wp/MemMemory.ml
index 2baa223b6366fcca469dea4f3d0129a574c20c40..c0f4455e346f80cef268f23714e327dd9427e8d3 100644
--- a/src/plugins/wp/MemMemory.ml
+++ b/src/plugins/wp/MemMemory.ml
@@ -47,8 +47,14 @@ let f_shift  = Lang.extern_f ~library ~result:t_addr "shift"
 let f_global = Lang.extern_f ~library ~result:t_addr ~category:L.Injection "global"
 let f_null   = Lang.extern_f ~library ~result:t_addr "null"
 
-let f_base_offset = Lang.extern_f ~library
-    ~category:Qed.Logic.Injection ~result:L.Int "base_offset"
+let a_table = Lang.datatype ~library "table"
+let t_table = L.Data(a_table,[])
+
+let f_table_of_base = Lang.extern_f ~library
+    ~category:Qed.Logic.Function ~result:t_table "table_of_base"
+
+let f_table_to_offset = Lang.extern_f ~library
+    ~category:Qed.Logic.Injection ~result:L.Int "table_to_offset"
 
 let ty_fst_arg = function
   | Some l :: _ -> l
@@ -108,7 +114,9 @@ let a_offset p = e_fun f_offset [p]
 let a_global b = e_fun f_global [b]
 let a_shift l k = e_fun f_shift [l;k]
 let a_addr b k = a_shift (a_global b) k
-let a_base_offset k = e_fun f_base_offset [k]
+let a_base_offset b k =
+  let offset_index = e_fun f_table_of_base [b] in
+  e_fun f_table_to_offset [offset_index ; k]
 
 (* -------------------------------------------------------------------------- *)
 (* --- Qed Simplifiers                                                    --- *)
diff --git a/src/plugins/wp/MemMemory.mli b/src/plugins/wp/MemMemory.mli
index bd50be0f171804eabafe3be575363d6f4e5d1435..1a90054368b97235e381f1964d9d1ac81b24980a 100644
--- a/src/plugins/wp/MemMemory.mli
+++ b/src/plugins/wp/MemMemory.mli
@@ -40,7 +40,7 @@ val a_addr : term -> term -> term (** Constructor for [{ base ; offset }] *)
 val a_shift : term -> term -> term (** Shift: [a_shift a k] adds [k] to [a.offset] *)
 val a_base : term -> term (** Returns the base *)
 val a_offset : term -> term (** Returns the offset *)
-val a_base_offset : term -> term
+val a_base_offset : term -> term -> term
 (** Returns the offset in {i bytes} from the {i logic} offset
     (which is a memory cell index, actually) *)
 
diff --git a/src/plugins/wp/MemRegion.ml b/src/plugins/wp/MemRegion.ml
index 3723ce4232264c2faccafea2a67ae8216a808eab..eabf76e10906d2d1e513d1506aacc32776cd1727 100644
--- a/src/plugins/wp/MemRegion.ml
+++ b/src/plugins/wp/MemRegion.ml
@@ -193,14 +193,14 @@ let constructor ~basename ~params ~index ~addrof ~consistent =
       } ;
       Definitions.define_lemma {
         l_cluster = cluster ;
-        l_assumed = true ;
+        l_kind = `Axiom ;
         l_name = Printf.sprintf "addrof_%s_%d" basename id ;
         l_forall = params ; l_types = 0 ; l_triggers = [] ;
         l_lemma = p_addrof ;
       } ;
       Definitions.define_lemma {
         l_cluster = cluster ;
-        l_assumed = true ;
+        l_kind = `Axiom ;
         l_name = Printf.sprintf "consistent_%s_%d" basename id ;
         l_forall = params ; l_types = 0 ; l_triggers = [] ;
         l_lemma = p_consistent ;
@@ -208,7 +208,7 @@ let constructor ~basename ~params ~index ~addrof ~consistent =
       if p_index != F.p_true then
         Definitions.define_lemma {
           l_cluster = cluster ;
-          l_assumed = true ;
+          l_kind = `Axiom ;
           l_name = Printf.sprintf "index_%s_%d" basename id ;
           l_forall = params @ [k] ; l_types = 0 ; l_triggers = [] ;
           l_lemma = p_index ;
@@ -441,7 +441,7 @@ let configure_ia =
   let no_binder = { bind = fun _ f v -> f v } in
   fun _vertex -> no_binder
 
-let hypotheses () = []
+let hypotheses p = p
 
 let error msg = Warning.error ~source:"Region Model" msg
 
diff --git a/src/plugins/wp/MemTyped.ml b/src/plugins/wp/MemTyped.ml
index 6743fc7a086ad6307be7534c6fe25eeff69917dd..b885cd1e214cbe39054649bf0aee6a2974d2116f 100644
--- a/src/plugins/wp/MemTyped.ml
+++ b/src/plugins/wp/MemTyped.ml
@@ -42,7 +42,7 @@ module L = Qed.Logic
 (* -------------------------------------------------------------------------- *)
 
 let datatype = "MemTyped"
-let hypotheses () = []
+let hypotheses p = p
 let configure () =
   begin
     let orig_pointer = Context.push Lang.pointer (fun _ -> t_addr) in
@@ -415,7 +415,7 @@ module STRING = WpContext.Generator(LITERAL)
         let alloc = F.e_get m base in (* The size is alloc-1 *)
         let sized = Cstring.str_len cst (F.e_add alloc F.e_minus_one) in
         Definitions.define_lemma {
-          l_assumed = true ;
+          l_kind = `Axiom ;
           l_name = name ; l_types = 0 ;
           l_triggers = [] ; l_forall = [] ;
           l_lemma = p_forall [a] (p_imply m_linked sized) ;
@@ -426,7 +426,7 @@ module STRING = WpContext.Generator(LITERAL)
         let name = prefix ^ "_region" in
         let re = - Cstring.str_id cst in
         Definitions.define_lemma {
-          l_assumed = true ;
+          l_kind = `Axiom ;
           l_name = name ; l_types = 0 ; l_triggers = [] ; l_forall = [] ;
           l_lemma = p_equal (e_fun f_region [base]) (e_int re) ;
           l_cluster = Cstring.cluster () ;
@@ -443,7 +443,7 @@ module STRING = WpContext.Generator(LITERAL)
         let v = F.e_get (e_var m) addr in
         let read = F.p_equal c v in
         Definitions.define_lemma {
-          l_assumed = true ;
+          l_kind = `Axiom ;
           l_name = name ; l_types = 0 ; l_triggers = [] ;
           l_forall = [m;i] ;
           l_cluster = Cstring.cluster () ;
@@ -467,7 +467,7 @@ module STRING = WpContext.Generator(LITERAL)
         } ;
         Definitions.define_lemma {
           l_name = prefix ^ "_base" ;
-          l_assumed = true ;
+          l_kind = `Axiom ;
           l_types = 0 ; l_triggers = [] ; l_forall = [] ;
           l_lemma = F.p_lt base F.e_zero ;
           l_cluster = Cstring.cluster () ;
@@ -501,7 +501,7 @@ module BASE = WpContext.Generator(Varinfo)
         let name = prefix ^ "_region" in
         let re = if x.vglob then 0 else if x.vformal then 1 else 2 in
         Definitions.define_lemma {
-          l_assumed = true ;
+          l_kind = `Axiom ;
           l_name = name ; l_types = 0 ; l_triggers = [] ; l_forall = [] ;
           l_lemma = p_equal (e_fun f_region [base]) (e_int re) ;
           l_cluster = cluster_globals () ;
@@ -525,7 +525,7 @@ module BASE = WpContext.Generator(Varinfo)
             let m_linked = p_call p_linked [m] in
             let base_size = p_equal (F.e_get m base) (e_int size) in
             Definitions.define_lemma {
-              l_assumed = true ;
+              l_kind = `Axiom ;
               l_name = name ; l_types = 0 ;
               l_triggers = [] ; l_forall = [] ;
               l_lemma = p_forall [a] (p_imply m_linked base_size) ;
@@ -546,7 +546,7 @@ module BASE = WpContext.Generator(Varinfo)
             let m_init = p_call p_cinits [m] in
             let init_prop = p_forall [a] (p_imply m_init init_access) in
             Definitions.define_lemma {
-              l_assumed = true ;
+              l_kind = `Axiom ;
               l_name = prefix ^ "_init" ; l_types = 0 ;
               l_triggers = [] ; l_forall = [] ;
               l_lemma = init_prop ;
@@ -598,7 +598,7 @@ let pointer_val t = t
 let allocated sigma l = F.e_get (Sigma.value sigma T_alloc) (a_base l)
 
 let base_addr l = a_addr (a_base l) e_zero
-let base_offset l = a_base_offset (a_offset l)
+let base_offset l = a_base_offset (a_base l) (a_offset l)
 let block_length sigma obj l =
   e_fact (Ctypes.sizeof_object obj) (allocated sigma l)
 
diff --git a/src/plugins/wp/MemVar.ml b/src/plugins/wp/MemVar.ml
index 32e840f78930a25e6cc774f329b812d209696ba7..102135a390c059ec2ecddaa30e0e355e555ff18d 100644
--- a/src/plugins/wp/MemVar.ml
+++ b/src/plugins/wp/MemVar.ml
@@ -37,7 +37,7 @@ module type VarUsage =
 sig
   val datatype : string
   val param : varinfo -> MemoryContext.param
-  val hypotheses : unit -> MemoryContext.clause list
+  val iter: ?kf:kernel_function -> init:bool -> (varinfo -> unit) -> unit
 end
 
 module Make(V : VarUsage)(M : Sigs.Model) =
@@ -52,7 +52,13 @@ struct
   let no_binder = { bind = fun _ f v -> f v }
   let configure_ia _ = no_binder
 
-  let hypotheses () = V.hypotheses () @ M.hypotheses ()
+  let hypotheses p =
+    let kf,init = match WpContext.get_scope () with
+      | WpContext.Global -> None,false
+      | WpContext.Kf f -> Some f, WpStrategy.is_main_init f in
+    let w = ref p in
+    V.iter ?kf ~init (fun vi -> w := MemoryContext.set vi (V.param vi) !w) ;
+    M.hypotheses !w
 
   (* -------------------------------------------------------------------------- *)
   (* ---  Chunk                                                             --- *)
@@ -1527,7 +1533,11 @@ struct
           (M.domain obj (mloc_of_loc l)) Heap.Set.empty
 
   let is_well_formed sigma =
-    M.is_well_formed sigma.mem
+    let cstrs = ref [] in
+    SIGMA.iter
+      (fun v c -> cstrs := Cvalues.has_ctype v.vtype (e_var c) :: !cstrs)
+      sigma.vars ;
+    p_conj ((M.is_well_formed sigma.mem) :: !cstrs)
 
   (* -------------------------------------------------------------------------- *)
 
diff --git a/src/plugins/wp/MemVar.mli b/src/plugins/wp/MemVar.mli
index 1f73818c44548a0cb4c0c60a60da503798f3993a..45c063aa9f41fe0d907f93f9910f107e0256a34e 100644
--- a/src/plugins/wp/MemVar.mli
+++ b/src/plugins/wp/MemVar.mli
@@ -30,8 +30,8 @@ module type VarUsage =
 sig
   val datatype : string
   val param : varinfo -> MemoryContext.param
-  (** Memory Model Hypotheses *)
-  val hypotheses : unit -> MemoryContext.clause list
+  val iter: ?kf:kernel_function -> init:bool -> (varinfo -> unit) -> unit
+
 end
 
 module Make(V : VarUsage)(M : Sigs.Model) : Sigs.Model
diff --git a/src/plugins/wp/MemZeroAlias.ml b/src/plugins/wp/MemZeroAlias.ml
index 3300bf555d9fc3cc7b45f1d596572499d7510205..3e185883a6dc47ecbf239c9a312ab8b8bbc1efcf 100644
--- a/src/plugins/wp/MemZeroAlias.ml
+++ b/src/plugins/wp/MemZeroAlias.ml
@@ -48,7 +48,7 @@ let no_binder = { bind = fun _ f v -> f v }
 let configure_ia _ = no_binder
 
 (* TODO: compute actual separation hypotheses *)
-let hypotheses () = []
+let hypotheses p = p
 
 (* -------------------------------------------------------------------------- *)
 (* --- Chunks                                                             --- *)
diff --git a/src/plugins/wp/MemoryContext.ml b/src/plugins/wp/MemoryContext.ml
index 5ef8e4fede2f94509e4663edf3727e647a430368..b3012f74718fa77cdc0ff4d8e6c73e9ec2b5f40e 100644
--- a/src/plugins/wp/MemoryContext.ml
+++ b/src/plugins/wp/MemoryContext.ml
@@ -40,7 +40,6 @@ let pp_param fmt = function
 (* -------------------------------------------------------------------------- *)
 
 open Cil_types
-open Cil_datatype
 
 type zone =
   | Var of varinfo   (* &x     - the cell x *)
@@ -53,56 +52,6 @@ type partition = {
   context : zone list ; (* [ p+(..), ... ] *)
 }
 
-type clause = Valid of zone | Separated of zone list list
-
-(* -------------------------------------------------------------------------- *)
-
-let is_separated_true = function [] | [_] -> true | _ -> false
-
-(* -------------------------------------------------------------------------- *)
-let pp_zone fmt = function
-  | Arr vi -> Format.fprintf fmt "%a+(..)" Varinfo.pretty vi
-  | Ptr vi -> Varinfo.pretty fmt vi
-  | Var vi -> Format.fprintf fmt "&%a" Varinfo.pretty vi
-
-let pp_region fmt = function
-  | [] -> Format.pp_print_string fmt "\\empty"
-  | [z] -> pp_zone fmt z
-  | z::zs ->
-      Format.fprintf fmt "@[<hov 2>\\union(%a" pp_zone z ;
-      List.iter (fun z -> Format.fprintf fmt ",@,%a" pp_zone z) zs ;
-      Format.fprintf fmt ")@]"
-
-let pp_separation fmt = function
-  | [] | [_]  -> Format.pp_print_string fmt "\\true"
-  | r::rs ->
-      Format.fprintf fmt "@[<hov 2>\\separated(%a" pp_region r ;
-      List.iter (fun r -> Format.fprintf fmt ",@,%a" pp_region r) rs ;
-      Format.fprintf fmt ")@]"
-
-let pp_clause fmt = function
-  | Separated sep -> Format.fprintf fmt "@ @[<hov 2>requires %a;@]" pp_separation sep
-  | Valid zone -> Format.fprintf fmt "@ @[<hov 2>requires \\valid(%a);@]" pp_zone zone
-
-(* -------------------------------------------------------------------------- *)
-(* --- Memory Context                                                     --- *)
-(* -------------------------------------------------------------------------- *)
-let add_region r s = if r = [] then s else r::s
-
-let separated partition =
-  List.rev @@
-  add_region (List.rev partition.to_heap) @@
-  add_region (List.rev partition.globals) @@
-  List.map (fun z -> [z]) partition.context
-
-let validity partition =
-  List.rev @@ List.map (fun z -> Valid z) partition.context
-
-let requires partition =
-  let s = separated partition in
-  let v = validity partition in
-  if not (is_separated_true s) then Separated s :: v else v
-
 (* -------------------------------------------------------------------------- *)
 (* --- Partition                                                          --- *)
 (* -------------------------------------------------------------------------- *)
@@ -136,3 +85,239 @@ let set x p w =
       else w
 
 (* -------------------------------------------------------------------------- *)
+(* ANNOTS                                                                     *)
+(* -------------------------------------------------------------------------- *)
+
+open Logic_const
+
+
+let rec ptr_of = function
+  | Ctype t -> Ctype (TPtr(t, []))
+  | t when Logic_typing.is_set_type t ->
+      let t = Logic_typing.type_of_set_elem t in
+      Logic_const.make_set_type (ptr_of t)
+  | _ -> assert false
+
+let rec addr_of_lval ?loc term =
+  let typ = ptr_of term.term_type in
+  match term.term_node with
+  | TLval lv ->
+      Logic_utils.mk_logic_AddrOf ?loc lv typ
+  | TCastE (_, t) | TLogic_coerce (_, t) ->
+      addr_of_lval ?loc t
+  | Tif(c, t, e) ->
+      let t = addr_of_lval ?loc t in
+      let e = addr_of_lval ?loc e in
+      Logic_const.term ?loc (Tif(c, t, e)) typ
+  | Tat( _, _) ->
+      term
+  | Tunion l ->
+      let l = List.map (addr_of_lval ?loc) l in
+      Logic_const.term ?loc (Tunion l) typ
+  | Tinter l ->
+      let l = List.map (addr_of_lval ?loc) l in
+      Logic_const.term ?loc (Tinter l) typ
+  | Tcomprehension (t, qs, p) ->
+      let t = addr_of_lval ?loc t in
+      Logic_const.term ?loc (Tcomprehension (t,qs,p)) typ
+  | _ -> term
+
+let type_of_zone = function
+  | Ptr vi -> vi.vtype
+  | Var vi -> TPtr(vi.vtype, [])
+  | Arr vi when Cil.isPointerType vi.vtype -> vi.vtype
+  | Arr vi -> TPtr(Cil.typeOf_array_elem vi.vtype, [])
+
+let zone_to_term ?(to_char=false) loc zone =
+  let typ = Ctype (type_of_zone zone) in
+  let lval vi = TVar (Cil.cvar_to_lvar vi), TNoOffset in
+  let loc_range ptr =
+    if not to_char then ptr
+    else
+      let pointed =
+        match typ with
+        | (Ctype (TPtr (t, []))) -> t
+        | _ -> assert false (* typ has been generated by type_of_zone *)
+      in
+      let len = Logic_utils.expr_to_term (Cil.sizeOf ~loc pointed) in
+      let last = term (TBinOp(MinusA, len, tinteger ~loc 1)) len.term_type in
+      let range = trange ~loc (Some (tinteger ~loc 0), Some last) in
+      let ptr = Logic_utils.mk_cast ~loc Cil.charPtrType ptr in
+      term ~loc (TBinOp(PlusPI, ptr, range)) ptr.term_type
+  in
+  match zone with
+  | Var vi -> loc_range (term ~loc (TAddrOf(lval vi)) typ)
+  | Ptr vi -> loc_range (term ~loc (TLval(lval vi)) typ)
+  | Arr vi ->
+      let ptr =
+        if Cil.isArrayType vi.vtype
+        then term ~loc (TStartOf (lval vi)) typ
+        else term ~loc (TLval(lval vi)) typ
+      in
+      let ptr =
+        if not to_char then ptr
+        else Logic_utils.mk_cast ~loc Cil.charPtrType ptr
+      in
+      let range = trange ~loc (None, None) in
+      term ~loc (TBinOp(PlusPI, ptr, range)) ptr.term_type
+
+let region_to_term loc = function
+  | [] -> term ~loc Tempty_set (Ctype Cil.charPtrType)
+  | [z] -> zone_to_term loc z
+  | x :: tl as l ->
+      let fst = type_of_zone x in
+      let tl = List.map type_of_zone tl in
+      let to_char = not (List.for_all (Cil_datatype.Typ.equal fst) tl) in
+      let set_typ =
+        make_set_type (Ctype (if to_char then Cil.charPtrType else fst))
+      in
+      term ~loc (Tunion (List.map (zone_to_term ~to_char loc) l)) set_typ
+
+let separated_list ?loc = function
+  | [] | [ _ ] -> ptrue
+  | l ->
+      let comp = Cil_datatype.Term.compare in
+      pseparated ?loc (List.sort comp l)
+
+let term_separated_from_regions loc assigned l =
+  separated_list ~loc (assigned :: List.map (region_to_term loc) l)
+
+let valid_region loc r =
+  let t = region_to_term loc r in
+  pvalid ~loc (here_label, t)
+
+let global_zones partition =
+  List.map (fun z -> [z]) partition.globals
+
+let context_zones partition =
+  List.map (fun z -> [z]) partition.context
+
+let heap_zones partition =
+  let comp a b = Cil_datatype.Typ.compare (type_of_zone a) (type_of_zone b) in
+  List.sort comp partition.to_heap
+
+(* Note that this function does not return separated zone lists, but well-typed
+   zone lists.
+*)
+let heaps partition =
+  let rec partition_by_type t acc l =
+    match l, acc with
+    | [], _ ->
+        acc
+    | x :: l, [] ->
+        partition_by_type (type_of_zone x) [[x]] l
+    | x :: l, p :: acc' when Cil_datatype.Typ.equal t (type_of_zone x) ->
+        partition_by_type t ((x :: p) :: acc') l
+    | x :: l, acc ->
+        partition_by_type (type_of_zone x) ([x] :: acc) l
+  in
+  partition_by_type Cil.voidType [] (heap_zones partition)
+
+let main_separation loc globals context heaps =
+  match heaps, context with
+  | [], [] ->
+      (* In this case, separation is completely trivial *)
+      [ ptrue ]
+  | [], context ->
+      let zones = globals @ context in
+      [ separated_list ~loc (List.map (region_to_term loc) zones) ]
+  | heaps, context ->
+      let for_typed_heap h =
+        let zones = h :: globals @ context in
+        separated_list ~loc (List.map (region_to_term loc) zones)
+      in
+      List.map for_typed_heap heaps
+
+let assigned_locations kf filter =
+  let add_from l (e, _ds) =
+    if filter e.it_content then e :: l else l
+  in
+  let add_assign kf _emitter assigns l = match assigns with
+    | WritesAny ->
+        Wp_parameters.warning
+          ~wkey:Wp_parameters.wkey_imprecise_hypotheses_assigns ~once:true
+          "No assigns for function '%a', model hypotheses will be imprecise"
+          Kernel_function.pretty kf ;
+        l
+    | Writes froms -> List.fold_left add_from l froms
+  in
+  Annotations.fold_assigns (add_assign kf) kf Cil.default_behavior_name []
+
+let assigned_via_pointers kf =
+  let rec assigned_via_pointer t =
+    match t.term_node with
+    | TLval (TMem _, _) ->
+        true
+    | TCastE (_, t) | TLogic_coerce (_, t)
+    | Tcomprehension(t, _, _) | Tat (t, _) ->
+        assigned_via_pointer t
+    | Tunion l | Tinter l ->
+        List.exists assigned_via_pointer l
+    | Tif (_, t1, t2) ->
+        assigned_via_pointer t1 || assigned_via_pointer t2
+    | _ ->
+        false
+  in
+  assigned_locations kf assigned_via_pointer
+
+let clauses_of_partition kf loc p =
+  let globals = global_zones p in
+  let main_sep =
+    main_separation loc globals (context_zones p) (heaps p)
+  in
+  let assigns_sep =
+    let addr_of t = addr_of_lval ~loc t.it_content in
+    List.map
+      (fun t -> term_separated_from_regions loc (addr_of t) globals)
+      (assigned_via_pointers kf)
+  in
+  let context_validity =
+    List.map (valid_region loc) (context_zones p)
+  in
+  let reqs = main_sep @ assigns_sep @ context_validity in
+  let reqs = List.filter (fun p -> not(Logic_utils.is_trivially_true p)) reqs in
+  let reqs = List.sort_uniq Logic_utils.compare_predicate reqs in
+  reqs
+
+module Table =
+  State_builder.Hashtbl
+    (Cil_datatype.Kf.Hashtbl)
+    (Datatype.Option(Cil_datatype.Funbehavior))
+    (struct
+      let name = "MemoryContext.Table"
+      let size = 17
+      let dependencies = [ Ast.self ]
+    end)
+
+let compute_behavior kf name hypotheses_computer =
+  let partition = hypotheses_computer kf in
+  let loc = Kernel_function.get_location kf in
+  let reqs = clauses_of_partition kf loc partition in
+  let reqs = List.map Logic_const.new_predicate reqs in
+  match reqs with
+  | [] -> None
+  | l1 ->
+      Some {
+        b_name = name ;
+        b_requires = l1 ;
+        b_assumes = [] ;
+        b_post_cond = [] ;
+        b_assigns = WritesAny ;
+        b_allocation = FreeAllocAny ;
+        b_extended = []
+      }
+
+let compute name hypotheses_computer =
+  Globals.Functions.iter
+    (fun kf -> ignore (compute_behavior kf name hypotheses_computer))
+
+let get_behavior kf name hypotheses_computer =
+  Table.memo (fun kf -> compute_behavior kf name hypotheses_computer) kf
+
+let emitter =
+  Emitter.(create "Wp.Hypotheses" [Funspec] ~correctness:[] ~tuning:[])
+
+let add_behavior kf name hypotheses_computer =
+  match get_behavior kf name hypotheses_computer with
+  | None -> ()
+  | Some bhv -> Annotations.add_behaviors emitter kf [bhv]
diff --git a/src/plugins/wp/MemoryContext.mli b/src/plugins/wp/MemoryContext.mli
index f10136afa0e83ad7deabd69a0ec5c40e3332f4f5..736617995ed81cf7f7ad010849e1349f9c689712 100644
--- a/src/plugins/wp/MemoryContext.mli
+++ b/src/plugins/wp/MemoryContext.mli
@@ -24,25 +24,16 @@ open Cil_types
 
 type param = NotUsed | ByAddr | ByValue | ByShift | ByRef | InContext | InArray
 
-val pp_param : Format.formatter -> param -> unit
+val pp_param: Format.formatter -> param -> unit
 
 type partition
 
-val empty : partition
-val set : varinfo -> param -> partition -> partition
+val empty: partition
+val set: varinfo -> param -> partition -> partition
 
-type zone =
-  | Var of varinfo   (** [&x] the cell x *)
-  | Ptr of varinfo   (** [p] the cell pointed by p *)
-  | Arr of varinfo   (** [p+(..)] the cell and its neighbors pointed by p *)
+val compute: string -> (kernel_function -> partition) -> unit
 
-type clause =
-  | Valid of zone
-  | Separated of zone list list
-
-(** Build the separation clause from a partition,
-    including the clauses related to the pointer validity *)
-val requires : partition -> clause list
-
-val pp_zone : Format.formatter -> zone -> unit
-val pp_clause : Format.formatter -> clause -> unit
+val add_behavior:
+  kernel_function -> string -> (kernel_function -> partition) -> unit
+val get_behavior:
+  kernel_function -> string -> (kernel_function -> partition) -> behavior option
diff --git a/src/plugins/wp/Pcond.ml b/src/plugins/wp/Pcond.ml
index 76ab4ae4970516f673df070ac354b23a0ea1a998..c3fe43ec6ead0d5cc027160ce378f0fb2ddbc656 100644
--- a/src/plugins/wp/Pcond.ml
+++ b/src/plugins/wp/Pcond.ml
@@ -333,7 +333,7 @@ class engine (lang : #Plang.engine) =
 
 let is_nop = function None -> true | Some(_,upd) -> Bag.is_empty upd
 
-class sequence (lang : #state) =
+class seqengine (lang : #state) =
   object(self)
     inherit engine lang as super
 
@@ -440,7 +440,7 @@ class sequence (lang : #state) =
 
 let engine () =
   if Wp_parameters.has_dkey dkey_state then
-    ( new sequence (new state) :> engine )
+    ( new seqengine (new state) :> engine )
   else
     new engine (new Plang.engine)
 
@@ -449,15 +449,18 @@ let pretty fmt seq =
 
 let () = Conditions.pretty := pretty
 
-let sequence ?(clause="Sequence") fmt seq =
+let dump_sequence ?(clause="Sequence") ?goal fmt seq =
   let plang = new Plang.engine in
   let pcond = new engine plang in
   plang#global
-    (fun () ->
-       Vars.iter (fun x -> ignore (plang#bind x)) (Conditions.vars_hyp seq) ;
-       pcond#pp_sequence ~clause fmt seq)
+    begin fun () ->
+      pcond#pp_block ~clause fmt seq ;
+      match goal with
+      | None -> ()
+      | Some g -> Format.fprintf fmt "@ @[<hov 2>Prove %a@]" plang#pp_pred g
+    end
 
-let bundle ?clause fmt bundle =
-  sequence ?clause fmt (Conditions.bundle bundle)
+let dump_bundle ?clause ?goal fmt bundle =
+  dump_sequence ?clause ?goal fmt (Conditions.bundle bundle)
 
-let dump = bundle ~clause:"Bundle"
+let dump = dump_bundle ?goal:None ~clause:"Bundle"
diff --git a/src/plugins/wp/Pcond.mli b/src/plugins/wp/Pcond.mli
index ece9925515e755fd0c0e92c9efb8cbc1d51fedd1..cb7c4c44b6fec3484eb7eb17716a9cb1573afe26 100644
--- a/src/plugins/wp/Pcond.mli
+++ b/src/plugins/wp/Pcond.mli
@@ -23,16 +23,18 @@
 open Qed.Plib
 open Conditions
 
+open Lang.F
+
 (** {2 All-in-one printers} *)
 
-val dump : bundle printer
-val bundle : ?clause:string -> bundle printer
-val sequence : ?clause:string -> sequence printer
 val pretty : sequent printer
 
+val dump : bundle printer
+val dump_bundle : ?clause:string -> ?goal:pred -> bundle printer
+val dump_sequence : ?clause:string -> ?goal:pred -> sequence printer
+
 (** {2 Low-level API} *)
 
-open Lang.F
 type env = Plang.Env.t
 
 val alloc_hyp : Plang.pool -> (var -> unit) -> sequence -> unit
@@ -103,7 +105,7 @@ class state :
     method pp_value : Format.formatter -> term -> unit
   end
 
-class sequence : #state ->
+class seqengine : #state ->
   object
     inherit engine
     method set_sequence : Conditions.sequence -> unit
diff --git a/src/plugins/wp/ProofEngine.ml b/src/plugins/wp/ProofEngine.ml
index cc42ed6f12e9fdd1c9e3567752f04ced188c8f18..714b170998037ebafd474f101107c79c290b6e12 100644
--- a/src/plugins/wp/ProofEngine.ml
+++ b/src/plugins/wp/ProofEngine.ml
@@ -205,18 +205,28 @@ let children n =
 (* --- State & Status                                                     --- *)
 (* -------------------------------------------------------------------------- *)
 
-type status = [ `Main | `Proved | `Invalid | `Pending of int ]
+type status = [
+  | `Unproved (* proof obligation not proved *)
+  | `Proved   (* proof obligation is proved *)
+  | `Pending of int (* proof is pending *)
+  | `Passed   (* smoke test is passed (PO is not proved) *)
+  | `Invalid  (* smoke test has failed (PO is proved) *)
+  | `StillResist of int (* proof is pending *)
+]
 
 let status t : status =
   match t.root with
   | None ->
       if Wpo.is_proved t.main
       then if Wpo.is_smoke_test t.main then `Invalid else `Proved
-      else `Main
+      else if Wpo.is_smoke_test t.main then `Passed else `Unproved
   | Some root ->
       match root.script with
-      | Opened | Script _ -> `Main
-      | Tactic _ -> `Pending (pending root)
+      | Opened | Script _ ->
+          if Wpo.is_smoke_test t.main then `Passed else `Unproved
+      | Tactic _ ->
+          let n = pending root in
+          if Wpo.is_smoke_test t.main then `StillResist n else `Pending n
 
 (* -------------------------------------------------------------------------- *)
 (* --- Navigation                                                         --- *)
diff --git a/src/plugins/wp/ProofEngine.mli b/src/plugins/wp/ProofEngine.mli
index 764505da0849e9b313b0cd3449b7f5b3eed72efd..764064f9df937ab639fcfa91a16a7a0764728cca 100644
--- a/src/plugins/wp/ProofEngine.mli
+++ b/src/plugins/wp/ProofEngine.mli
@@ -35,7 +35,15 @@ val validate : ?incomplete:bool -> tree -> unit
 
 (** Leaves are numbered from 0 to n-1 *)
 
-type status = [ `Main | `Invalid | `Proved | `Pending of int ]
+
+type status = [
+  | `Unproved (** proof obligation not proved *)
+  | `Proved   (** proof obligation is proved *)
+  | `Pending of int (** proof is pending *)
+  | `Passed   (** smoke test is passed (PO is not proved) *)
+  | `Invalid  (** smoke test has failed (PO is proved) *)
+  | `StillResist of int (** proof is pending *)
+]
 type current = [ `Main | `Internal of node | `Leaf of int * node ]
 type position = [ `Main | `Node of node | `Leaf of int ]
 
diff --git a/src/plugins/wp/ProofScript.ml b/src/plugins/wp/ProofScript.ml
index 73c77b5b71d37ffa4fbb17639893672e2e17a7e6..4ad9bd70305c577c20e833482bf6419f7a3cb5b3 100644
--- a/src/plugins/wp/ProofScript.ml
+++ b/src/plugins/wp/ProofScript.ml
@@ -342,7 +342,7 @@ let json_of_result (p : VCS.prover) (r : VCS.result) =
   `Assoc (name :: verdict :: (time @ steps))
 
 let prover_of_json js =
-  try VCS.prover_of_name (js >? "prover" |> Json.string)
+  try VCS.parse_prover (js >? "prover" |> Json.string)
   with Not_found -> None
 
 let result_of_json js =
diff --git a/src/plugins/wp/ProverErgo.ml b/src/plugins/wp/ProverErgo.ml
index 1e9a0feae7cd9372939cd1f55a56a0d8c1b37d57..0dc36e0245fa1c3d68e1f6a67d60f62926efae6a 100644
--- a/src/plugins/wp/ProverErgo.ml
+++ b/src/plugins/wp/ProverErgo.ml
@@ -404,9 +404,14 @@ class altergo ~config ~pid ~gui ~file ~lines ~logout ~logerr =
                 ~steps verdict
             with Not_found ->
               begin
+                let message std =
+                  Format.asprintf
+                    "Alt-Ergo (%s) for goal %a"
+                    std WpPropId.pretty pid
+                in
                 if Wp_parameters.verbose_atleast 1 then begin
-                  ProverTask.pp_file ~message:"Alt-Ergo (stdout)" ~file:logout ;
-                  ProverTask.pp_file ~message:"Alt-Ergo (stderr)" ~file:logerr ;
+                  ProverTask.pp_file ~message:(message "stdout") ~file:logout ;
+                  ProverTask.pp_file ~message:(message "stderr") ~file:logerr ;
                 end;
                 if r = 0 then VCS.failed "Unexpected Alt-Ergo output"
                 else VCS.kfailed "Alt-Ergo exits with status [%d]." r
diff --git a/src/plugins/wp/ProverScript.ml b/src/plugins/wp/ProverScript.ml
index 9458666cfc60d2dcc01e346c2aba174f0f1afde5..50d397972326abe6dc05b733e556640ccd851863 100644
--- a/src/plugins/wp/ProverScript.ml
+++ b/src/plugins/wp/ProverScript.ml
@@ -165,9 +165,10 @@ struct
     Prover.prove wpo ?config ~mode:VCS.BatchMode
       ~progress:env.progress prover
 
-  let pending env =
+  let backtracking env =
     match ProofEngine.status env.tree with
-    | `Main | `Invalid | `Proved -> 0 | `Pending n -> n
+    | `Unproved | `Invalid | `Proved | `Passed -> 0
+    | `Pending n | `StillResist n -> n
 
   let setup_backtrack env node depth =
     if env.backtrack > 0 then
@@ -181,11 +182,11 @@ struct
               bk_node = node ;
               bk_best = (-1) ;
               bk_depth = depth ;
-              bk_pending = pending env ;
+              bk_pending = backtracking env ;
             }
 
   let search env node ~depth =
-    if env.auto <> [] && depth < env.depth && pending env < env.width
+    if env.auto <> [] && depth < env.depth && backtracking env < env.width
     then
       match ProverSearch.search env.tree ~anchor:node env.auto with
       | None -> None
@@ -197,7 +198,7 @@ struct
       match env.backtracking with
       | None -> None
       | Some point ->
-          let n = pending env in
+          let n = backtracking env in
           let anchor = point.bk_node in
           if n < point.bk_pending then
             begin
@@ -300,7 +301,7 @@ and autosearch env ~depth node : bool Task.task =
 
 and autofork env ~depth fork =
   let _,children = ProofEngine.commit fork in
-  let pending = Env.pending env in
+  let pending = Env.backtracking env in
   if pending > 0 then
     begin
       Env.progress env (Printf.sprintf "Auto %d" pending) ;
@@ -323,7 +324,8 @@ let rec crawl env on_child node = function
       Task.return ()
 
   | Error(msg,json) :: alternative ->
-      Wp_parameters.warning "@[<hov 2>Script Error %S: %a@]@."
+      Wp_parameters.warning "@[<hov 2>Script Error: on goal %a@\n%S: %a@]@."
+        WpPropId.pretty (Env.goal env node).po_pid
         msg Json.pp json ;
       crawl env on_child node alternative
 
@@ -348,9 +350,11 @@ let rec crawl env on_child node = function
         match jfork (Env.tree env) ?node jtactic with
         | None ->
             Wp_parameters.warning
-              "Script Error: can not apply '%s'@\n\
+              "Script Error: on goal %a@\n\
+               can not apply '%s'@\n\
                @[<hov 2>Params: %a@]@\n\
                @[<hov 2>Select: %a@]@."
+              WpPropId.pretty (Env.goal env node).po_pid
               jtactic.tactic
               Json.pp jtactic.params
               Json.pp jtactic.select ;
@@ -391,16 +395,20 @@ let task
     ~depth ~width ~backtrack ~auto
     ~start ~progress ~result ~success wpo =
   begin fun () ->
-    start wpo ;
-    let json = ProofSession.load wpo in
-    let script = Priority.sort (ProofScript.decode json) in
-    let tree = ProofEngine.proof ~main:wpo in
-    let env = Env.make tree
-        ~valid ~failed ~provers
-        ~depth ~width ~backtrack ~auto
-        ~progress ~result ~success in
-    crawl env (process env) None script >>?
-    (fun _ -> ProofEngine.forward tree) ;
+    Prover.simplify ~start ~result wpo >>= fun succeed ->
+    if succeed
+    then
+      ( success wpo (Some VCS.Qed) ; Task.return ())
+    else
+      let json = ProofSession.load wpo in
+      let script = Priority.sort (ProofScript.decode json) in
+      let tree = ProofEngine.proof ~main:wpo in
+      let env = Env.make tree
+          ~valid ~failed ~provers
+          ~depth ~width ~backtrack ~auto
+          ~progress ~result ~success in
+      crawl env (process env) None script >>?
+      (fun _ -> ProofEngine.forward tree) ;
   end
 
 (* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/ProverTask.ml b/src/plugins/wp/ProverTask.ml
index c1c45be5d62bba655bacdcc1b17665ad4c7ca5ad..724cb237f7ccf9e12801e503530b77b1da0a171d 100644
--- a/src/plugins/wp/ProverTask.ml
+++ b/src/plugins/wp/ProverTask.ml
@@ -314,18 +314,25 @@ let schedule task =
   Task.spawn server (Task.thread task)
 
 let silent _ = ()
-let spawn ?(monitor=silent) ?pool ~all
+let spawn ?(monitor=silent) ?pool ~all ~smoke
     (jobs : ('a * bool Task.task) list) =
   if jobs <> [] then
     begin
       let step = ref 0 in
       let monitored = ref [] in
-      let canceled = ref false in
+      let finalized = ref false in
       let callback a r =
         if r then
-          begin if not all && not !canceled then
+          begin
+            if smoke then
+              begin
+                finalized := true ;
+                monitor (Some a) ;
+              end
+            else
+            if not all && not !finalized then
               begin
-                canceled := true ;
+                finalized := true ;
                 monitor (Some a) ;
                 List.iter Task.cancel !monitored ;
               end
@@ -333,7 +340,7 @@ let spawn ?(monitor=silent) ?pool ~all
         else
           begin
             decr step ;
-            if not !canceled && !step = 0 then
+            if not !finalized && !step = 0 then
               monitor None ;
           end in
       let pack (a,t) = Task.thread (t >>= Task.call (callback a)) in
diff --git a/src/plugins/wp/ProverTask.mli b/src/plugins/wp/ProverTask.mli
index 4f0bc09934e924175358840fe95a8bc3cb697930..f964e61ea1075dcf09fa133e9028b7f14a88c2dc 100644
--- a/src/plugins/wp/ProverTask.mli
+++ b/src/plugins/wp/ProverTask.mli
@@ -85,7 +85,7 @@ val schedule : 'a Task.task -> unit
 val spawn :
   ?monitor:('a option -> unit) ->
   ?pool:Task.pool ->
-  all:bool ->
+  all:bool -> smoke:bool ->
   ('a * bool Task.task) list -> unit
 
 (** Spawn all the tasks over the server and retain the first 'validated' one.
diff --git a/src/plugins/wp/ProverWhy3.ml b/src/plugins/wp/ProverWhy3.ml
index 2d9a6ce177b2444d77f578b6d09607cfc66524be..a4e27a63283ac7f3ed795a1ffe75325fdaf953bd 100644
--- a/src/plugins/wp/ProverWhy3.ml
+++ b/src/plugins/wp/ProverWhy3.ml
@@ -939,7 +939,7 @@ class visitor (ctx:context) c =
       id, t
 
     method on_dlemma l =
-      let kind = Why3.Decl.(if l.l_assumed then Paxiom else Plemma) in
+      let kind = Why3.Decl.(if l.l_kind = `Axiom then Paxiom else Plemma) in
       let cnv = empty_cnv ctx in
       let id, t = self#make_lemma cnv l in
       let decl = Why3.Decl.create_prop_decl kind id t in
@@ -1153,18 +1153,21 @@ let ping_prover_call p =
   match Why3.Call_provers.query_call p.call with
   | NoUpdates
   | ProverStarted ->
-      let () = match p.timeover with
-        | None ->
-            let started = Unix.time () in
-            p.timeover <- Some (started +. 2.0 +. float p.timeout)
-        | Some timeout ->
-            let time = Unix.time () in
-            if time > timeout then
-              begin
-                Wp_parameters.debug ~dkey "Hard Kill (late why3server timeout)" ;
-                p.interrupted <- true ;
-                Why3.Call_provers.interrupt_call p.call ;
-              end
+      let () =
+        if p.timeout > 0 then
+          match p.timeover with
+          | None ->
+              let started = Unix.time () in
+              p.timeover <- Some (started +. 2.0 +. float p.timeout)
+          | Some timeout ->
+              let time = Unix.time () in
+              if time > timeout then
+                begin
+                  Wp_parameters.debug ~dkey
+                    "Hard Kill (late why3server timeout)" ;
+                  p.interrupted <- true ;
+                  Why3.Call_provers.interrupt_call p.call ;
+                end
       in Task.Wait 100
   | InternalFailure exn ->
       let msg = Format.asprintf "@[<hov 2>%a@]"
@@ -1198,22 +1201,11 @@ let ping_prover_call p =
         VCS.pp_result r;
       Task.Return (Task.Result r)
 
-let call_prover prover_config ~timeout ~steplimit drv prover task =
-  let steps = match steplimit with Some 0 -> None | _ -> steplimit in
-  let limit =
-    let def = Why3.Call_provers.empty_limit in
-    { def with
-      Why3.Call_provers.limit_time = Why3.Opt.get_def def.limit_time timeout;
-      Why3.Call_provers.limit_steps = Why3.Opt.get_def def.limit_time steps;
-    } in
-  let command = Why3.Whyconf.get_complete_command prover_config
-      ~with_steps:(steps<>None) in
-  let call =
-    Why3.Driver.prove_task_prepared ~command ~limit drv task in
-  Wp_parameters.debug ~dkey "Why3 run prover %a with %i timeout %i steps@."
+let call_prover_task ~timeout ~steps prover call =
+  Wp_parameters.debug ~dkey "Why3 run prover %a with timeout %d, steps %d@."
     Why3.Whyconf.print_prover prover
     (Why3.Opt.get_def (-1) timeout)
-    (Why3.Opt.get_def (-1) steps);
+    (Why3.Opt.get_def (-1) steps) ;
   let timeout = match timeout with None -> 0 | Some tlimit -> tlimit in
   let pcall = {
     call ; prover ;
@@ -1230,15 +1222,110 @@ let call_prover prover_config ~timeout ~steplimit drv prover task =
   in
   Task.async ping
 
-let is_trivial (t : Why3.Task.task) =
-  let goal = Why3.Task.task_goal_fmla t in
-  Why3.Term.t_equal goal Why3.Term.t_true
+(* -------------------------------------------------------------------------- *)
+(* --- Batch Prover                                                       --- *)
+(* -------------------------------------------------------------------------- *)
+
+let digest wpo drv prover task =
+  let file = Wpo.DISK.file_goal
+      ~pid:wpo.Wpo.po_pid
+      ~model:wpo.Wpo.po_model
+      ~prover:(VCS.Why3 prover) in
+  let _ = Command.print_file file
+      begin fun fmt ->
+        Format.fprintf fmt "(* WP Task for Prover %s *)@\n"
+          (Why3Provers.print_why3 prover) ;
+        Why3.Driver.print_task_prepared drv fmt task ;
+      end
+  in Digest.file file |> Digest.to_hex
+
+let batch pconf driver ?script ~timeout ~steplimit prover task =
+  let steps = match steplimit with Some 0 -> None | _ -> steplimit in
+  let limit =
+    let def = Why3.Call_provers.empty_limit in
+    { def with
+      Why3.Call_provers.limit_time = Why3.Opt.get_def def.limit_time timeout;
+      Why3.Call_provers.limit_steps = Why3.Opt.get_def def.limit_time steps;
+    } in
+  let with_steps = match steps, pconf.Why3.Whyconf.command_steps with
+    | None, _ -> false
+    | Some _, Some _ -> true
+    | Some _, None -> false
+  in
+  let command = Why3.Whyconf.get_complete_command pconf ~with_steps in
+  let inplace = if script <> None then Some true else None in
+  let call = Why3.Driver.prove_task_prepared ?old:script ?inplace
+      ~command ~limit driver task in
+  call_prover_task ~timeout ~steps prover call
+
+(* -------------------------------------------------------------------------- *)
+(* --- Interactive Prover (Coq)                                           --- *)
+(* -------------------------------------------------------------------------- *)
+
+let editor pconf =
+  let config = Why3Provers.config () in
+  try
+    let ed = Why3.Whyconf.editor_by_id config pconf.Why3.Whyconf.editor in
+    String.concat " " (ed.editor_command :: ed.editor_options)
+  with Not_found ->
+    Why3.Whyconf.(default_editor (get_main config))
+
+let scriptfile ~force ~ext wpo =
+  let dir = Wp_parameters.get_session_dir ~force "interactive" in
+  Format.sprintf "%s/%s%s" (dir :> string) wpo.Wpo.po_sid ext
+
+let call_editor ~script pconf =
+  Wp_parameters.feedback ~ontty:`Transient "Editing %S..." script ;
+  let call = Why3.Call_provers.call_editor ~command:(editor pconf) script in
+  call_prover_task ~timeout:None ~steps:None pconf.prover call
+
+let compile ~script ~timeout pconf driver prover task =
+  let digest _prover _task = Digest.file script |> Digest.to_hex in
+  let runner = batch pconf driver ~script in
+  Cache.get_result ~digest ~runner ~timeout ~steplimit:None prover task
+
+let prepare ~mode wpo driver task =
+  let force = match mode with VCS.BatchMode -> false | _ -> true in
+  let ext = Filename.extension (Why3.Driver.file_of_task driver "S" "T" task) in
+  let script = scriptfile ~force wpo ~ext in
+  if Sys.file_exists script then Some script
+  else if force then
+    begin
+      Command.pp_to_file script (fun fmt ->
+          ignore (Why3.Driver.print_task_prepared driver fmt task)
+        ) ; Some script
+    end
+  else None
+
+let interactive ~mode wpo pconf driver prover task =
+  let time = Wp_parameters.InteractiveTimeout.get () in
+  let timeout = if time <= 0 then None else Some time in
+  match prepare ~mode wpo driver task with
+  | None -> Task.return VCS.unknown
+  | Some script ->
+      match mode with
+      | VCS.BatchMode ->
+          compile ~script ~timeout pconf driver prover task
+      | VCS.EditMode ->
+          let open Task in
+          call_editor ~script pconf >>= fun _ ->
+          compile ~script ~timeout pconf driver prover task
+      | VCS.FixMode ->
+          let open Task in
+          compile ~script ~timeout pconf driver prover task >>= fun r ->
+          if VCS.is_valid r then return r else
+            call_editor ~script pconf >>= fun _ ->
+            compile ~script ~timeout pconf driver prover task
 
 (* -------------------------------------------------------------------------- *)
 (* --- Prove WPO                                                          --- *)
 (* -------------------------------------------------------------------------- *)
 
-let build_proof_task ?timeout ?steplimit ~prover wpo () =
+let is_trivial (t : Why3.Task.task) =
+  let goal = Why3.Task.task_goal_fmla t in
+  Why3.Term.t_equal goal Why3.Term.t_true
+
+let build_proof_task ?(mode=VCS.BatchMode) ?timeout ?steplimit ~prover wpo () =
   try
     (* Always generate common task *)
     let context = Wpo.get_context wpo in
@@ -1247,12 +1334,17 @@ let build_proof_task ?timeout ?steplimit ~prover wpo () =
     then Task.return VCS.no_result (* Only generate *)
     else
       let env = WpContext.on_context context get_why3_env () in
-      let drv , config , task = prover_task env prover task in
+      let drv , pconf , task = prover_task env prover task in
       if is_trivial task then
         Task.return VCS.valid
       else
-        Cache.get_result wpo (call_prover config)
-          ~timeout ~steplimit drv prover task
+      if pconf.interactive then
+        interactive ~mode wpo pconf drv prover task
+      else
+        Cache.get_result
+          ~digest:(digest wpo drv)
+          ~runner:(batch pconf drv ?script:None)
+          ~timeout ~steplimit prover task
   with exn ->
     if Wp_parameters.has_dkey dkey_api then
       Wp_parameters.fatal "[Why3 Error] %a@\n%s"
@@ -1261,7 +1353,7 @@ let build_proof_task ?timeout ?steplimit ~prover wpo () =
     else
       Task.failed "[Why3 Error] %a" Why3.Exn_printer.exn_printer exn
 
-let prove ?timeout ?steplimit ~prover wpo =
-  Task.later (build_proof_task ?timeout ?steplimit ~prover wpo) ()
+let prove ?mode ?timeout ?steplimit ~prover wpo =
+  Task.later (build_proof_task ?mode ?timeout ?steplimit ~prover wpo) ()
 
 (* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/ProverWhy3.mli b/src/plugins/wp/ProverWhy3.mli
index ea029e0804bc7aba4a8f25d66b18a043dd0804ea..e29b681ff4412f662db152da2af6b14bb9a9d19a 100644
--- a/src/plugins/wp/ProverWhy3.mli
+++ b/src/plugins/wp/ProverWhy3.mli
@@ -26,8 +26,8 @@ val add_specific_equality:
   unit
 (** Equality used in the goal, simpler to prove than polymorphic equality *)
 
-val prove : ?timeout:int -> ?steplimit:int -> prover:Why3Provers.t ->
-  Wpo.t -> VCS.result Task.task
+val prove : ?mode:VCS.mode -> ?timeout:int -> ?steplimit:int ->
+  prover:Why3Provers.t -> Wpo.t -> VCS.result Task.task
 (** Return NoResult if it is already proved by Qed *)
 
 (**************************************************************************)
diff --git a/src/plugins/wp/RefUsage.ml b/src/plugins/wp/RefUsage.ml
index d94275dc6b2bea36d302aa8cb4422fd4770869ad..df5426a001849e0295a5b148dd9bf4b25e12069a 100644
--- a/src/plugins/wp/RefUsage.ml
+++ b/src/plugins/wp/RefUsage.ml
@@ -79,7 +79,7 @@ sig
   val cup : t -> t -> t
   val cup_differ : t -> t -> t * bool
   (* val leq : t -> t -> bool *) (* unused for now *)
-  (* val lcup : t list -> t *) (* unused for now *)
+  val lcup : t list -> t
   val fcup : ('a -> t) -> 'a list -> t
   val get : varinfo -> t -> access
   val access : varinfo -> access -> t -> t
@@ -120,7 +120,7 @@ struct
   (* let leq = Xmap.subset (fun _ -> Access.leq) *)
 
   (* unused for now *)
-  (* let rec lcup = function [] -> bot |[x] -> x |x::xs -> cup x (lcup xs)*)
+  let rec lcup = function [] -> bot |[x] -> x |x::xs -> cup x (lcup xs)
   let rec fcup f = function
       [] -> bot | [x] -> f x | x::xs -> cup (f x) (fcup f xs)
 
@@ -731,6 +731,11 @@ let compute_usage () =
   Wp_parameters.feedback ~ontty:`Transient "Collecting variable usage" ;
   (* initial state from variable initializers *)
   let u_init = Globals.Vars.fold cvarinit E.bot in
+  (* Usage in lemmas *)
+  let u_lemmas =
+    LogicUsage.fold_lemmas
+      (fun l -> E.cup (pred (mk_ctx()) l.lem_property)) E.bot
+  in
   (* initial state by kf *)
   let usage = Globals.Functions.fold (fun kf env ->
       KFmap.insert (fun _ _u _old -> assert false) kf (cfun kf) env)
@@ -790,10 +795,12 @@ let compute_usage () =
       ignore (KFmap.interf (kf_fp state_fp) callers todo);
       fixpoint state_fp.todo
   in fixpoint todo ;
+  let u_init = E.cup u_init u_lemmas in
   (* TODO[LC]: prendre en compte la compilation des fonctions logiques et predicats ; Cf. add_lphi *)
   let usage =
     KFmap.map
-      (fun ctx -> E.cup (E.cup ctx.code ctx.spec_globals) ctx.spec_formals)
+      (fun ctx ->
+         E.lcup [ u_lemmas ; ctx.code ; ctx.spec_globals ; ctx.spec_formals])
       usage
   in u_init, usage
 
diff --git a/src/plugins/wp/Sigma.ml b/src/plugins/wp/Sigma.ml
index d93f60130f53660f227f64ce08c3849c8bf262e2..bb4a82b27983b710c472bc384e8bec77f7eac325 100644
--- a/src/plugins/wp/Sigma.ml
+++ b/src/plugins/wp/Sigma.ml
@@ -115,15 +115,16 @@ struct
   let mem w c = H.Map.mem c w.map
 
   let join a b =
-    let p = ref Passive.empty in
-    H.Map.iter2
-      (fun chunk x y ->
-         match x,y with
-         | Some x , Some y -> p := Passive.join x y !p
-         | Some x , None -> b.map <- H.Map.add chunk x b.map
-         | None , Some y -> a.map <- H.Map.add chunk y a.map
-         | None , None -> ())
-      a.map b.map ; !p
+    if a == b then Passive.empty else
+      let p = ref Passive.empty in
+      H.Map.iter2
+        (fun chunk x y ->
+           match x,y with
+           | Some x , Some y -> p := Passive.join x y !p
+           | Some x , None -> b.map <- H.Map.add chunk x b.map
+           | None , Some y -> a.map <- H.Map.add chunk y a.map
+           | None , None -> ())
+        a.map b.map ; !p
 
   let assigned ~pre ~post written =
     let p = ref Bag.empty in
diff --git a/src/plugins/wp/Sigs.ml b/src/plugins/wp/Sigs.ml
index 98754486ae49dc64946f4e89df963e7d732229e3..e5c252e0076a78c4833cb29d0d7ed58bdbd14a0b 100644
--- a/src/plugins/wp/Sigs.ml
+++ b/src/plugins/wp/Sigs.ml
@@ -291,9 +291,10 @@ sig
   val datatype : string
   (** For projectification. Must be unique among models. *)
 
-  val hypotheses : unit -> MemoryContext.clause list
-  (** Computes the memory model hypotheses including separation and validity
-      clauses to be verified for this model. *)
+  val hypotheses : MemoryContext.partition -> MemoryContext.partition
+  (** Computes the memory model partitionning of the memory locations.
+      This function typically adds new elements to the partition received
+      in input (that can be empty). *)
 
   module Chunk : Chunk
   (** Memory model chunks. *)
@@ -657,6 +658,9 @@ sig
   (** Update a frame with a specific environment for the given label. *)
   val set_at_frame : frame -> Clabels.c_label -> sigma -> unit
 
+  (** Chek if a frame already has a specific envioronement for the given label. *)
+  val has_at_frame : frame -> Clabels.c_label -> bool
+
   (** Same as [mem_at_frame] but for the current frame. *)
   val mem_frame : Clabels.c_label -> sigma
 
diff --git a/src/plugins/wp/Splitter.ml b/src/plugins/wp/Splitter.ml
index 32dfd8adf7a1bd0952154b8321635a33af8211f1..2ae3208e7b0f3da110aae76133e4350914836d8d 100644
--- a/src/plugins/wp/Splitter.ml
+++ b/src/plugins/wp/Splitter.ml
@@ -50,7 +50,7 @@ let pretty fmt = function
 
 let loc = function
   | THEN s | ELSE s | CASE(s,_) | CALL(s,_) | DEFAULT s -> Stmt.loc s
-  | ASSERT(p,_,_) -> p.ip_content.pred_loc
+  | ASSERT(p,_,_) -> p.ip_content.tp_statement.pred_loc
 
 let compare p q =
   if p == q then 0 else
@@ -103,8 +103,7 @@ and unwrap p =
         (unwrap p)
   | _ -> raise Exit
 
-let predicate ip =
-  ip.ip_content
+let predicate ip = ip.ip_content.tp_statement
 
 let rec enumerate ip k n = function
   | [] -> []
diff --git a/src/plugins/wp/StmtSemantics.ml b/src/plugins/wp/StmtSemantics.ml
index 234884282f5195ff5ffad5ee1f4368b93b9537cb..28aaa51e928def28bc856f4e00b73a7a3beb52c5 100644
--- a/src/plugins/wp/StmtSemantics.ml
+++ b/src/plugins/wp/StmtSemantics.ml
@@ -297,9 +297,9 @@ struct
       with Not_found -> Wp_parameters.fatal "Error during compilation"
 
   let assert_ env p prop_id =
-    let pos = pred env `Positive p.ip_content in
+    let pos = pred env `Positive p.ip_content.tp_statement in
     let env' = env @* [Clabels.here, env @: Clabels.next ] in
-    let neg = pred env' `Negative p.ip_content in
+    let neg = pred env' `Negative p.ip_content.tp_statement in
     let goal = {
       goal_pred = pos;
       goal_prop = prop_id;
@@ -430,7 +430,7 @@ struct
     in
     let post_cond termination_kind env (tk, ip) =
       if tk = termination_kind then
-        assume_ env `Positive ip.ip_content
+        assume_ env `Positive ip.ip_content.tp_statement
       else nop
     in
     let behavior env b =
@@ -540,7 +540,7 @@ struct
                  let node = get_node nodes vertex in
                  bind c_label node acc
               ) a.labels env in
-          assume (pred env `Negative a.predicate.ip_content) @^
+          assume (pred env `Negative a.predicate.ip_content.tp_statement) @^
           goto (env @: Clabels.here) (env @: Clabels.next)
       | Prop _ ->
           not_yet "[StmtSemantics] Annots other than 'assert'"
@@ -717,7 +717,7 @@ struct
       in
       assume,
       List.fold_left
-        (fun acc ip -> acc @^ pre_cond `Negative env ip.ip_content)
+        (fun acc ip -> acc @^ pre_cond `Negative env ip.ip_content.tp_statement)
         nop b.b_requires
       @^ goto (env @: Clabels.here) (env @: Clabels.next)
     in
diff --git a/src/plugins/wp/TacSplit.ml b/src/plugins/wp/TacSplit.ml
index 20f844db03a3285b4dc9a7bc35d3a1eca6cf4c76..5b53076bb48f53f6cb1d9699bbdf19b2bc575096 100644
--- a/src/plugins/wp/TacSplit.ml
+++ b/src/plugins/wp/TacSplit.ml
@@ -187,7 +187,9 @@ class split =
             let open Qed.Logic in
             match Lang.F.repr e with
             | Leq(x,y) -> split_cmp "Split (comp.)" x y
-            | Lt(x,y)  -> split_cmp "Split (comp.)" x y
+            | Lt(x,y) ->
+                let x = if F.is_int x then F.(e_add x e_one) else x in
+                split_cmp "Split (comp.)" x y
             | Eq(x,y)  when not (is_prop x || is_prop y) ->
                 split_cmp "Split (eq.)" x y
             | Neq(x,y) when not (is_prop x || is_prop y) ->
diff --git a/src/plugins/wp/VC.ml b/src/plugins/wp/VC.ml
index 2f2241b5a01bdedbe4b6d4b31406e30b5ed2e55b..65a60848639e15d5840c11cfedd1094c014bb150 100644
--- a/src/plugins/wp/VC.ml
+++ b/src/plugins/wp/VC.ml
@@ -97,6 +97,6 @@ let spawn = Prover.spawn ~delayed:true
 
 let server = ProverTask.server
 let command ?provers ?tip vcs =
-  Register.do_wp_proofs_iter ?provers ?tip (fun f -> Bag.iter f vcs)
+  Register.do_wp_proofs ?provers ?tip vcs
 
 (* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/VCS.ml b/src/plugins/wp/VCS.ml
index 1a855c3bbbe474b41d5fb2df7d0fc903235b27e0..2b7862a000d14da1f3699f8021af17af9babe1c9 100644
--- a/src/plugins/wp/VCS.ml
+++ b/src/plugins/wp/VCS.ml
@@ -38,7 +38,7 @@ type mode =
   | EditMode  (* Edit then check scripts *)
   | FixMode   (* Try check script, then edit script on non-success *)
 
-let prover_of_name = function
+let parse_prover = function
   | "" | "none" -> None
   | "qed" | "Qed" -> Some Qed
   | "native-alt-ergo" (* for wp-reports *)
@@ -70,13 +70,19 @@ let prover_of_name = function
             (String.concat ":" prv) (Why3Provers.print_wp p) ;
           Some (Why3 p)
       | NotFound ->
-          Wp_parameters.error "Prover '%s' not found in why3.conf" name ;
+          Wp_parameters.error ~once:true
+            "Prover '%s' not found in why3.conf" name ;
           None
 
-let mode_of_prover_name = function
-  | "native:coqedit" -> EditMode
-  | "native:coqide" | "native:altgr-ergo" -> FixMode
-  | _ -> BatchMode
+let parse_mode m =
+  match String.lowercase_ascii m with
+  | "fix" -> FixMode
+  | "edit" -> EditMode
+  | "batch" -> BatchMode
+  | _ ->
+      Wp_parameters.error ~once:true
+        "Unrecognized mode %S (use 'batch' instead)" m ;
+      BatchMode
 
 let name_of_prover = function
   | Why3 s -> Why3Provers.print_wp s
@@ -122,8 +128,18 @@ let filename_for_prover = function
   | Tactical -> "Tactical"
 
 let is_auto = function
-  | Qed | NativeAltErgo | Why3 _ -> true
+  | Qed | NativeAltErgo -> true
   | Tactical | NativeCoq -> false
+  | Why3 p ->
+      match p.prover_name with
+      | "Alt-Ergo" | "CVC4" | "Z3" -> true
+      | "Coq" -> false
+      | _ ->
+          let config = Why3Provers.config () in
+          try
+            let prover_config = Why3.Whyconf.get_prover_config config p in
+            not prover_config.interactive
+          with Not_found -> true
 
 let cmp_prover p q =
   match p,q with
@@ -317,31 +333,35 @@ let pp_result fmt r =
   | Stepout -> Format.fprintf fmt "Step limit%a" pp_perf r
   | Timeout -> Format.fprintf fmt "Timeout%a" pp_perf r
 
-let pp_cache_miss fmt st prover r =
-  let qualified =
-    match prover with
-    | Qed | Tactical -> true
-    | NativeAltErgo | NativeCoq -> r.verdict <> Timeout
-    | Why3 _ -> r.cached || r.prover_time < Rformat.epsilon
-  in
-  if not qualified && Wp_parameters.has_dkey dkey_shell then
-    Format.fprintf fmt "%s%a (unqualified)" st pp_perf r
+let is_qualified prover result =
+  match prover with
+  | Qed | Tactical -> true
+  | NativeAltErgo | NativeCoq -> result.verdict <> Timeout
+  | Why3 _ -> result.cached || result.prover_time < Rformat.epsilon
+
+let pp_cache_miss fmt st updating prover result =
+  if not updating
+  && not (is_qualified prover result)
+  && Wp_parameters.has_dkey dkey_shell
+  then
+    Format.fprintf fmt "%s%a (missing cache)" st pp_perf result
   else
-    Format.pp_print_string fmt (if is_valid r then "Valid" else "Unsuccess")
+    Format.pp_print_string fmt @@
+    if is_valid result then "Valid" else "Unsuccess"
 
-let pp_result_qualif prover fmt r =
+let pp_result_qualif ?(updating=true) prover result fmt =
   if Wp_parameters.has_dkey dkey_shell then
-    match r.verdict with
+    match result.verdict with
     | NoResult -> Format.pp_print_string fmt "No Result"
     | Computing _ -> Format.pp_print_string fmt "Computing"
     | Invalid -> Format.pp_print_string fmt "Invalid"
-    | Failed -> Format.fprintf fmt "Failed@ %s" r.prover_errmsg
-    | Valid -> pp_cache_miss fmt "Valid" prover r
-    | Unknown -> pp_cache_miss fmt "Unsuccess" prover r
-    | Timeout -> pp_cache_miss fmt "Timeout" prover r
-    | Stepout -> pp_cache_miss fmt "Stepout" prover r
+    | Failed -> Format.fprintf fmt "Failed@ %s" result.prover_errmsg
+    | Valid -> pp_cache_miss fmt "Valid" updating prover result
+    | Unknown -> pp_cache_miss fmt "Unsuccess" updating prover result
+    | Timeout -> pp_cache_miss fmt "Timeout" updating prover result
+    | Stepout -> pp_cache_miss fmt "Stepout" updating prover result
   else
-    pp_result fmt r
+    pp_result fmt result
 
 let compare p q =
   let rank = function
diff --git a/src/plugins/wp/VCS.mli b/src/plugins/wp/VCS.mli
index 0e869ebea1458ef899c8e8ea6ff4b563cf224644..e43bb52617772920bbe7fb93760c1a79ed832273 100644
--- a/src/plugins/wp/VCS.mli
+++ b/src/plugins/wp/VCS.mli
@@ -44,10 +44,11 @@ module Pmap : Map.S with type key = prover
 val name_of_prover : prover -> string
 val title_of_prover : prover -> string
 val filename_for_prover : prover -> string
-val prover_of_name : string -> prover option
-val mode_of_prover_name : string -> mode
 val title_of_mode : mode -> string
 
+val parse_mode : string -> mode
+val parse_prover : string -> prover option
+
 val pp_prover : Format.formatter -> prover -> unit
 val pp_mode : Format.formatter -> mode -> unit
 
@@ -119,7 +120,8 @@ val configure : result -> config
 val autofit : result -> bool (** Result that fits the default configuration *)
 
 val pp_result : Format.formatter -> result -> unit
-val pp_result_qualif : prover -> Format.formatter -> result -> unit
+val pp_result_qualif : ?updating:bool -> prover -> result ->
+  Format.formatter -> unit
 
 val compare : result -> result -> int (* best is minimal *)
 val merge : result -> result -> result
diff --git a/src/plugins/wp/Why3Provers.ml b/src/plugins/wp/Why3Provers.ml
index ab50c9858b2de0a3fec9d8adc147994a3e0db981..46a1f714ab5902d7b9356ede7a3a0f879af75a54 100644
--- a/src/plugins/wp/Why3Provers.ml
+++ b/src/plugins/wp/Why3Provers.ml
@@ -109,3 +109,5 @@ let has_shortcut p s =
           (Why3.Whyconf.get_prover_shortcuts (config ())) with
   | None -> false
   | Some p' -> Why3.Whyconf.Prover.equal p p'
+
+(* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/calculus.ml b/src/plugins/wp/calculus.ml
index b380551db5cb297379d100977a108ff8731e173a..ba69ffcc2a1fc8876454475f345855976e8303fb 100644
--- a/src/plugins/wp/calculus.ml
+++ b/src/plugins/wp/calculus.ml
@@ -495,9 +495,8 @@ module Cfg (W : Mcfg.S) = struct
        | Mcfg.SC_Global -> "global"
        | Mcfg.SC_Block_in -> "block in"
        | Mcfg.SC_Block_out -> "block out"
-       | Mcfg.SC_Function_in -> "function in"
-       | Mcfg.SC_Function_frame -> "function frame"
-       | Mcfg.SC_Function_out -> "function out" )
+       | Mcfg.SC_Frame_in -> "frame in"
+       | Mcfg.SC_Frame_out -> "frame out" )
       (Pretty_utils.pp_list  ~sep:", " Printer.pp_varinfo) vars;
     match scope with
     | Mcfg.(SC_Block_in | SC_Block_out) when vars = [] -> obj
@@ -564,13 +563,12 @@ module Cfg (W : Mcfg.S) = struct
           Wp_error.unsupported "strange CFGs."
       | Cil2cfg.VfctIn ->
           let obj = get_only_succ env cfg v in
-          let obj = wp_scope wenv formals Mcfg.SC_Function_in obj in
           let obj = wp_scope wenv [] Mcfg.SC_Global obj in
           obj
       | Cil2cfg.VblkIn (Cil2cfg.Bfct, b) ->
           let obj = get_only_succ env cfg v in
           let obj = wp_scope wenv b.blocals Mcfg.SC_Block_in obj in
-          let obj = wp_scope wenv formals Mcfg.SC_Function_frame obj in
+          let obj = wp_scope wenv formals Mcfg.SC_Frame_in obj in
           obj
       | Cil2cfg.VblkOut (Cil2cfg.Bfct, b) ->
           let obj = get_only_succ env cfg v in
@@ -601,10 +599,9 @@ module Cfg (W : Mcfg.S) = struct
       | Cil2cfg.Vloop _ | Cil2cfg.Vloop2 _ ->
           let get_loop_head = fun n -> get_only_succ env cfg n in
           wp_loop env v e get_loop_head
-      | Cil2cfg.VfctOut
-      | Cil2cfg.Vexit ->
+      | Cil2cfg.VfctOut | Cil2cfg.VfctErr ->
           let obj = get_only_succ env cfg v (* exitpost / postcondition *) in
-          wp_scope wenv formals Mcfg.SC_Function_out obj
+          wp_scope wenv formals Mcfg.SC_Frame_out obj
       | Cil2cfg.Vend ->
           W.empty
           (* LC : unused entry point...
diff --git a/src/plugins/wp/cfgDump.ml b/src/plugins/wp/cfgDump.ml
index 90c0924ba5d8ce03e4f3a8febd9bfaad56e256bc..6091b24dc5af8716fc40177bdbc5c32f852adfd5 100644
--- a/src/plugins/wp/cfgDump.ml
+++ b/src/plugins/wp/cfgDump.ml
@@ -121,6 +121,7 @@ struct
   let add_assigns env (pid,_) k =
     let u = node () in
     Format.fprintf !out "  %a [ color=red , label=\"Assigns %a\" ] ;@." pretty u WpPropId.pp_propid pid ;
+    Format.fprintf !out "  %a -> %a [ style=dotted ] ;@." pretty u pretty k ;
     merge env u k
 
   let use_assigns _env _stmt region d k =
@@ -215,7 +216,9 @@ struct
             (fun (_,p) -> Format.fprintf fmt "\n@[<hov 2>Requires %a ;@]"
                 Printer.pp_predicate p) pre
       end ;
-    ignore pre ; merge env u k
+    ignore pre ;
+    Format.fprintf !out "  %a -> %a [ style=dotted ] ;@." pretty u pretty k ;
+    merge env u k
 
   let call env stmt _r kf _es ~pre ~post ~pexit ~assigns ~p_post ~p_exit =
     let u_post = List.fold_right (add_hyp env) post p_post in
@@ -231,9 +234,8 @@ struct
   let pp_scope sc fmt xs =
     let title = match sc with
       | Mcfg.SC_Global -> "Global"
-      | Mcfg.SC_Function_in -> "F-in"
-      | Mcfg.SC_Function_frame -> "F-frame"
-      | Mcfg.SC_Function_out -> "F-out"
+      | Mcfg.SC_Frame_in -> "F-in"
+      | Mcfg.SC_Frame_out -> "F-out"
       | Mcfg.SC_Block_in -> "B-in"
       | Mcfg.SC_Block_out -> "B-out"
     in begin
diff --git a/src/plugins/wp/cfgWP.ml b/src/plugins/wp/cfgWP.ml
index b8389519cc2b552a62d28100f2ae7c1b8b7ecab1..93a00b75b286d86d371db4ea118b5ad6d3951fe3 100644
--- a/src/plugins/wp/cfgWP.ml
+++ b/src/plugins/wp/cfgWP.ml
@@ -101,6 +101,10 @@ struct
   struct
     type t = effect
     let compare e1 e2 = P.compare e1.e_pid e2.e_pid
+    let pretty fmt e =
+      Format.fprintf fmt "@[<hov 2>EFFECT %a:@ %a@]"
+        P.pretty e.e_pid (Cvalues.pp_region M.pretty) e.e_region
+    [@@ warning "-32"]
   end
 
   module G = Qed.Collection.Make(TARGET)
@@ -140,9 +144,8 @@ struct
   (* -------------------------------------------------------------------------- *)
 
   let pp_vc fmt vc =
-    Format.fprintf fmt "%a@ @[<hov 2>Prove %a@]"
-      Pcond.dump vc.hyps
-      F.pp_pred vc.goal
+    Format.fprintf fmt "%a"
+      (Pcond.dump_bundle ~clause:"Context" ~goal:vc.goal) vc.hyps
 
   let pp_vcs fmt vcs =
     let k = ref 0 in
@@ -250,10 +253,6 @@ struct
       (fun vc (warn,hyp) -> assume_vc ?descr ?filter ?init ~warn [hyp] vc)
       vc whs
 
-  let passify_vc pa vc =
-    let hs = Passive.conditions pa (occurs_vc vc) in
-    assume_vc hs vc
-
   (* -------------------------------------------------------------------------- *)
   (* --- Branching                                                          --- *)
   (* -------------------------------------------------------------------------- *)
@@ -362,6 +361,14 @@ struct
       (fun g -> Splitter.merge_all merge_vcs (List.map (goal g) cases))
       targets
 
+  let passify_vc pa vc =
+    let hs = Passive.conditions pa (occurs_vc vc) in
+    assume_vc hs vc
+
+  let passify_vcs pa vcs =
+    if Passive.is_empty pa then vcs
+    else gmap (passify_vc pa) vcs
+
   (* -------------------------------------------------------------------------- *)
   (* --- Merge for Calculus                                                 --- *)
   (* -------------------------------------------------------------------------- *)
@@ -383,8 +390,8 @@ struct
       (fun () ->
          let sigma,pa1,pa2 = merge_sigma wp1.sigma wp2.sigma in
          let effects = Eset.union wp1.effects wp2.effects in
-         let vcs1 = gmap (passify_vc pa1) wp1.vcs in
-         let vcs2 = gmap (passify_vc pa2) wp2.vcs in
+         let vcs1 = passify_vcs pa1 wp1.vcs in
+         let vcs2 = passify_vcs pa2 wp2.vcs in
          let vcs = gmerge vcs1 vcs2 in
          { sigma = sigma ; vcs = vcs ; effects = effects }
       ) ()
@@ -651,15 +658,20 @@ struct
     if Clabels.is_here label then wp else
       in_wenv wenv wp
         (fun env wp ->
+           let frame = L.get_frame () in
            let s_here = L.current env in
-           let s_labl = L.mem_frame label in
-           let pa = Sigma.join s_here s_labl in
+           let s_frame =
+             if L.has_at_frame frame label then
+               L.mem_at_frame frame label
+             else
+               (L.set_at_frame frame label s_here ; s_here) in
+           let pa = Sigma.join s_here s_frame in
            let stop,effects = Eset.partition (is_stopeffect label) wp.effects in
            let vcs = Gmap.filter (not_posteffect stop) wp.vcs in
-           let vcs = gmap (passify_vc pa) vcs in
+           let vcs = passify_vcs pa vcs in
            let vcs = check_nothing stop vcs in
            let vcs = state_vcs stmt s_here vcs in
-           { sigma = Some s_here ; vcs=vcs ; effects=effects })
+           { sigma = Some s_frame ; vcs=vcs ; effects=effects })
 
   (* -------------------------------------------------------------------------- *)
   (* --- WP RULE : assignation                                              --- *)
@@ -806,8 +818,8 @@ struct
                   Some (Splitter.union (merge_vc) s1 s2)
                ) vcs1 vcs2
            else
-             let vcs1 = gmap (passify_vc pa1) wp1.vcs in
-             let vcs2 = gmap (passify_vc pa2) wp2.vcs in
+             let vcs1 = passify_vcs pa1 wp1.vcs in
+             let vcs2 = passify_vcs pa2 wp2.vcs in
              gbranch
                ~left:(assume_vc ~descr:"Then" ~stmt ~warn [cond])
                ~right:(assume_vc ~descr:"Else" ~stmt ~warn [p_not cond])
@@ -1044,6 +1056,7 @@ struct
     let seq_post = cc_havoc dom_call seq_result.pre in
     let seq_exit = cc_havoc dom_call (sigma_at wexit) in
     (* Pre-State *)
+    (* Passive: joined later by call_proper *)
     let sigma_pre, _, _ = Sigma.merge seq_post.pre seq_exit.pre in
     let formals = List.map (C.exp sigma_pre) es in
     let call = L.call kf formals in
@@ -1200,11 +1213,10 @@ struct
             let hs = M.frame (L.current env) in
             let vcs = gmap (assume_vc ~descr:"Heap" ~domain:true hs) wp.vcs in
             { wp with vcs }
-        | Mcfg.SC_Function_in -> wp
-        | Mcfg.SC_Function_frame ->
-            wp_scope env wp ~descr:"Function Frame" Enter xs
-        | Mcfg.SC_Function_out ->
-            wp_scope env wp ~descr:"Function Exit" Leave xs
+        | Mcfg.SC_Frame_in ->
+            wp_scope env wp ~descr:"Frame In" Enter xs
+        | Mcfg.SC_Frame_out ->
+            wp_scope env wp ~descr:"Frame Out" Leave xs
         | Mcfg.SC_Block_in ->
             wp_scope env wp ~descr:"Block In" Enter xs
         | Mcfg.SC_Block_out ->
@@ -1394,7 +1406,7 @@ struct
   let compile_lemma l = ignore (VCG.lemma l)
 
   let prove_lemma collection l =
-    if not l.lem_axiom then
+    if l.lem_kind <> `Axiom then
       begin
         let id = WpPropId.mk_lemma_id l in
         let def = VCG.lemma l in
diff --git a/src/plugins/wp/cil2cfg.ml b/src/plugins/wp/cil2cfg.ml
index 7cbbb3103136b9f29f396964e0a240e6fcdcc904..6f09908bfe3ea88747364b4bf55b7607d5b28fef 100644
--- a/src/plugins/wp/cil2cfg.ml
+++ b/src/plugins/wp/cil2cfg.ml
@@ -48,8 +48,8 @@ let pp_call_type fmt = function
   | Static kf -> Kernel_function.pretty fmt kf
 
 type node_type =
-  | Vstart | Vend | Vexit
-  | VfctIn | VfctOut (* TODO : not useful anymore -> Bfct *)
+  | Vstart | Vend
+  | VfctIn | VfctOut | VfctErr
   | VblkIn of block_type * block
   | VblkOut of block_type * block
   | Vstmt of stmt
@@ -82,7 +82,7 @@ let node_type_id t : node_id = match t with
   | Vstart -> (0, 0)
   | VfctIn -> (0, 1)
   | VfctOut -> (0, 2)
-  | Vexit -> (0, 3)
+  | VfctErr -> (0, 3)
   | Vend -> (0, 4)
   | Vstmt s | Vtest (true, s, _) | Vswitch (s,_) | Vcall (s, _, _, _) ->
       (1, s.sid)
@@ -113,8 +113,8 @@ let pp_node_type fmt n = match n with
   | Vstart -> Format.fprintf fmt "<start>"
   | VfctIn -> Format.fprintf fmt "<fctIn>"
   | VfctOut -> Format.fprintf fmt "<fctOut>"
+  | VfctErr -> Format.fprintf fmt "<fctErr>"
   | Vend -> Format.fprintf fmt "<end>"
-  | Vexit -> Format.fprintf fmt "<exit>"
   | VblkIn (bk,_) -> Format.fprintf fmt "<blkIn-%a>" pp_bkind bk
   | VblkOut (bk,_) -> Format.fprintf fmt "<blkOut-%a>" pp_bkind bk
   | Vcall (s, _, _, _) -> Format.fprintf fmt "<callIn-%d>" s.sid
@@ -146,7 +146,7 @@ let pp_node fmt v = VL.pretty fmt v
 
 let start_stmt_of_node v = match node_type v with
   | Vstart | Vtest (false, _, _) | VblkOut _
-  | VfctIn | VfctOut | Vend | Vexit | Vloop2 _ -> None
+  | VfctIn | VfctOut | VfctErr | Vend | Vloop2 _ -> None
   | VblkIn (bk, _) -> bkind_stmt bk
   | Vstmt s | Vtest (true, s, _) | Vloop (_, s) | Vswitch (s,_)
   | Vcall (s, _, _, _)
@@ -154,7 +154,7 @@ let start_stmt_of_node v = match node_type v with
 
 let node_stmt_opt v = match node_type v with
   | Vstart | Vtest (false, _, _)
-  | VfctIn | VfctOut | Vend | Vexit | Vloop2 _ -> None
+  | VfctIn | VfctOut | VfctErr | Vend | Vloop2 _ -> None
   | VblkIn (bk, _) | VblkOut (bk, _) -> bkind_stmt bk
   | Vstmt s | Vtest (true, s, _) | Vloop (_, s) | Vswitch (s,_)
   | Vcall (s, _, _, _)
@@ -479,14 +479,14 @@ let get_call_out_edges cfg v =
   in
   let en, ee = match node_type (edge_dst e1) ,
                      node_type (edge_dst e2) with
-  | _,  Vexit -> e1, e2
-  | Vexit, _  -> e2, e1
+  | _,  VfctErr -> e1, e2
+  | VfctErr, _  -> e2, e1
   | _, _ -> assert false
   in en, ee
 
 let get_edge_stmt e =
   match node_type (edge_dst e) with
-  | Vstart | VfctIn | Vexit | VfctOut -> None
+  | Vstart | VfctIn | VfctOut | VfctErr -> None
   | VblkIn (Bstmt s, _) | Vstmt s
   | Vcall (s,_,_,_) | Vtest (true, s, _) | Vswitch (s,_) -> Some s
   | Vloop (_,s) -> if is_back_edge e then None else Some s
@@ -497,7 +497,7 @@ let get_edge_labels e =
   let l = match node_type v_after with
     | Vstart -> assert false
     | VfctIn -> []
-    | Vexit | VfctOut -> [Clabels.post]
+    | VfctErr | VfctOut -> [Clabels.post]
     | VblkIn (Bstmt s, _)
     | Vcall (s,_,_,_) | Vstmt s | Vtest (true, s, _) | Vswitch (s,_) ->
         [Clabels.stmt s]
@@ -556,7 +556,7 @@ let get_exit_edges cfg src =
     let add_exit e acc =
       let dst = edge_dst e in
       match node_type dst with
-      | Vexit ->
+      | VfctErr ->
           debug
             "[get_exit_edges] add %a@." pp_edge e;
           (* (succ_e cfg dst) @ acc *)
@@ -660,12 +660,12 @@ let block_scope_for_edge cfg e =
   | VblkIn(Bstmt _,b) -> { b_opened=[b] ; b_closed=[] }
   | Vcall _
   | VblkIn _ | VblkOut _ | Vtest(false,_,_)
-  | VfctIn | VfctOut | Vstart | Vend | Vexit | Vloop2 _ ->
+  | VfctIn | VfctOut | VfctErr | Vstart | Vend | Vloop2 _ ->
       no_scope
 
 let has_exit cfg =
   try
-    let node = Hashtbl.find cfg.stmt_node (node_type_id Vexit) in
+    let node = Hashtbl.find cfg.stmt_node (node_type_id VfctErr) in
     match pred_e cfg node with
     | [] -> false
     | _ -> true
@@ -758,10 +758,10 @@ let init_cfg spec_only kf =
   let fct_in =  add_node env (VfctIn) in
   let _ = add_edge env start Enone fct_in in
   let fct_out =  add_node env (VfctOut) in
-  let nexit =  add_node env (Vexit) in
+  let fct_err =  add_node env (VfctErr) in
   let nend =  add_node env (Vend) in
   let _ = add_edge env fct_out Enone nend in
-  let _ = add_edge env nexit Enone nend in
+  let _ = add_edge env fct_err Enone nend in
   env, fct_in, fct_out
 
 let get_node env t =
@@ -883,7 +883,7 @@ and cfg_stmt env s next =
       setup_preconditions_proxies f;
       let in_call = get_stmt_node env s in
       add_edge env in_call Enone next;
-      let exit_node = get_node env (Vexit) in
+      let exit_node = get_node env VfctErr in
       add_edge env in_call Enone exit_node;
       in_call
   | Instr (Local_init(_,ConsInit (f, _, _), _)) ->
@@ -891,7 +891,7 @@ and cfg_stmt env s next =
       Statuses_by_call.setup_all_preconditions_proxies kf;
       let in_call = get_stmt_node env s in
       add_edge env in_call Enone next;
-      let exit_node = get_node env Vexit in
+      let exit_node = get_node env VfctErr in
       add_edge env in_call Enone exit_node;
       in_call
   | Instr _  | Return _ ->
diff --git a/src/plugins/wp/cil2cfg.mli b/src/plugins/wp/cil2cfg.mli
index 5df3e524af058178dea5bb714a87eb04ca8cf994..808e3b6cfc650f9761a087623de2a17845312855 100644
--- a/src/plugins/wp/cil2cfg.mli
+++ b/src/plugins/wp/cil2cfg.mli
@@ -70,8 +70,8 @@ val pp_call_type : Format.formatter -> call_type -> unit
 val get_call_type : exp -> call_type
 
 type node_type = private
-  | Vstart | Vend | Vexit
-  | VfctIn | VfctOut
+  | Vstart | Vend
+  | VfctIn | VfctOut | VfctErr
   | VblkIn of block_type * block
   | VblkOut of block_type * block
   | Vstmt of stmt
diff --git a/src/plugins/wp/doc/manual/wp.bib b/src/plugins/wp/doc/manual/wp.bib
index bcc4524f29d0569c6fa30a52b475ee1966715b73..cbe190e5609458dda0b3b93767fafdf007fdd7c8 100644
--- a/src/plugins/wp/doc/manual/wp.bib
+++ b/src/plugins/wp/doc/manual/wp.bib
@@ -98,6 +98,39 @@
   url = {http://ergo.lri.fr/papers/ergo.ps}
 }
 
+@inproceedings{CVC4,
+  url       = "http://www.cs.stanford.edu/~barrett/pubs/BCD+11.pdf",
+  author    = "Clark Barrett and Christopher L. Conway and Morgan Deters and
+               Liana Hadarean and Dejan Jovanovi{'{c}} and Tim King and
+               Andrew Reynolds and Cesare Tinelli",
+  title     = "{CVC4}",
+  booktitle = "Proceedings of the 23rd International Conference on Computer Aided Verification (CAV '11)",
+  series    = "Lecture Notes in Computer Science",
+  volume    = 6806,
+  publisher = "Springer",
+  editor    = "Ganesh Gopalakrishnan and Shaz Qadeer",
+  pages     = "171--177",
+  month     = jul,
+  year      = 2011,
+  note      = "Snowbird, Utah",
+  category  = "Conference Publications"
+}
+
+@InProceedings{Z3,
+author="de Moura, Leonardo
+and Bj{\o}rner, Nikolaj",
+editor="Ramakrishnan, C. R.
+and Rehof, Jakob",
+title="Z3: An Efficient SMT Solver",
+booktitle="Tools and Algorithms for the Construction and Analysis of Systems",
+year="2008",
+publisher="Springer Berlin Heidelberg",
+address="Berlin, Heidelberg",
+pages="337--340",
+abstract="Satisfiability Modulo Theories (SMT) problem is a decision problem for logical first order formulas with respect to combinations of background theories such as: arithmetic, bit-vectors, arrays, and uninterpreted functions. Z3 is a new and efficient SMT Solver freely available from Microsoft Research. It is used in various software verification and analysis applications.",
+isbn="978-3-540-78800-3"
+}
+
 @inproceedings{qed,
   author    = {Lo{\"{\i}}c Correnson},
   title     = {Qed. Computing What Remains to Be Proved},
diff --git a/src/plugins/wp/doc/manual/wp_plugin.tex b/src/plugins/wp/doc/manual/wp_plugin.tex
index 650b869af3ec4b4989e7e1e3333dc3833c965ceb..a690b944e0e6c4bcf93cee5cb064bdff5e15494c 100644
--- a/src/plugins/wp/doc/manual/wp_plugin.tex
+++ b/src/plugins/wp/doc/manual/wp_plugin.tex
@@ -10,51 +10,13 @@ This plug-in computes proof obligations of programs annotated with
 \textsf{ACSL} annotations by \emph{weakest precondition calculus},
 using a parametrized memory model to represent pointers and heap
 values. The proof obligations may then be discharged by external
-decision procedures, which range over automated theorem provers such
-as \textsf{Alt-Ergo}~\cite{AltErgo2006}, interactive proof assistants
-like \textsf{Coq}~\cite{Coq84} and the interactive proof manager
-\textsf{Why3}~\cite{Why3}.
-
-This chapter describes how to use the plug-in, from the
-\textsf{Frama-C} graphical user interface (section~\ref{wp-gui}), from
-the command line (section~\ref{wp-cmdline}), or from another plug-in
-(section~\ref{wp-api}).  Additionally, the combination of the \textsf{WP}
-plug-in with the load and save commands of \textsf{Frama-C} and/or the
-\texttt{-then} command-line option is explained in section~\ref{wp-persistent}.
-
-\clearpage
-%-----------------------------------------------------------------------------
-\section{Installing Provers}
-\label{wp-install-provers}
-%-----------------------------------------------------------------------------
-
-The \textsf{WP} plug-in requires external provers to work.
-The recommended versions for external provers are:
-\begin{center}
-  \begin{tabular}{crlc}
-    Prover & Versions & Download &\\
-    \hline
-    \textsf{Why3} & \verb|1.3.1| &
-    \url{http://why3.lri.fr} & \cite{Why3}\\
-    \textsf{Alt-Ergo} & \verb|2.0.0|  &
-    \url{http://alt-ergo.ocamlpro.com} & \cite{AltErgo2006}\\
-    % \textsf{Coq} & \verb|8.9.0| &
-    % \url{http://coq.inria.fr} & \cite{Coq84}\\
-  \end{tabular}
-\end{center}
-
-Recent \textsf{OPAM}-provided versions should work smoothly.
-Other versions might be supported as well, typically, as far as we know:
-\begin{itemize}
-\item \textsf{Alt-Ergo} \verb+2.2.0+ and \verb+2.3.0+, although distributed under a non-commercial licence.
-% \item \textsf{Coq} \verb+8.7.2+ and \verb+8.8.2+, although proof scripts compatibility can be an issue.
-\item \textsf{Why3} \verb+1.3.1+.
-\end{itemize}
-
-Other provers, like \textsf{Coq}, \textsf{Gappa}, \textsf{Z3}, \textsf{CVC3},
-\textsf{CVC4}, \textsf{PVS}, and many others, are accessible from
-\textsf{WP} through \textsf{Why3}. We refer the user to the manual of
-\textsf{Why3} to handle specific configuration tasks.
+automated theorem provers such as
+\textsf{Alt-Ergo}~\cite{AltErgo2006},
+\textsf{CVC4}~\cite{CVC4} and
+\textsf{Z3}~\cite{Z3}
+or by interactive proof assistants
+like \textsf{Coq}~\cite{Coq84} and more generally, any automated or interactive
+prover supported by \textsf{Why3}~\cite{Why3}.
 
 \clearpage
 %-----------------------------------------------------------------------------
@@ -1018,6 +980,10 @@ all unproved proof obligations are sent to external decision procedures.
 
 Support for \textsf{Why-3 IDE} is no longer provided.
 
+Since \textsf{Frama-C 22.0} (Titanium) support for Coq interactive prover has
+been added and might also work with other interactive provers.
+See \texttt{-wp-interactive <mode>} option for details.
+
 \begin{description}
 \item[\tt -wp-prover <dp,...>] selects the decision procedures used to
   discharge proof obligations. See below for supported provers.  By
@@ -1028,6 +994,13 @@ Support for \textsf{Why-3 IDE} is no longer provided.
   It is possible to ask for several decision procedures to be tried.
   For each goal, the first decision procedure that succeeds cancels the
   other attempts.
+\item[\tt -wp-interactive <mode>] selects the interaction mode with
+  interactive provers such as Coq. Three modes are available:
+  \texttt{"batch"} mode only check existing scripts (the default);
+  \texttt{"edit"} mode opens the default prover editor on each generated goal;
+  \texttt{"fix"} mode only opens
+  editor for non-proved goals. New scripts are created in the \texttt{interactive}
+  directory of \textsf{WP} session (see option \texttt{-wp-session <dir>}).
 \item[\tt -wp-detect] lists the provers available for \textsf{Why-3}.
   This command can only work if \textsf{why3} API was installed before building and
   installing \textsf{Frama-C}.
@@ -1053,6 +1026,8 @@ Support for \textsf{Why-3 IDE} is no longer provided.
   to the decision prover (defaults to 10 seconds).
 \item[\tt -wp-smoke-timeout <n>] sets the timeout (in seconds) for smoke tests
   (see \verb+-wp-smoke-tests+, defaults to 5 seconds).
+\item[\tt -wp-interactive-timeout <n>] sets the timeout (in seconds) for checking
+  edited scripts with interactive provers (defaults to 30 seconds).
 \item[\tt -wp-time-extra <n>] additional time allocated to provers when
   replaying a script. This is used to cope with variable machine load.
   Default is \verb+5s+.
@@ -1455,7 +1430,7 @@ several categories of formatters (PO stands for \emph{Proof Obligations}):
 can be written \verb+"%.."+ or \verb+"%{..}"+. When \verb+range+ is used
 instead of \verb+steps+, the maximal number $n$ of steps is printed as a range $a..b$ that
 contains $n$.
-When option \verb+-report-json+ is used, the previous rank $a$ and $b$ are kept when
+When option \verb+-wp-report-json+ is used, the previous rank $a$ and $b$ are kept when
 available and still fits with the new maximal step number. Otherwise, $a$ and $b$ are re-adjusted
 following an heurisitics designed to increase the stability for non-regression testing.
 
diff --git a/src/plugins/wp/doc/manual/wp_simplifier.tex b/src/plugins/wp/doc/manual/wp_simplifier.tex
index 4dda147545e9ef5766ef6d3e8696a953e6d3443a..2e3e82551aa4e94a1ab36ac54e667b9e3ff97d0c 100644
--- a/src/plugins/wp/doc/manual/wp_simplifier.tex
+++ b/src/plugins/wp/doc/manual/wp_simplifier.tex
@@ -344,13 +344,3 @@ following heuristic:
 
 Inside the same level of priority, alternatives are kept in their original
 order.
-
-
-
-
-
-
-
-
-
-
diff --git a/src/plugins/wp/driver.mll b/src/plugins/wp/driver.mll
index 06fc29c30ff8ddb988ac2bc9297ddab8563caa34..9e4d708e49395f25207af0caa10f356244a39d01 100644
--- a/src/plugins/wp/driver.mll
+++ b/src/plugins/wp/driver.mll
@@ -72,6 +72,10 @@
     lexbuf.lex_curr_p <-
       { lexbuf.lex_curr_p with pos_lnum = succ lexbuf.lex_curr_p.pos_lnum }
 
+  (*TODO[LC] Think about projectification ... *)
+  let dkey = Wp_parameters.register_category "includes"
+  let dkey_driver = Wp_parameters.register_category "driver"
+
   let rec conv_bal default (name,bal) =
     match bal with
     | `Default -> conv_bal default (name,default)
@@ -460,7 +464,7 @@ and bal = parse
   let load_file ?(ontty=`Transient) file =
     try
       let path = Datatype.Filepath.of_string file in
-      Wp_parameters.feedback ~ontty "Loading driver '%a'"
+      Wp_parameters.feedback ~dkey:dkey_driver ~ontty "Loading driver '%a'"
         Datatype.Filepath.pretty path;
       let driver_dir = Filename.dirname file in
       let inc = open_in file in
@@ -482,10 +486,6 @@ and bal = parse
         ~current:false
         "Error in driver '%s': %s" file (Printexc.to_string exn)
 
-  (*TODO[LC] Think about projectification ... *)
-  let dkey = Wp_parameters.register_category "includes"
-  let dkey_driver = Wp_parameters.register_category "driver"
-
   let loaded : (string list, driver) Hashtbl.t =Hashtbl.create 10
   let load_driver () =
     let drivers = Wp_parameters.Drivers.get () in
diff --git a/src/plugins/wp/gui/GuiGoal.ml b/src/plugins/wp/gui/GuiGoal.ml
index 071f6a3ef89b6d980ef56b9f4605d7bf58a09142..6444533328f30bf4535ff92e0bc6b826793bc71d 100644
--- a/src/plugins/wp/gui/GuiGoal.ml
+++ b/src/plugins/wp/gui/GuiGoal.ml
@@ -421,6 +421,25 @@ class pane (gprovers : GuiConfig.provers) =
             save_script#set_enabled save ;
           end
 
+    method private update_pending kind proof n =
+      match ProofEngine.current proof with
+      | `Main | `Internal _ ->
+          next#set_enabled false ;
+          prev#set_enabled false ;
+          if n = 1 then
+            Pretty_utils.ksfprintf status#set_text "One %s Goal" kind
+          else
+            Pretty_utils.ksfprintf status#set_text "%d %s Goals" n kind
+      | `Leaf(k,_) ->
+          prev#set_enabled (0 < k) ;
+          next#set_enabled (k+1 < n) ;
+          if k = 0 && n = 1 then
+            Pretty_utils.ksfprintf status#set_text
+              "Last %s Goal" kind
+          else
+            Pretty_utils.ksfprintf status#set_text
+              "%s Goal #%d /%d" kind (succ k) n
+
     method private update_statusbar =
       match state with
       | Empty ->
@@ -442,20 +461,27 @@ class pane (gprovers : GuiConfig.provers) =
             help#set_enabled
               (match state with Proof _ -> not helpmode | _ -> false) ;
             match ProofEngine.status proof with
-            | `Main ->
+            | `Unproved ->
                 icon#set_icon GuiProver.ko_status ;
                 next#set_enabled false ;
                 prev#set_enabled false ;
                 cancel#set_enabled false ;
                 forward#set_enabled false ;
                 status#set_text "Non Proved Property" ;
-            | `Invalid ->
+            | `Invalid | `StillResist 0 ->
                 icon#set_icon GuiProver.wg_status ;
                 next#set_enabled false ;
                 prev#set_enabled false ;
                 cancel#set_enabled false ;
                 forward#set_enabled false ;
                 status#set_text "Invalid Smoke-test" ;
+            | `Passed ->
+                icon#set_icon GuiProver.smoke_status ;
+                next#set_enabled false ;
+                prev#set_enabled false ;
+                cancel#set_enabled false ;
+                forward#set_enabled false ;
+                status#set_text "Passed Smoke Test" ;
             | `Proved ->
                 icon#set_icon GuiProver.ok_status ;
                 next#set_enabled false ;
@@ -474,23 +500,12 @@ class pane (gprovers : GuiConfig.provers) =
                 icon#set_icon GuiProver.ko_status ;
                 forward#set_enabled nofork ;
                 cancel#set_enabled nofork ;
-                match ProofEngine.current proof with
-                | `Main | `Internal _ ->
-                    next#set_enabled false ;
-                    prev#set_enabled false ;
-                    if n = 1 then
-                      Pretty_utils.ksfprintf status#set_text "One Pending Goal"
-                    else
-                      Pretty_utils.ksfprintf status#set_text "%d Pending Goals" n
-                | `Leaf(k,_) ->
-                    prev#set_enabled (0 < k) ;
-                    next#set_enabled (k+1 < n) ;
-                    if k = 0 && n = 1 then
-                      Pretty_utils.ksfprintf status#set_text
-                        "Last Pending Goal"
-                    else
-                      Pretty_utils.ksfprintf status#set_text
-                        "%d/%d Pending Goals" (succ k) n
+                self#update_pending "Pending" proof n ;
+            | `StillResist n ->
+                icon#set_icon GuiProver.smoke_status ;
+                forward#set_enabled nofork ;
+                cancel#set_enabled nofork ;
+                self#update_pending "Smoking" proof n ;
           end
 
     method private update_tacticbar =
@@ -650,9 +665,10 @@ class pane (gprovers : GuiConfig.provers) =
                 self#search proof fork
               else
                 begin
+                  let provers = List.map (fun e -> e#prover) provers in
                   ProverScript.search
                     ~depth ~width ~auto
-                    ~provers:[ VCS.NativeAltErgo ]
+                    ~provers
                     ~result:
                       (fun wpo prv res ->
                          text#printf "[%a] %a : %a@."
diff --git a/src/plugins/wp/gui/GuiNavigator.ml b/src/plugins/wp/gui/GuiNavigator.ml
index a6bfe8c5311134b3378d4ff6fe49ca9145052b34..48b88111f836a747b202dd51c871d2e29484da20 100644
--- a/src/plugins/wp/gui/GuiNavigator.ml
+++ b/src/plugins/wp/gui/GuiNavigator.ml
@@ -263,7 +263,7 @@ class behavior
                 | Some m , _ -> m
                 | None , VCS.NativeCoq -> VCS.EditMode
                 | None , VCS.NativeAltErgo -> VCS.FixMode
-                | _ -> VCS.BatchMode in
+                | _ -> if VCS.is_auto prover then VCS.BatchMode else VCS.FixMode in
               schedule (Prover.prove w ~mode ~result prover) ;
               refresh w
       end
@@ -291,7 +291,8 @@ class behavior
     val popup_tip  = new Widget.popup ()
     val popup_ergo = new Widget.popup ()
     val popup_coq  = new Widget.popup ()
-    val popup_why3 = new Widget.popup ()
+    val popup_why3_auto = new Widget.popup ()
+    val popup_why3_inter = new Widget.popup ()
     val mutable popup_target = None
 
     method private popup_delete () =
@@ -327,8 +328,10 @@ class behavior
         popup_tip#add_item ~label:"Run Script" ~callback:(self#popup_run BatchMode) ;
         popup_tip#add_item ~label:"Edit Proof" ~callback:(self#popup_run EditMode) ;
         popup_tip#add_item ~label:"Delete Script" ~callback:(self#popup_delete_script) ;
-        self#add_popup_proofmodes popup_why3
-          [ "Run",BatchMode ] ;
+        popup_why3_auto#add_item ~label:"Run Prover" ~callback:(self#popup_run VCS.BatchMode) ;
+        popup_why3_inter#add_item ~label:"Check Script" ~callback:(self#popup_run VCS.BatchMode) ;
+        popup_why3_inter#add_item ~label:"Edit Script" ~callback:(self#popup_run VCS.EditMode) ;
+        popup_why3_inter#add_item ~label:"Fixup Script" ~callback:(self#popup_run VCS.FixMode) ;
         self#add_popup_proofmodes popup_ergo
           [ "Run",BatchMode ; "Open Altgr-Ergo on Fail",EditMode ; "Open Altgr-Ergo",EditMode ] ;
         self#add_popup_proofmodes popup_coq
@@ -344,7 +347,10 @@ class behavior
         | Some Qed -> popup_qed#run ()
         | Some NativeCoq -> popup_coq#run ()
         | Some NativeAltErgo -> popup_ergo#run ()
-        | Some (Why3 _) -> popup_why3#run ()
+        | Some (Why3 _ as p) ->
+            if VCS.is_auto p
+            then popup_why3_auto#run ()
+            else popup_why3_inter#run ()
       end
 
     method private action w p =
diff --git a/src/plugins/wp/gui/GuiProver.ml b/src/plugins/wp/gui/GuiProver.ml
index 7a37b05f13126b95f785abc8b10711dd26e74117..e89389d6cdf08deac6f6f1b7f749121863b9e658 100644
--- a/src/plugins/wp/gui/GuiProver.ml
+++ b/src/plugins/wp/gui/GuiProver.ml
@@ -24,6 +24,7 @@ let no_status = `Share "theme/default/never_tried.png"
 let ok_status = `Share "theme/default/surely_valid.png"
 let ko_status = `Share "theme/default/unknown.png"
 let wg_status = `Share "theme/default/surely_invalid.png"
+let smoke_status = `Share "theme/default/valid_under_hyp.png"
 
 let filter = function
   | VCS.Qed | VCS.Tactical | VCS.NativeCoq -> false
diff --git a/src/plugins/wp/gui/GuiProver.mli b/src/plugins/wp/gui/GuiProver.mli
index cd297753bb8f85419ab6c785a1b3fd5eb795d577..6cc37b2e8be081e06ae2ded0f0c9dc1fe9e58b26 100644
--- a/src/plugins/wp/gui/GuiProver.mli
+++ b/src/plugins/wp/gui/GuiProver.mli
@@ -26,6 +26,7 @@ val no_status : icon
 val ok_status : icon
 val ko_status : icon
 val wg_status : icon
+val smoke_status : icon
 
 val filter : VCS.prover -> bool
 
diff --git a/src/plugins/wp/gui/GuiSequent.ml b/src/plugins/wp/gui/GuiSequent.ml
index 9576660cdd5805d35e7c937c4433d1fe795892f4..8792a599e948d846679b987f97d91a0f52fa1649 100644
--- a/src/plugins/wp/gui/GuiSequent.ml
+++ b/src/plugins/wp/gui/GuiSequent.ml
@@ -341,7 +341,7 @@ class pcond
     (focus : step_selection)
     (plang : Pcond.state) =
   object(self)
-    inherit Pcond.sequence plang as super
+    inherit Pcond.seqengine plang as super
 
     (* All displayed entries *)
     val mutable domain = Vars.empty
diff --git a/src/plugins/wp/mcfg.ml b/src/plugins/wp/mcfg.ml
index 1961d71cf9088927f26d864d29bde37787ada17e..873001be1ebceef7f7c3212b4b449f6f02319a6d 100644
--- a/src/plugins/wp/mcfg.ml
+++ b/src/plugins/wp/mcfg.ml
@@ -24,9 +24,8 @@ open Cil_types
 
 type scope =
   | SC_Global
-  | SC_Function_in    (* Just before the pre-state *)
-  | SC_Function_frame (* Just after the introduction of formals *)
-  | SC_Function_out   (* Post-state *)
+  | SC_Frame_in
+  | SC_Frame_out
   | SC_Block_in
   | SC_Block_out
 
diff --git a/src/plugins/wp/prover.ml b/src/plugins/wp/prover.ml
index 78092c65d91230a40272035b3714575a84da6e1a..83b432ac6c284ec2826c9f5c99420d525a7bbcc4 100644
--- a/src/plugins/wp/prover.ml
+++ b/src/plugins/wp/prover.ml
@@ -40,7 +40,7 @@ let dispatch ?(config=VCS.default) mode prover wpo =
         ProverWhy3.prove
           ~timeout:(VCS.get_timeout ~smoke config)
           ~steplimit:(VCS.get_stepout config)
-          ~prover wpo
+          ~mode ~prover wpo
   end
 
 let started ?start wpo =
@@ -112,7 +112,8 @@ let spawn wpo ~delayed
     let process (mode,prover) =
       prove wpo ?config ~mode ?start ?progress ?result prover in
     let all = Wp_parameters.RunAllProvers.get() in
-    ProverTask.spawn ?monitor ?pool ~all
+    let smoke = Wpo.is_smoke_test wpo in
+    ProverTask.spawn ?monitor ?pool ~all ~smoke
       (List.map
          (fun mp ->
             let prover = snd mp in
@@ -124,3 +125,5 @@ let spawn wpo ~delayed
     let thread = Task.thread process in
     let server = ProverTask.server () in
     Task.spawn server ?pool thread
+
+(* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/prover.mli b/src/plugins/wp/prover.mli
index 6a2711c2704f71a1ba7ba1f2e7346f3728aa83f1..32e1ca6ff6a93ba513a1851a0f108fb008ba5df1 100644
--- a/src/plugins/wp/prover.mli
+++ b/src/plugins/wp/prover.mli
@@ -26,6 +26,11 @@ open VCS
 (* --- Prover Implementation against Task API                             --- *)
 (* -------------------------------------------------------------------------- *)
 
+val simplify :
+  ?start:(Wpo.t -> unit) ->
+  ?result:(Wpo.t -> prover -> result -> unit) ->
+  Wpo.t -> bool Task.task
+
 val prove : Wpo.t ->
   ?config:config ->
   ?mode:mode ->
diff --git a/src/plugins/wp/register.ml b/src/plugins/wp/register.ml
index 28e4daf8012378928a8072fbae490f95900b676a..180f896898a3d3500500355a08f36f435393951e 100644
--- a/src/plugins/wp/register.ml
+++ b/src/plugins/wp/register.ml
@@ -89,29 +89,46 @@ let wp_iter_model ?ip ?index job =
     Fmap.iter (fun kf ms -> Models.iter (fun m -> job kf m) ms) !pool
   end
 
-let wp_print_memory_context kf m hyp fmt =
+let wp_print_memory_context kf bhv fmt =
   begin
     let printer = new Printer.extensible_printer () in
     let pp_vdecl = printer#without_annot printer#vdecl in
-    Format.fprintf fmt
-      "@[<hv 0>@[<hv 3>/*@@@ behavior %s:" (WpContext.MODEL.id m) ;
-    List.iter (MemoryContext.pp_clause fmt) hyp ;
+    Format.fprintf fmt "@[<hv 0>@[<hv 3>/*@@@ %a" Cil_printer.pp_behavior bhv ;
     let vkf = Kernel_function.get_vi kf in
     Format.fprintf fmt "@ @]*/@]@\n@[<hov 2>%a;@]@\n"
       pp_vdecl vkf ;
   end
 
+let wp_compute_memory_context model =
+  let hypotheses_computer = WpContext.compute_hypotheses model in
+  let name = WpContext.MODEL.id model in
+  MemoryContext.compute name hypotheses_computer
+
 let wp_warn_memory_context () =
   begin
     wp_iter_model
       begin fun kf m ->
-        let hyp = WpContext.compute_hypotheses m kf in
-        if hyp <> [] then
-          Wp_parameters.warning
-            ~current:false
-            "@[<hv 0>Memory model hypotheses for function '%s':@ %t@]"
-            (Kernel_function.get_name kf)
-            (wp_print_memory_context kf m hyp)
+        let hypotheses_computer = WpContext.compute_hypotheses m in
+        let model = WpContext.MODEL.id m in
+        let hyp = MemoryContext.get_behavior kf model hypotheses_computer in
+        match hyp with
+        | None -> ()
+        | Some bhv ->
+            Wp_parameters.warning
+              ~current:false
+              "@[<hv 0>Memory model hypotheses for function '%s':@ %t@]"
+              (Kernel_function.get_name kf)
+              (wp_print_memory_context kf bhv)
+      end
+  end
+
+let wp_insert_memory_context model =
+  begin
+    Wp_parameters.iter_fct
+      begin fun kf ->
+        let hyp_computer = WpContext.compute_hypotheses model in
+        let model_id = WpContext.MODEL.id model in
+        MemoryContext.add_behavior kf model_id hyp_computer
       end
   end
 
@@ -217,21 +234,14 @@ module GOALS = Wpo.S.Set
 
 let scheduled = ref 0
 let exercised = ref 0
-let spy = ref false
 let session = ref GOALS.empty
-let proved = ref GOALS.empty
 let provers = ref PM.empty
 
-let begin_session () = session := GOALS.empty ; spy := true
-let clear_session () = session := GOALS.empty
-let end_session   () = session := GOALS.empty ; spy := false
-let iter_session f  = GOALS.iter f !session
-
 let clear_scheduled () =
   begin
     scheduled := 0 ;
     exercised := 0 ;
-    proved := GOALS.empty ;
+    session := GOALS.empty ;
     provers := PM.empty ;
   end
 
@@ -262,14 +272,15 @@ let add_time s t =
       if t > s.u_time then s.u_time <- t ;
     end
 
-let do_list_scheduled iter_on_goals =
+let do_list_scheduled goals =
   clear_scheduled () ;
-  iter_on_goals
+  Bag.iter
     (fun goal ->
        begin
          incr scheduled ;
-         if !spy then session := GOALS.add goal !session ;
-       end) ;
+         session := GOALS.add goal !session ;
+       end)
+    goals ;
   match !scheduled with
   | 0 -> Wp_parameters.warning ~current:false "No goal generated"
   | 1 -> Wp_parameters.feedback "1 goal scheduled"
@@ -353,8 +364,6 @@ let do_wpo_stat goal prover res =
   | Failed | Invalid ->
       s.failed <- succ s.failed
   | Valid ->
-      if not (Wpo.is_tactic goal) then
-        proved := GOALS.add goal !proved ;
       s.proved <- succ s.proved ;
       add_step s res.prover_steps ;
       add_time s res.prover_time ;
@@ -374,19 +383,21 @@ let results g =
     (Wpo.get_results g)
 
 let do_wpo_failed goal =
+  let updating = Cache.is_updating () in
   match results goal with
   | [p,r] ->
-      Wp_parameters.result "[%a] Goal %s : %a%a"
+      Wp_parameters.result "[%a] Goal %s : %t%a"
         VCS.pp_prover p (Wpo.get_gid goal)
-        (VCS.pp_result_qualif p) r pp_warnings goal
+        (VCS.pp_result_qualif ~updating p r) pp_warnings goal
   | pres ->
       Wp_parameters.result "[Failed] Goal %s%t" (Wpo.get_gid goal)
         begin fun fmt ->
           pp_warnings fmt goal ;
           List.iter
             (fun (p,r) ->
-               Format.fprintf fmt "@\n%8s: @[<hv>%a@]"
-                 (VCS.title_of_prover p) (VCS.pp_result_qualif p) r
+               Format.fprintf fmt "@\n%8s: @[<hv>%t@]"
+                 (VCS.title_of_prover p)
+                 (VCS.pp_result_qualif ~updating p r)
             ) pres ;
         end
 
@@ -399,11 +410,12 @@ let do_wpo_smoke status goal =
     (Wpo.get_gid goal)
     begin fun fmt ->
       pp_warnings fmt goal ;
+      let updating = Cache.is_updating () in
       List.iter
         (fun (p,r) ->
-           Format.fprintf fmt "@\n%8s: @[<hv>%a@]"
+           Format.fprintf fmt "@\n%8s: @[<hv>%t@]"
              (VCS.title_of_prover p)
-             (VCS.pp_result_qualif p) r
+             (VCS.pp_result_qualif ~updating p r)
         ) (results goal) ;
     end
 
@@ -436,10 +448,11 @@ let do_wpo_success goal s =
             VCS.pp_prover script (Wpo.get_gid goal)
       | Some prover ->
           let result = Wpo.get_result goal prover in
+          let updating = Cache.is_updating () in
           Wp_parameters.feedback ~ontty:`Silent
-            "[%a] Goal %s : %a"
+            "[%a] Goal %s : %t"
             VCS.pp_prover prover (Wpo.get_gid goal)
-            (VCS.pp_result_qualif prover) result
+            (VCS.pp_result_qualif ~updating prover result)
     end
 
 let do_report_time fmt s =
@@ -510,12 +523,15 @@ let do_report_scheduled () =
   else
   if !scheduled > 0 then
     begin
-      let proved = GOALS.cardinal !proved in
+      let passed = GOALS.fold
+          (fun g n ->
+             if Wpo.is_passed g then succ n else n
+          ) !session 0 in
       let mode = Cache.get_mode () in
       if mode <> Cache.NoCache then do_report_cache_usage mode ;
       Wp_parameters.result "%t"
         begin fun fmt ->
-          Format.fprintf fmt "Proved goals: %4d / %d@\n" proved !scheduled ;
+          Format.fprintf fmt "Proved goals: %4d / %d@\n" passed !scheduled ;
           Pretty_utils.pp_items
             ~min:12 ~align:`Left
             ~title:(fun (prover,_) -> VCS.title_of_prover prover)
@@ -535,7 +551,7 @@ let do_list_scheduled_result () =
 (* ---  Proving                                                         --- *)
 (* ------------------------------------------------------------------------ *)
 
-type mode = {
+type script = {
   mutable tactical : bool ;
   mutable update : bool ;
   mutable depth : int ;
@@ -545,24 +561,24 @@ type mode = {
   mutable provers : (VCS.mode * VCS.prover) list ;
 }
 
-let spawn_wp_proofs_iter ~mode iter_on_goals =
-  if mode.tactical || mode.provers<>[] then
+let spawn_wp_proofs ~script goals =
+  if script.tactical || script.provers<>[] then
     begin
       let server = ProverTask.server () in
       ignore (Wp_parameters.Share.get_dir "."); (* To prevent further errors *)
-      iter_on_goals
+      Bag.iter
         (fun goal ->
-           if  mode.tactical
+           if  script.tactical
             && not (Wpo.is_trivial goal)
-            && (mode.auto <> [] || ProofSession.exists goal)
+            && (script.auto <> [] || ProofSession.exists goal)
            then
              ProverScript.spawn
                ~failed:false
-               ~auto:mode.auto
-               ~depth:mode.depth
-               ~width:mode.width
-               ~backtrack:mode.backtrack
-               ~provers:(List.map snd mode.provers)
+               ~auto:script.auto
+               ~depth:script.depth
+               ~width:script.width
+               ~backtrack:script.backtrack
+               ~provers:(List.map snd script.provers)
                ~start:do_wpo_start
                ~progress:do_progress
                ~result:do_wpo_result
@@ -575,8 +591,8 @@ let spawn_wp_proofs_iter ~mode iter_on_goals =
                ~progress:do_progress
                ~result:do_wpo_result
                ~success:do_wpo_success
-               mode.provers
-        ) ;
+               script.provers
+        ) goals ;
       Task.on_server_wait server do_wpo_wait ;
       Task.launch server
     end
@@ -588,19 +604,20 @@ let env_script_update () =
   try Sys.getenv "FRAMAC_WP_SCRIPT" = "update"
   with Not_found -> false
 
-let compute_provers ~mode =
-  mode.provers <- List.fold_right
-      (fun pname prvs ->
-         match VCS.prover_of_name pname with
-         | None -> prvs
-         | Some VCS.Tactical ->
-             mode.tactical <- true ;
-             if pname = "tip" || env_script_update () then
-               mode.update <- true ;
-             prvs
-         | Some prover ->
-             (VCS.mode_of_prover_name pname , prover) :: prvs)
-      (get_prover_names ()) []
+let compute_provers ~mode ~script =
+  script.provers <- List.fold_right
+      begin fun pname prvs ->
+        match VCS.parse_prover pname with
+        | None -> prvs
+        | Some VCS.Tactical ->
+            script.tactical <- true ;
+            if pname = "tip" || env_script_update () then
+              script.update <- true ;
+            prvs
+        | Some prover ->
+            let pmode = if VCS.is_auto prover then VCS.BatchMode else mode in
+            (pmode , prover) :: prvs
+      end (get_prover_names ()) []
 
 let dump_strategies =
   let once = ref true in
@@ -613,18 +630,18 @@ let dump_strategies =
                  Format.fprintf fmt "@\n  '%s': %s" h#id h#title
                )))
 
-let default_mode () = {
+let default_script_mode () = {
   tactical = false ; update=false ; provers = [] ;
   depth=0 ; width = 0 ; auto=[] ; backtrack = 0 ;
 }
 
-let compute_auto ~mode =
-  mode.auto <- [] ;
-  mode.width <- Wp_parameters.AutoWidth.get () ;
-  mode.depth <- Wp_parameters.AutoDepth.get () ;
-  mode.backtrack <- max 0 (Wp_parameters.BackTrack.get ()) ;
+let compute_auto ~script =
+  script.auto <- [] ;
+  script.width <- Wp_parameters.AutoWidth.get () ;
+  script.depth <- Wp_parameters.AutoDepth.get () ;
+  script.backtrack <- max 0 (Wp_parameters.BackTrack.get ()) ;
   let auto = Wp_parameters.Auto.get () in
-  if mode.depth <= 0 || mode.width <= 0 then
+  if script.depth <= 0 || script.width <= 0 then
     ( if auto <> [] then
         Wp_parameters.feedback
           "Auto-search deactivated because of 0-depth or 0-width" )
@@ -634,22 +651,22 @@ let compute_auto ~mode =
         (fun id ->
            if id = "?" then dump_strategies ()
            else
-             try mode.auto <- Strategy.lookup ~id :: mode.auto
+             try script.auto <- Strategy.lookup ~id :: script.auto
              with Not_found ->
                Wp_parameters.error ~current:false
                  "Strategy -wp-auto '%s' unknown (ignored)." id
         ) auto ;
-      mode.auto <- List.rev mode.auto ;
-      if mode.auto <> [] then mode.tactical <- true ;
+      script.auto <- List.rev script.auto ;
+      if script.auto <> [] then script.tactical <- true ;
     end
 
-let do_update_session mode iter =
-  if mode.update then
+let do_update_session ~script goals =
+  if script.update then
     begin
       let removed = ref 0 in
       let updated = ref 0 in
       let invalid = ref 0 in
-      iter
+      Bag.iter
         begin fun goal ->
           let results = Wpo.get_results goal in
           let autoproof (p,r) =
@@ -680,7 +697,7 @@ let do_update_session mode iter =
                     ProofSession.save goal (ProofScript.encode scripts)
                   end
               end
-        end ;
+        end goals ;
       let r = !removed in
       let u = !updated in
       let f = !invalid in
@@ -697,34 +714,31 @@ let do_update_session mode iter =
           Wp_parameters.result "Updated session with %d new script%s to complete." f s );
     end
 
-let do_wp_proofs_iter ?provers ?tip iter =
-  let mode = default_mode () in
-  compute_provers ~mode ;
-  compute_auto ~mode ;
+let do_wp_proofs ?provers ?tip (goals : Wpo.t Bag.t) =
+  let script = default_script_mode () in
+  let mode = VCS.parse_mode (Wp_parameters.Interactive.get ()) in
+  compute_provers ~mode ~script ;
+  compute_auto ~script ;
   begin match provers with None -> () | Some prvs ->
-    mode.provers <- List.map (fun dp -> VCS.BatchMode , VCS.Why3 dp) prvs
+    script.provers <- List.map (fun dp -> VCS.BatchMode , VCS.Why3 dp) prvs
   end ;
   begin match tip with None -> () | Some tip ->
-    mode.tactical <- tip ;
-    mode.update <- tip ;
+    script.tactical <- tip ;
+    script.update <- tip ;
   end ;
-  let spawned = mode.tactical || mode.provers <> [] in
+  let spawned = script.tactical || script.provers <> [] in
   begin
-    if spawned then do_list_scheduled iter ;
-    spawn_wp_proofs_iter ~mode iter ;
+    if spawned then do_list_scheduled goals ;
+    spawn_wp_proofs ~script goals ;
     if spawned then
       begin
         do_list_scheduled_result () ;
-        do_update_session mode iter ;
+        do_update_session ~script goals ;
       end
     else if not (Wp_parameters.Print.get ()) then
-      iter do_wpo_display
+      Bag.iter do_wpo_display goals
   end
 
-let do_wp_proofs () = do_wp_proofs_iter (fun f -> Wpo.iter ~on_goal:f ())
-
-let do_wp_proofs_for goals = do_wp_proofs_iter (fun f -> Bag.iter f goals)
-
 (* registered at frama-c (normal) exit *)
 let do_cache_cleanup () =
   begin
@@ -736,38 +750,6 @@ let do_cache_cleanup () =
       Wp_parameters.result "[Cache] removed:%d" removed
   end
 
-(* ------------------------------------------------------------------------ *)
-(* ---  Secondary Entry Points                                          --- *)
-(* ------------------------------------------------------------------------ *)
-
-(* Deprecated entry point in Dynamic. *)
-
-let deprecated_wp_compute kf bhv ipopt =
-  let model = computer () in
-  let goals =
-    match ipopt with
-    | None -> Generator.compute_kf model ?kf ~bhv ()
-    | Some ip -> Generator.compute_ip model ip
-  in do_wp_proofs_for goals
-
-let deprecated_wp_compute_kf kf bhv prop =
-  let model = computer () in
-  do_wp_proofs_for (Generator.compute_kf model ?kf ~bhv ~prop ())
-
-
-let deprecated_wp_compute_ip ip =
-  Wp_parameters.warning ~once:true "Dynamic 'wp_compute_ip' is now deprecated." ;
-  let model = computer () in
-  do_wp_proofs_for (Generator.compute_ip model ip)
-
-let deprecated_wp_compute_call stmt =
-  Wp_parameters.warning ~once:true "Dynamic 'wp_compute_ip' is now deprecated." ;
-  do_wp_proofs_for (Generator.compute_call (computer ()) stmt)
-
-let deprecated_wp_clear () =
-  Wp_parameters.warning ~once:true "Dynamic 'wp_compute_ip' is now deprecated." ;
-  Wpo.clear ()
-
 (* ------------------------------------------------------------------------ *)
 (* ---  Command-line Entry Points                                       --- *)
 (* ------------------------------------------------------------------------ *)
@@ -800,27 +782,26 @@ let cmdline_run () =
         WpContext.on_context (computer#model,WpContext.Global)
           LogicBuiltins.dump ();
       end ;
+    wp_compute_memory_context computer#model ;
+    if Wp_parameters.CheckModelHypotheses.get () then
+      wp_insert_memory_context computer#model fct ;
     Generator.compute_selection computer ~fct ~bhv ~prop ()
   in
   if Wp_parameters.CachePrint.get () then
     Kernel.feedback "Cache directory: %s" (Cache.get_dir ()) ;
   let fct = Wp_parameters.get_wp () in
-  match fct with
-  | Wp_parameters.Fct_none -> ()
-  | Wp_parameters.Fct_all ->
-      begin
-        ignore (wp_main fct);
-        do_wp_proofs ();
-        do_wp_print ();
-        do_wp_report ();
-      end
-  | _ ->
+  if fct <> Wp_parameters.Fct_none then
+    begin
+      let goals = wp_main fct in
+      do_wp_proofs goals ;
       begin
-        let goals = wp_main fct in
-        do_wp_proofs_for goals ;
-        do_wp_print_for goals ;
-        do_wp_report () ;
-      end
+        if fct <> Wp_parameters.Fct_all then
+          do_wp_print_for goals
+        else
+          do_wp_print () ;
+      end ;
+      do_wp_report () ;
+    end
 
 (* ------------------------------------------------------------------------ *)
 (* ---  Register external functions                                     --- *)
@@ -837,56 +818,6 @@ let register name ty code =
       (fun x -> deprecated name ; code x)
   in ()
 
-(* DEPRECATED *)
-let () =
-  let module OLS = Datatype.List(Datatype.String) in
-  let module OKF = Datatype.Option(Kernel_function) in
-  let module OP = Datatype.Option(Property) in
-  register "wp_compute"
-    (Datatype.func3 OKF.ty OLS.ty OP.ty Datatype.unit)
-    deprecated_wp_compute
-
-let () =
-  let module OKF = Datatype.Option(Kernel_function) in
-  let module OLS = Datatype.List(Datatype.String) in
-  register "wp_compute_kf"
-    (Datatype.func3 OKF.ty OLS.ty OLS.ty Datatype.unit)
-    deprecated_wp_compute_kf
-
-let () =
-  register "wp_compute_ip"
-    (Datatype.func Property.ty Datatype.unit)
-    deprecated_wp_compute_ip
-
-let () =
-  register "wp_compute_call"
-    (Datatype.func Cil_datatype.Stmt.ty Datatype.unit)
-    deprecated_wp_compute_call
-
-let () =
-  register "wp_clear"
-    (Datatype.func Datatype.unit Datatype.unit)
-    deprecated_wp_clear
-
-let run = Dynamic.register ~plugin:"Wp" "run"
-    (Datatype.func Datatype.unit Datatype.unit)
-    ~journalize:true
-    cmdline_run
-
-let () =
-  let open Datatype in
-  begin
-    let t_job = func Unit.ty Unit.ty in
-    let t_iter = func (func Wpo.S.ty Unit.ty) Unit.ty in
-    let register name ty f =
-      ignore (Dynamic.register name ty ~plugin:"Wp" ~journalize:false f)
-    in
-    register "wp_begin_session" t_job  begin_session ;
-    register "wp_end_session"   t_job  end_session   ;
-    register "wp_clear_session" t_job  clear_session ;
-    register "wp_iter_session"  t_iter iter_session  ;
-  end
-
 (* ------------------------------------------------------------------------ *)
 (* ---  Tracing WP Invocation                                           --- *)
 (* ------------------------------------------------------------------------ *)
diff --git a/src/plugins/wp/share/coqwp/Memory.v b/src/plugins/wp/share/coqwp/Memory.v
index de9c9ff58517407ea2b35069c94958a574edcb7d..ff59f9557f90ccb1b338d9ee8b7ee1e09b8df961 100644
--- a/src/plugins/wp/share/coqwp/Memory.v
+++ b/src/plugins/wp/share/coqwp/Memory.v
@@ -347,12 +347,15 @@ Admitted.
 Definition addr_of_int : Z -> addr.
 Admitted.
 
+Definition table : Type.
+Admitted.
+
 (* Why3 goal *)
-Definition base_offset: Z -> Z.
+Definition table_to_offset: table -> Z -> Z.
 Admitted.
 
 (* Why3 goal *)
-Definition base_index: Z -> Z.
+Definition table_of_base: Z -> table.
 Admitted.
 
 (* Why3 goal *)
@@ -370,15 +373,30 @@ Lemma addr_of_null : ((int_of_addr null) = 0%Z).
 Admitted.
 
 (* Why3 goal *)
-Lemma base_offset_zero : ((base_offset 0%Z) = 0%Z).
+Lemma table_to_offset_zero : forall (t: table), ((table_to_offset t 0%Z) = 0%Z).
 Admitted.
 
 (* Why3 goal *)
-Lemma base_offset_inj : forall (i:Z), ((base_index (base_offset i)) = i).
+Lemma table_to_offset_monotonic : forall (t:table) (i:Z) (j:Z), (i <= j)%Z ->
+  ((table_to_offset t i) <= (table_to_offset t j))%Z.
 Admitted.
 
-(* Why3 goal *)
-Lemma base_offset_monotonic : forall (i:Z) (j:Z), (i < j)%Z ->
-  ((base_offset i) < (base_offset j))%Z.
+Definition cinits (m: farray addr bool) : Prop.
+Admitted.
+
+Definition is_init_range(m: farray addr bool) (p: addr) (l: Z) :=
+  forall i : int, (0 <= i)%Z /\ (i < l)%Z -> m .[ shift p i ] = true.
+
+Definition set_init (m: farray addr bool) (p:addr) (a: Z) : farray addr bool.
+Admitted.
+
+Lemma set_init_access:
+  forall m: farray addr bool,
+  forall q p : addr,
+  forall a : int,
+    (~  separated q 1%Z p a -> (set_init m p a) .[ q ] = m .[ q ])
+    /\ (separated q 1%Z p a -> (set_init m p a) .[ q ] = true).
 Admitted.
 
+Definition monotonic_init(m1 m2 : farray addr bool) :=
+  forall p: addr, m1 .[ p ] = true -> m2 .[ p ] = true.
diff --git a/src/plugins/wp/share/why3/frama_c_wp/memory.mlw b/src/plugins/wp/share/why3/frama_c_wp/memory.mlw
index 12cb76c9651cbf65f727a7977f795beae3f818a3..c2f0cc8634b86158a92d04f49095291a20c0e8b9 100644
--- a/src/plugins/wp/share/why3/frama_c_wp/memory.mlw
+++ b/src/plugins/wp/share/why3/frama_c_wp/memory.mlw
@@ -182,8 +182,17 @@ theory Memory
 
   function int_of_addr addr : int
   function addr_of_int int : addr
-  function base_offset int : int
-  function base_index int : int
+
+  type table (* abstract for now, but can be more elaborated later on *)
+  function table_of_base int : table
+  function table_to_offset table int : int
+
+  axiom table_to_offset_zero:
+    forall t: table. table_to_offset t 0 = 0
+
+  axiom table_to_offset_monotonic:
+    forall t: table. forall o1 o2: int.
+      o1 <= o2 <-> table_to_offset t o1 <= table_to_offset t o2
 
   axiom int_of_addr_bijection :
     forall a:int. int_of_addr (addr_of_int a) = a
diff --git a/src/plugins/wp/tests/README.md b/src/plugins/wp/tests/README.md
index 68134928bbc16a587fa10b91746e0fbadd61da20..572734b69d18822dabe8af45e4cb91e146091f2d 100644
--- a/src/plugins/wp/tests/README.md
+++ b/src/plugins/wp/tests/README.md
@@ -1,3 +1,9 @@
+# Running qualif tests
+
+- Be sure that you have installed the appropriate versions of
+  alt-ergo and coq _before_ having compiled Frama-C.
+- use `make wp-qualif` in the toplevel Frama-C directory
+
 # Test Suites
 
 Here is a short description of the WP test suites:
diff --git a/src/plugins/wp/tests/wp/oracle/bug_rte.res.oracle b/src/plugins/wp/tests/wp/oracle/bug_rte.res.oracle
index 5d27599429e5f10ea21f937458c88d6c52032373..8e96b463d843796406c704b871a801fd6fbf776e 100644
--- a/src/plugins/wp/tests/wp/oracle/bug_rte.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/bug_rte.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp/bug_rte.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function bug
 ------------------------------------------------------------
   Function bug
diff --git a/src/plugins/wp/tests/wp/oracle/cfg_loop.res.oracle b/src/plugins/wp/tests/wp/oracle/cfg_loop.res.oracle
index fde404cb14e6dbcb899b1df90bf9bc5c4e843a46..e3e370f250f473cb8875e20f101e9b47b6cfa02e 100644
--- a/src/plugins/wp/tests/wp/oracle/cfg_loop.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/cfg_loop.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp/cfg_loop.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function loop_continue
diff --git a/src/plugins/wp/tests/wp/oracle/sharing.res.oracle b/src/plugins/wp/tests/wp/oracle/sharing.res.oracle
index 6a9b973a8bddcd39196f9824696ebc782a926358..1a343c630528b7e9168bb0126b3d7d389f3a8413 100644
--- a/src/plugins/wp/tests/wp/oracle/sharing.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/sharing.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp/sharing.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 ---------------------------------------------
diff --git a/src/plugins/wp/tests/wp/oracle/stmtcompiler_test.res.oracle b/src/plugins/wp/tests/wp/oracle/stmtcompiler_test.res.oracle
index bf984a624a755a5b279949cd47ed1c23473c1262..d7c91e8c587cda072659f627edf1409be880ede6 100644
--- a/src/plugins/wp/tests/wp/oracle/stmtcompiler_test.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/stmtcompiler_test.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp/stmtcompiler_test.i:136: Warning: 
   Body of function if_assert falls-through. Adding a return statement
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp/stmtcompiler_test.i:145: Warning: 
   No code nor implicit assigns clause for function behavior1, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp/oracle/stmtcompiler_test_rela.res.oracle b/src/plugins/wp/tests/wp/oracle/stmtcompiler_test_rela.res.oracle
index fbd89c4d7c463bd67fdca3170ba6945dd9442966..06fb66f8e03c9eb736c46bff3d8295dc7674e8ca 100644
--- a/src/plugins/wp/tests/wp/oracle/stmtcompiler_test_rela.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/stmtcompiler_test_rela.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp/stmtcompiler_test_rela.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function empty
diff --git a/src/plugins/wp/tests/wp/oracle/wp_behav.res.oracle b/src/plugins/wp/tests/wp/oracle/wp_behav.res.oracle
index 5db0bbd2e089f7c5811d8009888780310f29455d..1482e87b434d9c3b0567abedd3464113b9cda5b2 100644
--- a/src/plugins/wp/tests/wp/oracle/wp_behav.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/wp_behav.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp/wp_behav.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] tests/wp/wp_behav.c:172: Warning: 
   Ignored specification 'for b1' (generalize to all behavior)
 [wp] Warning: Missing RTE guards
@@ -31,7 +30,7 @@ Prove: true.
   Function bhv
 ------------------------------------------------------------
 
-Goal Complete behaviors 'pos', 'neg':
+Goal Complete behaviors 'neg', 'pos':
 Assume { Type: is_sint32(n). (* Pre-condition *) Have: n != 0. }
 Prove: (0 < n) \/ (n < 0).
 
diff --git a/src/plugins/wp/tests/wp/oracle/wp_behavior.0.res.oracle b/src/plugins/wp/tests/wp/oracle/wp_behavior.0.res.oracle
index 9c8ae39d6579bccf309f953d0bb6eb652233c42d..c377eb93bf7fa1a03983b67f6950c86b1e851748 100644
--- a/src/plugins/wp/tests/wp/oracle/wp_behavior.0.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/wp_behavior.0.res.oracle
@@ -1,13 +1,12 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp/wp_behavior.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function behaviors
 ------------------------------------------------------------
 
-Goal Complete behaviors 'Y', 'X':
+Goal Complete behaviors 'X', 'Y':
 Assume {
   (* Pre-condition *)
   Have: P_R.
@@ -20,7 +19,7 @@ Prove: P_CX \/ P_CY.
 
 ------------------------------------------------------------
 
-Goal Disjoint behaviors 'Y', 'X':
+Goal Disjoint behaviors 'X', 'Y':
 Assume {
   (* Pre-condition *)
   Have: P_R.
diff --git a/src/plugins/wp/tests/wp/oracle/wp_behavior.1.res.oracle b/src/plugins/wp/tests/wp/oracle/wp_behavior.1.res.oracle
index a1618f682664022f6c47fb2dd1c2b4cc510c20b9..8d98a45587a8418840253e104b34f8591534e2d9 100644
--- a/src/plugins/wp/tests/wp/oracle/wp_behavior.1.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/wp_behavior.1.res.oracle
@@ -1,19 +1,18 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp/wp_behavior.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function behaviors
 ------------------------------------------------------------
 
-Goal Complete behaviors 'Y', 'X':
+Goal Complete behaviors 'X', 'Y':
 Assume { (* Pre-condition *) Have: P_R. }
 Prove: P_CX \/ P_CY.
 
 ------------------------------------------------------------
 
-Goal Disjoint behaviors 'Y', 'X':
+Goal Disjoint behaviors 'X', 'Y':
 Assume { (* Pre-condition *) Have: P_R. }
 Prove: (!P_CX) \/ (!P_CY).
 
diff --git a/src/plugins/wp/tests/wp/oracle/wp_call_pre.0.res.oracle b/src/plugins/wp/tests/wp/oracle/wp_call_pre.0.res.oracle
index 653c11e9d55b4ef858d0250cdf9c0f6aac06d1ac..308fadbaa3174eed5309c7908a2c3c04383345eb 100644
--- a/src/plugins/wp/tests/wp/oracle/wp_call_pre.0.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/wp_call_pre.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Hoare' [...]
 [kernel] Parsing tests/wp/wp_call_pre.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp/wp_call_pre.c:53: Warning: 
   No code nor implicit assigns clause for function g, generating default assigns from the prototype
 [kernel] tests/wp/wp_call_pre.c:53: Warning: 
diff --git a/src/plugins/wp/tests/wp/oracle/wp_call_pre.1.res.oracle b/src/plugins/wp/tests/wp/oracle/wp_call_pre.1.res.oracle
index a11eb1bd13533267d4f6b9d3e980acf8a79decd9..c8d77c934815cd6db79395b4ab9616605d187395 100644
--- a/src/plugins/wp/tests/wp/oracle/wp_call_pre.1.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/wp_call_pre.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Hoare' [...]
 [kernel] Parsing tests/wp/wp_call_pre.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp/wp_call_pre.c:53: Warning: 
   No code nor implicit assigns clause for function f, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp/oracle/wp_call_pre.2.res.oracle b/src/plugins/wp/tests/wp/oracle/wp_call_pre.2.res.oracle
index 90c952b11ab801c2c9efffedb44dff22c8d23338..330ae3ce02fdefc65332fe4ef2477b65bc20f885 100644
--- a/src/plugins/wp/tests/wp/oracle/wp_call_pre.2.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/wp_call_pre.2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Hoare' [...]
 [kernel] Parsing tests/wp/wp_call_pre.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp/wp_call_pre.c:53: Warning: 
   No code nor implicit assigns clause for function g, generating default assigns from the prototype
 [kernel] tests/wp/wp_call_pre.c:53: Warning: 
diff --git a/src/plugins/wp/tests/wp/oracle/wp_call_pre.3.res.oracle b/src/plugins/wp/tests/wp/oracle/wp_call_pre.3.res.oracle
index e2054c417374920469a8439b414cb115d54f3094..29adcc554a584024d6373d1168abfae012ab848a 100644
--- a/src/plugins/wp/tests/wp/oracle/wp_call_pre.3.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/wp_call_pre.3.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Hoare' [...]
 [kernel] Parsing tests/wp/wp_call_pre.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp/wp_call_pre.c:53: Warning: 
   No code nor implicit assigns clause for function f, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp/oracle/wp_call_pre.4.res.oracle b/src/plugins/wp/tests/wp/oracle/wp_call_pre.4.res.oracle
index 42f82c479853582025c316db4b6433e6b100c1b2..2b2fcb498fc51449dccece6ee703b7d4185276d5 100644
--- a/src/plugins/wp/tests/wp/oracle/wp_call_pre.4.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/wp_call_pre.4.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Hoare' [...]
 [kernel] Parsing tests/wp/wp_call_pre.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 
 Goal Pre-condition 'qed_ok,Rstmt' at instruction (file tests/wp/wp_call_pre.c, line 47):
diff --git a/src/plugins/wp/tests/wp/oracle/wp_eqb.res.oracle b/src/plugins/wp/tests/wp/oracle/wp_eqb.res.oracle
index 909dc7f4acb381c3826cc686dd4daab80834e3ed..2ab50ab1a473720ca44010c93006af5f69074bba 100644
--- a/src/plugins/wp/tests/wp/oracle/wp_eqb.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/wp_eqb.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp/wp_eqb.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp:print-generated] 
diff --git a/src/plugins/wp/tests/wp/oracle/wp_strategy.0.res.oracle b/src/plugins/wp/tests/wp/oracle/wp_strategy.0.res.oracle
index f9a46f91a873bdf14bf309947068c8ec9f109420..db0e3c425b6e087e9635be7eab73370ce9e72e7b 100644
--- a/src/plugins/wp/tests/wp/oracle/wp_strategy.0.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/wp_strategy.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Hoare' [...]
 [kernel] Parsing tests/wp/wp_strategy.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function bts0513
diff --git a/src/plugins/wp/tests/wp/oracle/wp_strategy.1.res.oracle b/src/plugins/wp/tests/wp/oracle/wp_strategy.1.res.oracle
index 0613c6137dca1ca0f826ad40dd0fc8251e0e88b9..b3d21c9f32f1cee3d6159fdaacaea1e22e053ffb 100644
--- a/src/plugins/wp/tests/wp/oracle/wp_strategy.1.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/wp_strategy.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp/wp_strategy.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function default_behaviors with behavior default_for_stmt_54
diff --git a/src/plugins/wp/tests/wp/oracle_qualif/cfg_loop.res.oracle b/src/plugins/wp/tests/wp/oracle_qualif/cfg_loop.res.oracle
index 783f051c009e91c40916a4857448372bc694ba58..813798a56de622e0c795b05199b7ad14e250e025 100644
--- a/src/plugins/wp/tests/wp/oracle_qualif/cfg_loop.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle_qualif/cfg_loop.res.oracle
@@ -1,12 +1,8 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp/cfg_loop.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 15 goals scheduled
-[wp] [Qed] Goal typed_loop_continue_loop_invariant_preserved : Valid
-[wp] [Qed] Goal typed_loop_continue_loop_invariant_established : Valid
-[wp] [Qed] Goal typed_loop_continue_loop_assigns : Valid
 [wp] [Qed] Goal typed_loop_switch_loop_invariant_preserved_part1 : Valid
 [wp] [Qed] Goal typed_loop_switch_loop_invariant_preserved_part2 : Valid
 [wp] [Qed] Goal typed_loop_switch_loop_invariant_preserved_part3 : Valid
@@ -19,6 +15,9 @@
 [wp] [Qed] Goal typed_loop_switch_loop_assigns_part2 : Valid
 [wp] [Qed] Goal typed_loop_switch_loop_assigns_part3 : Valid
 [wp] [Qed] Goal typed_loop_switch_loop_assigns_part4 : Valid
+[wp] [Qed] Goal typed_loop_continue_loop_invariant_preserved : Valid
+[wp] [Qed] Goal typed_loop_continue_loop_invariant_established : Valid
+[wp] [Qed] Goal typed_loop_continue_loop_assigns : Valid
 [wp] Proved goals:   15 / 15
   Qed:            15
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp/oracle_qualif/sharing.res.oracle b/src/plugins/wp/tests/wp/oracle_qualif/sharing.res.oracle
index 7d5f6951348e86bcefdbef72c44612958994fcc2..946892056883cd25919365593b66425129f5abe8 100644
--- a/src/plugins/wp/tests/wp/oracle_qualif/sharing.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle_qualif/sharing.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp/sharing.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures : Valid
diff --git a/src/plugins/wp/tests/wp/oracle_qualif/stmtcompiler_test.res.oracle b/src/plugins/wp/tests/wp/oracle_qualif/stmtcompiler_test.res.oracle
index 6c7bce3b389f8a2b7860baa692789814b6bffcd3..6e1e0c0d7c30baad20ca78800a4bacd2573751f7 100644
--- a/src/plugins/wp/tests/wp/oracle_qualif/stmtcompiler_test.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle_qualif/stmtcompiler_test.res.oracle
@@ -3,33 +3,23 @@
 [kernel] tests/wp/stmtcompiler_test.i:136: Warning: 
   Body of function if_assert falls-through. Adding a return statement
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp/stmtcompiler_test.i:145: Warning: 
   No code nor implicit assigns clause for function behavior1, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
 [wp] tests/wp/stmtcompiler_test.i:81: Warning: 
   Missing assigns clause (assigns 'everything' instead)
 [wp] 27 goals scheduled
-[wp] [Qed] Goal typed_behavior2_assert : Valid
-[wp] [Qed] Goal typed_behavior3_assert : Valid
-[wp] [Qed] Goal typed_behavior4_assert : Valid
-[wp] [Alt-Ergo] Goal typed_behavior5_assert_bad : Unsuccess
-[wp] [Qed] Goal typed_compare_assert : Valid
 [wp] [Qed] Goal typed_empty_assert : Valid
-[wp] [Alt-Ergo] Goal typed_if_assert_assert : Valid
-[wp] [Alt-Ergo] Goal typed_if_assert_assert_2 : Unsuccess
-[wp] [Qed] Goal typed_if_assert_assert_3 : Valid
-[wp] [Alt-Ergo] Goal typed_if_assert_assert_missing_return : Unsuccess
-[wp] [Qed] Goal typed_main_assert : Valid
-[wp] [Qed] Goal typed_main_assigns_global_assert : Valid
-[wp] [Qed] Goal typed_main_assigns_global_assert_2 : Valid
-[wp] [Alt-Ergo] Goal typed_main_assigns_global_assert_bad : Unsuccess
-[wp] [Qed] Goal typed_main_ensures_result_assert : Valid
-[wp] [Alt-Ergo] Goal typed_not_main_assert_bad : Unsuccess
 [wp] [Qed] Goal typed_one_assign_assert : Valid
 [wp] [Qed] Goal typed_one_if_assert : Valid
 [wp] [Qed] Goal typed_some_seq_assert : Valid
 [wp] [Qed] Goal typed_some_seq_assert_2 : Valid
+[wp] [Qed] Goal typed_main_ensures_result_assert : Valid
+[wp] [Qed] Goal typed_main_assert : Valid
+[wp] [Alt-Ergo] Goal typed_not_main_assert_bad : Unsuccess
+[wp] [Qed] Goal typed_main_assigns_global_assert : Valid
+[wp] [Qed] Goal typed_main_assigns_global_assert_2 : Valid
+[wp] [Alt-Ergo] Goal typed_main_assigns_global_assert_bad : Unsuccess
 [wp] [Qed] Goal typed_zloop_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_zloop_loop_invariant_preserved : Unsuccess
 [wp] [Qed] Goal typed_zloop_loop_invariant_established : Valid
@@ -37,6 +27,15 @@
 [wp] [Qed] Goal typed_zloop_assert_2 : Valid
 [wp] [Alt-Ergo] Goal typed_zloop_assert_3 : Unsuccess
 [wp] [Alt-Ergo] Goal typed_zloop_assert_bad : Unsuccess
+[wp] [Qed] Goal typed_behavior2_assert : Valid
+[wp] [Qed] Goal typed_behavior3_assert : Valid
+[wp] [Qed] Goal typed_behavior4_assert : Valid
+[wp] [Alt-Ergo] Goal typed_behavior5_assert_bad : Unsuccess
+[wp] [Alt-Ergo] Goal typed_if_assert_assert : Valid
+[wp] [Alt-Ergo] Goal typed_if_assert_assert_2 : Unsuccess
+[wp] [Qed] Goal typed_if_assert_assert_3 : Valid
+[wp] [Alt-Ergo] Goal typed_if_assert_assert_missing_return : Unsuccess
+[wp] [Qed] Goal typed_compare_assert : Valid
 [wp] Proved goals:   19 / 27
   Qed:            18 
   Alt-Ergo:        1  (unsuccess: 8)
diff --git a/src/plugins/wp/tests/wp/oracle_qualif/stmtcompiler_test_rela.res.oracle b/src/plugins/wp/tests/wp/oracle_qualif/stmtcompiler_test_rela.res.oracle
index 6b7b63c6d937a80b5c18ef93eeb31910d5426c6e..85e1744ce2042bb31ce0c09fb458e8a778278825 100644
--- a/src/plugins/wp/tests/wp/oracle_qualif/stmtcompiler_test_rela.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle_qualif/stmtcompiler_test_rela.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp/stmtcompiler_test_rela.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Qed] Goal typed_empty_assert : Valid
diff --git a/src/plugins/wp/tests/wp/oracle_qualif/wp_behav.0.res.oracle b/src/plugins/wp/tests/wp/oracle_qualif/wp_behav.0.res.oracle
index 83812560087c4aa860f4631b1c3afc3c5c801d95..faa679c96697f66156e01511131f9dc0cf867911 100644
--- a/src/plugins/wp/tests/wp/oracle_qualif/wp_behav.0.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle_qualif/wp_behav.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-timeout 1 [...]
 [kernel] Parsing tests/wp/wp_behav.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] tests/wp/wp_behav.c:172: Warning: 
   Ignored specification 'for b1' (generalize to all behavior)
 [wp] Warning: Missing RTE guards
@@ -14,44 +13,44 @@
 [wp] tests/wp/wp_behav.c:176: Warning: 
   Missing assigns clause (assigns 'everything' instead)
 [wp] 38 goals scheduled
-[wp] [Alt-Ergo] Goal typed_assert_needed_assert_ko : Unsuccess
-[wp] [Qed] Goal typed_assert_needed_assert_qed_ok_ok_with_hyp : Valid
-[wp] [Alt-Ergo] Goal typed_bhv_complete_pos_neg : Valid
-[wp] [Qed] Goal typed_bhv_neg_ensures_qed_ok : Valid
-[wp] [Qed] Goal typed_bhv_pos_ensures_qed_ok : Valid
-[wp] [Alt-Ergo] Goal typed_bts0513_ensures_ko1 : Unsuccess
-[wp] [Alt-Ergo] Goal typed_bts0513_ensures_ko2 : Unsuccess
 [wp] [Qed] Goal typed_f_ensures_qed_ok : Valid
 [wp] [Qed] Goal typed_f_x1_ensures_qed_ok : Valid
 [wp] [Qed] Goal typed_f_assert_qed_ok : Valid
 [wp] [Qed] Goal typed_f_x2_ensures_qed_ok : Valid
 [wp] [Qed] Goal typed_f_assert_qed_ok_2 : Valid
-[wp] [Qed] Goal typed_local_named_behavior_xpos_ensures_qed_ok : Valid
-[wp] [Qed] Goal typed_local_named_behavior_xpos_ensures_qed_ok_2 : Valid
 [wp] [Qed] Goal typed_min_complete_bx_by : Valid
 [wp] [Qed] Goal typed_min_disjoint_bx_by : Valid
 [wp] [Qed] Goal typed_min_bx_ensures_qed_ok : Valid
 [wp] [Qed] Goal typed_min_by_ensures_qed_ok : Valid
-[wp] [Qed] Goal typed_more_stmt_assigns_ensures_qed_ok_ok_with_hoare : Valid
-[wp] [Qed] Goal typed_more_stmt_assigns_blk_assigns_part1 : Valid
-[wp] [Qed] Goal typed_more_stmt_assigns_blk_assigns_part2 : Valid
-[wp] [Qed] Goal typed_part_stmt_bhv_b1_ensures_qed_ok : Valid
-[wp] [Alt-Ergo] Goal typed_part_stmt_bhv_bs_ensures : Unsuccess
-[wp] [Alt-Ergo] Goal typed_razT_loop_invariant_qed_ok_preserved : Valid
-[wp] [Qed] Goal typed_razT_loop_invariant_qed_ok_established : Valid
-[wp] [Alt-Ergo] Goal typed_razT_b1_ensures_e1 : Unsuccess
-[wp] [Qed] Goal typed_stmt_assigns_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_stmt_assigns_assigns : Unsuccess
+[wp] [Alt-Ergo] Goal typed_bhv_complete_neg_pos : Valid
+[wp] [Qed] Goal typed_bhv_pos_ensures_qed_ok : Valid
+[wp] [Qed] Goal typed_bhv_neg_ensures_qed_ok : Valid
 [wp] [Qed] Goal typed_stmt_contract_requires_qed_ok : Valid
 [wp] [Qed] Goal typed_stmt_contract_ensures_qed_ok : Valid
 [wp] [Qed] Goal typed_stmt_contract_ok_ensures_qed_ok : Valid
+[wp] [Qed] Goal typed_stmt_contract_label_ensures_qed_ok : Valid
+[wp] [Qed] Goal typed_stmt_contract_label_ensures_qed_ok_2 : Valid
 [wp] [Qed] Goal typed_stmt_contract_assigns_requires_qed_ok : Valid
 [wp] [Qed] Goal typed_stmt_contract_assigns_ensures_qed_ok : Valid
 [wp] [Qed] Goal typed_stmt_contract_assigns_assigns : Valid
 [wp] [Qed] Goal typed_stmt_contract_assigns_ok_ensures_qed_ok : Valid
 [wp] [Qed] Goal typed_stmt_contract_assigns_ok_asgn_ensures_qed_ok : Valid
-[wp] [Qed] Goal typed_stmt_contract_label_ensures_qed_ok_2 : Valid
-[wp] [Qed] Goal typed_stmt_contract_label_ensures_qed_ok : Valid
+[wp] [Qed] Goal typed_local_named_behavior_xpos_ensures_qed_ok : Valid
+[wp] [Qed] Goal typed_local_named_behavior_xpos_ensures_qed_ok_2 : Valid
+[wp] [Alt-Ergo] Goal typed_assert_needed_assert_ko : Unsuccess
+[wp] [Qed] Goal typed_assert_needed_assert_qed_ok_ok_with_hyp : Valid
+[wp] [Alt-Ergo] Goal typed_bts0513_ensures_ko1 : Unsuccess
+[wp] [Alt-Ergo] Goal typed_bts0513_ensures_ko2 : Unsuccess
+[wp] [Alt-Ergo] Goal typed_stmt_assigns_assigns : Unsuccess
+[wp] [Qed] Goal typed_stmt_assigns_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_razT_loop_invariant_qed_ok_preserved : Valid
+[wp] [Qed] Goal typed_razT_loop_invariant_qed_ok_established : Valid
+[wp] [Alt-Ergo] Goal typed_razT_b1_ensures_e1 : Unsuccess
+[wp] [Qed] Goal typed_more_stmt_assigns_blk_assigns_part1 : Valid
+[wp] [Qed] Goal typed_more_stmt_assigns_blk_assigns_part2 : Valid
+[wp] [Qed] Goal typed_more_stmt_assigns_ensures_qed_ok_ok_with_hoare : Valid
+[wp] [Alt-Ergo] Goal typed_part_stmt_bhv_bs_ensures : Unsuccess
+[wp] [Qed] Goal typed_part_stmt_bhv_b1_ensures_qed_ok : Valid
 [wp] Proved goals:   32 / 38
   Qed:            30 
   Alt-Ergo:        2  (unsuccess: 6)
diff --git a/src/plugins/wp/tests/wp/oracle_qualif/wp_behav.1.res.oracle b/src/plugins/wp/tests/wp/oracle_qualif/wp_behav.1.res.oracle
index 70bb96ddf2477029c86956d4cd69eae07efe382c..5d374947a3c5b1bd0c93ca6bebb380b8d10df724 100644
--- a/src/plugins/wp/tests/wp/oracle_qualif/wp_behav.1.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle_qualif/wp_behav.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-steps 50 [...]
 [kernel] Parsing tests/wp/wp_behav.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] tests/wp/wp_behav.c:172: Warning: 
   Ignored specification 'for b1' (generalize to all behavior)
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp/oracle_qualif/wp_call_pre.res.oracle b/src/plugins/wp/tests/wp/oracle_qualif/wp_call_pre.res.oracle
index 824ee1a6e3133d0e01ae5f4aeceac1314c20cbab..bad25e7802e2219b75ae036e67603294e2d6093e 100644
--- a/src/plugins/wp/tests/wp/oracle_qualif/wp_call_pre.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle_qualif/wp_call_pre.res.oracle
@@ -1,23 +1,22 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp/wp_call_pre.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
-[kernel] tests/wp/wp_call_pre.c:53: Warning: 
-  No code nor implicit assigns clause for function g, generating default assigns from the prototype
 [kernel] tests/wp/wp_call_pre.c:53: Warning: 
   No code nor implicit assigns clause for function f, generating default assigns from the prototype
+[kernel] tests/wp/wp_call_pre.c:53: Warning: 
+  No code nor implicit assigns clause for function g, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
 [wp] 10 goals scheduled
-[wp] [Qed] Goal typed_call_g_call_g_requires_qed_ok_Rga : Valid
-[wp] [Qed] Goal typed_call_g_call_g_requires_Rgb : Valid
-[wp] [Qed] Goal typed_call_main_ensures_qed_ok : Valid
-[wp] [Qed] Goal typed_call_main_call_main_requires_qed_ok_Rmain : Valid
 [wp] [Qed] Goal typed_double_call_call_f_requires_qed_ok_Rf : Valid
 [wp] [Alt-Ergo] Goal typed_double_call_call_f_2_requires_qed_ok_Rf : Valid
 [wp] [Qed] Goal typed_main_requires_qed_ok_Rmain : Valid
 [wp] [Qed] Goal typed_main_ensures_qed_ok_Emain : Valid
 [wp] [Qed] Goal typed_main_call_f_requires_qed_ok_Rf : Valid
+[wp] [Qed] Goal typed_call_main_ensures_qed_ok : Valid
+[wp] [Qed] Goal typed_call_main_call_main_requires_qed_ok_Rmain : Valid
 [wp] [Qed] Goal typed_stmt_pre_requires_qed_ok_Rstmt : Valid
+[wp] [Qed] Goal typed_call_g_call_g_requires_qed_ok_Rga : Valid
+[wp] [Qed] Goal typed_call_g_call_g_requires_Rgb : Valid
 [wp] Proved goals:   10 / 10
   Qed:             9 
   Alt-Ergo:        1
diff --git a/src/plugins/wp/tests/wp/oracle_qualif/wp_eqb.res.oracle b/src/plugins/wp/tests/wp/oracle_qualif/wp_eqb.res.oracle
index b91abd82765fc05e5e7fbe118aed7a4198bf2490..11c277d30e4c47bef5d923f654725aeda0399f00 100644
--- a/src/plugins/wp/tests/wp/oracle_qualif/wp_eqb.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle_qualif/wp_eqb.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp/wp_eqb.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures : Valid
diff --git a/src/plugins/wp/tests/wp/oracle_qualif/wp_strategy.res.oracle b/src/plugins/wp/tests/wp/oracle_qualif/wp_strategy.res.oracle
index 505785f5e07cc548e827cb8fe06964b64567298f..90bb89816b2808947e23ae7a45f9a42897429a66 100644
--- a/src/plugins/wp/tests/wp/oracle_qualif/wp_strategy.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle_qualif/wp_strategy.res.oracle
@@ -9,33 +9,32 @@
 [rte] annotating function spec_if_cond
 [rte] annotating function spec_if_not_cond
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 25 goals scheduled
 [wp] [Alt-Ergo] Goal hoare_bts0513_ensures_qed_ko_ko1 : Unsuccess
 [wp] [Alt-Ergo] Goal hoare_bts0513_ensures_qed_ko_ko2 : Unsuccess
 [wp] [Alt-Ergo] Goal hoare_bts0513_bis_assert_qed_ko_ko1 : Unsuccess
 [wp] [Qed] Goal hoare_bts0513_bis_assert_qed_ok_ok : Valid
-[wp] [Qed] Goal hoare_default_behaviors_ensures_qed_ok : Valid
-[wp] [Qed] Goal hoare_default_behaviors_assert_qed_ok_2 : Valid
-[wp] [Qed] Goal hoare_default_behaviors_ensures_qed_ok_stmt_p : Valid
-[wp] [Qed] Goal hoare_default_behaviors_assert_qed_ok : Valid
-[wp] [Alt-Ergo] Goal hoare_default_behaviors_assert_rte_signed_overflow : Unsuccess
-[wp] [Qed] Goal hoare_default_behaviors_assigns : Valid
 [wp] [Qed] Goal hoare_dpd1_assert_qed_ok_A : Valid
 [wp] [Alt-Ergo] Goal hoare_dpd1_ensures_qed_ko_Eko : Unsuccess
 [wp] [Qed] Goal hoare_dpd1_assigns : Valid
-[wp] [Qed] Goal hoare_dpd2_assert_qed_ok_A : Valid
 [wp] [Alt-Ergo] Goal hoare_dpd2_ensures_qed_ko_Eko : Unsuccess
 [wp] [Qed] Goal hoare_dpd2_assigns : Valid
-[wp] [Qed] Goal hoare_spec_if_ensures_qed_ok_2 : Valid
+[wp] [Qed] Goal hoare_dpd2_assert_qed_ok_A : Valid
 [wp] [Qed] Goal hoare_spec_if_ensures_qed_ok : Valid
 [wp] [Qed] Goal hoare_spec_if_assigns : Valid
 [wp] [Alt-Ergo] Goal hoare_spec_if_assert_rte_signed_overflow : Unsuccess
 [wp] [Qed] Goal hoare_spec_if_assigns_2 : Valid
 [wp] [Alt-Ergo] Goal hoare_spec_if_assert_rte_signed_overflow_2 : Unsuccess
 [wp] [Qed] Goal hoare_spec_if_assigns_3 : Valid
+[wp] [Qed] Goal hoare_spec_if_ensures_qed_ok_2 : Valid
 [wp] [Qed] Goal hoare_spec_if_cond_ensures_qed_ok : Valid
 [wp] [Qed] Goal hoare_spec_if_not_cond_ensures_qed_ok : Valid
+[wp] [Qed] Goal hoare_default_behaviors_ensures_qed_ok_stmt_p : Valid
+[wp] [Qed] Goal hoare_default_behaviors_assert_qed_ok : Valid
+[wp] [Alt-Ergo] Goal hoare_default_behaviors_assert_rte_signed_overflow : Unsuccess
+[wp] [Qed] Goal hoare_default_behaviors_assigns : Valid
+[wp] [Qed] Goal hoare_default_behaviors_ensures_qed_ok : Valid
+[wp] [Qed] Goal hoare_default_behaviors_assert_qed_ok_2 : Valid
 [wp] Proved goals:   17 / 25
   Qed:            17 
   Alt-Ergo:        0  (unsuccess: 8)
diff --git a/src/plugins/wp/tests/wp/stmtcompiler_test.ml b/src/plugins/wp/tests/wp/stmtcompiler_test.ml
index 7d61b014274483fc8f0d3e8782735b9a3c84b10d..ab8fd28f71adf5fe5a631056ae2ad39533d5a421 100644
--- a/src/plugins/wp/tests/wp/stmtcompiler_test.ml
+++ b/src/plugins/wp/tests/wp/stmtcompiler_test.ml
@@ -19,17 +19,17 @@ let run () =
 
   let provers =
     List.fold_right
-      (fun pname prvs -> match VCS.prover_of_name pname with
+      (fun pname prvs -> match VCS.parse_prover pname with
          | None -> prvs
          | Some VCS.Tactical -> prvs
-         | Some prv -> (VCS.mode_of_prover_name pname, prv) :: prvs)
+         | Some prv -> (VCS.BatchMode, prv) :: prvs)
       ["qed"] []
   in
 
   let spawn goal =
     let result _ prv res =
-      Format.printf "[%a] %a@.@\n"
-        VCS.pp_prover prv (VCS.pp_result_qualif prv) res
+      Format.printf "[%a] %t@.@\n"
+        VCS.pp_prover prv (VCS.pp_result_qualif prv res)
     in
     let server = ProverTask.server () in
     Prover.spawn goal ~delayed:true ~result provers;
diff --git a/src/plugins/wp/tests/wp/stmtcompiler_test_rela.ml b/src/plugins/wp/tests/wp/stmtcompiler_test_rela.ml
index 72ab4fc4ef117ae2e07833a2f68f9ecfc901e415..ee5548356cc7a0037c3bc2f56dd2c86f7b62b228 100644
--- a/src/plugins/wp/tests/wp/stmtcompiler_test_rela.ml
+++ b/src/plugins/wp/tests/wp/stmtcompiler_test_rela.ml
@@ -18,17 +18,17 @@ let run () =
 
   let provers =
     List.fold_right
-      (fun pname prvs -> match VCS.prover_of_name pname with
+      (fun pname prvs -> match VCS.parse_prover pname with
          | None -> prvs
          | Some VCS.Tactical -> prvs
-         | Some prv -> (VCS.mode_of_prover_name pname, prv) :: prvs)
+         | Some prv -> (VCS.BatchMode, prv) :: prvs)
       ["alt-ergo"] []
   in
 
   let spawn goal =
     let result _ prv res =
-      Format.printf "[%a] %a@.@\n"
-        VCS.pp_prover prv (VCS.pp_result_qualif prv) res
+      Format.printf "[%a] %t@.@\n"
+        VCS.pp_prover prv (VCS.pp_result_qualif prv res)
     in
     let server = ProverTask.server () in
     Prover.spawn goal ~delayed:true ~result provers;
@@ -54,7 +54,8 @@ let run () =
         pred_content = Cil_types.Ptrue;
       }
     in
-    let annot = Logic_const.new_code_annotation (AAssert ([],Assert,pred)) in
+    let pred = Logic_const.toplevel_predicate pred in
+    let annot = Logic_const.new_code_annotation (AAssert ([],pred)) in
     let po = Wpo.{
         po_gid = "";
         po_leg = "";
diff --git a/src/plugins/wp/tests/wp_acsl/base_offset.i b/src/plugins/wp/tests/wp_acsl/base_offset.i
index e4e96b65f5cdde8755869bef121630d0f3d89fc6..f38f29df60fc2fa730ca2a467efc810b7f90ba49 100644
--- a/src/plugins/wp/tests/wp_acsl/base_offset.i
+++ b/src/plugins/wp/tests/wp_acsl/base_offset.i
@@ -16,3 +16,16 @@ struct S* p ;
    \offset( &p->a[i] ) <= \offset( &p->a[j] ) ;
  */
 void f(void){return;}
+
+struct { int a ; int b ; } x ;
+struct { int a ; int b ; } y ;
+struct { double a ; int b ; } z ;
+
+void g(void){
+  int *xb = &x.b;
+  int *yb = &y.b;
+  int *zb = &z.b;
+
+  //@ check KO: \offset(xb) == \offset(zb) ;
+  //@ check KO: \offset(xb) != \offset(yb) ;
+}
diff --git a/src/plugins/wp/tests/wp_acsl/checks.i b/src/plugins/wp/tests/wp_acsl/checks.i
index 1a1174504f7e46923c594d5f5d11049ad5fdd1f0..f3fdcbfcab8f623e1c5393ae7e7b4b977300a6c2 100644
--- a/src/plugins/wp/tests/wp_acsl/checks.i
+++ b/src/plugins/wp/tests/wp_acsl/checks.i
@@ -1,7 +1,7 @@
 /* run.config
    OPT: -eva -load-module scope,eva,report -then -report
    OPT: -wp-prop=@check
-   OPT: -wp-prop=@assert
+   OPT: -wp-prop=-@check
 */
 /* run.config_qualif
    OPT: -load-module report -wp-steps 5 -then -report
diff --git a/src/plugins/wp/tests/wp_acsl/generalized_checks.i b/src/plugins/wp/tests/wp_acsl/generalized_checks.i
new file mode 100644
index 0000000000000000000000000000000000000000..3b34ced34e21bad22ab97aaefd60da416ce909d5
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/generalized_checks.i
@@ -0,0 +1,66 @@
+/* run.config_qualif
+   OPT: -wp-timeout 1
+ */
+
+/*@
+  axiomatic Th {
+
+  predicate P(integer p);
+  predicate Q(integer q);
+  predicate R(integer r);
+
+  axiom       A: \forall integer x; P(x) ==> Q(x);
+  check lemma C: ko: \forall integer x; Q(x) ==> R(x);
+  lemma       L: ko: \forall integer x; P(x) ==> R(x); // C is not used
+
+  }
+ */
+
+/*@
+  axiomatic Cfg {
+  logic integer F(integer x);
+  predicate A(integer x);
+  predicate B(integer x);
+  predicate CA1(integer x);
+  predicate CA2(integer x);
+  predicate CB1(integer x);
+  predicate CB2(integer x);
+
+  axiom AFB: \forall integer x; A(x) ==> B(F(x));
+  axiom ACB1: \forall integer x; A(x) ==> CB1(F(x));
+  axiom CA1B2: \forall integer x; CA1(x) ==> CB2(F(x));
+
+  }
+ */
+
+/*@
+  ensures \result == F(x);
+  assigns \nothing;
+ */
+int f(int x);
+
+/*@
+  requires A:               A(x);
+  check requires CA1:     CA1(x);
+  check requires CA2: ko: CA2(x);
+  ensures B:                B(\result);
+  check ensures CB1:      CB1(\result);
+  check ensures CB2: ko:  CB2(\result); // CA1 is not used
+  assigns \nothing;
+*/
+int job(int x) {
+  return f(x);
+}
+
+/*@
+  requires A(x);
+  requires CA1(x);
+  ensures R: B(\result);
+  ensures R1: ko: CB1(\result); // CB1 is not used from job
+  ensures R2: ko: CA2(x);   // CA2 is not used from job
+  assigns \nothing;
+*/
+int caller(int x)
+{
+  return job(x); // CA2 is not proved
+}
diff --git a/src/plugins/wp/tests/wp_acsl/memvar_chunk_typing.i b/src/plugins/wp/tests/wp_acsl/memvar_chunk_typing.i
new file mode 100644
index 0000000000000000000000000000000000000000..941820b19d2e663bc05ff2feffc1f6b6075c52f6
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/memvar_chunk_typing.i
@@ -0,0 +1,11 @@
+/* run.config
+   OPT: -wp-rte
+*/
+/* run.config_qualif
+   OPT: -wp-rte
+*/
+
+unsigned char C;
+
+//@ predicate P{L1} = 0 <= C <= 255;
+//@ lemma L{L1}: P{L1};
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/arith.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/arith.res.oracle
index e086a73e2e010e925515733bca74c7992059dc1e..219463ff468295f11b65a46be3f09de1cbf859a8 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/arith.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/arith.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/arith.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Global
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/assign_array.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/assign_array.res.oracle
index a358aef50a348cd9014ed089e6857abaf34da3f2..c7024e87f063a7ffc614d93f8758bd9dd31e52f6 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/assign_array.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/assign_array.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/assign_array.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function jobA
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 0e876ef057d58194dae3bd3f882f82b996fd1bda..97405e3f05094dc1e00ff8b5ea4a0116d4336bc0 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/assigned_initialized_memtyped.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function array
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 ee074a6bd82978cba93ad34b9370e3b075483db2..a4e3a95a8411e0fad2073413b324aa2485515e56 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/assigned_initialized_memvar.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function array
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/assigned_not_initialized_memtyped.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/assigned_not_initialized_memtyped.res.oracle
index 3e39ff665dfca5ddbdd3617d49f40abeeb0024bc..ebcccafc2c730d44c51a8a748fb7a42c124f2c07 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/assigned_not_initialized_memtyped.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/assigned_not_initialized_memtyped.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/assigned_not_initialized_memtyped.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function array
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/assigned_not_initialized_memvar.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/assigned_not_initialized_memvar.res.oracle
index 34ed9b45a88b966dd72e667d6d5a4d043d988d93..ac2da1bad2c19bb1e74f8aca0043bea66021bdf5 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/assigned_not_initialized_memvar.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/assigned_not_initialized_memvar.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/assigned_not_initialized_memvar.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function array
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 6d629988524ec0e2396fd74cb9392e73d645e99d..b8ebbadea5ebd5ac1be8e37f157226b201709da2 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/assigns_path.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function job
@@ -99,5 +98,6 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'job':
-  /*@ behavior typed: requires \separated(&p,b+(..)); */
+  /*@ behavior typed:
+        requires \separated(b + (..), &p); */
   void job(int n, int *b);
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/assigns_range.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/assigns_range.res.oracle
index 35b9d8777b712221cdd59f1d23729cb2c9156d96..47e610fd2656f2c5ea36eb0cf51ac486776d7645 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/assigns_range.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/assigns_range.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/assigns_range.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function call_assigns_all
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 da37a8a78a065d2a74d321c598706bed1d4a3084..564b0922bf517645be26e01bd384ba93f17ec04e 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/axioms.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/axioms.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/axioms.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/base_offset.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/base_offset.res.oracle
index 545557ea6d64a714e443efaa902b22ca123e0740..386eb1ab4c230b4cf63caf69909dc39e7909de02 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/base_offset.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/base_offset.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/base_offset.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
@@ -18,13 +17,28 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Post-condition (file tests/wp_acsl/base_offset.i, line 15) in 'f':
-Let x = p.offset.
+Let x = p.base.
+Let a = table_of_base(x).
+Let x_1 = p.offset.
 Assume {
   (* Heap *)
-  Type: region(p.base) <= 0.
+  Type: region(x) <= 0.
   (* Goal *)
   When: (0 <= i) /\ (i <= i_1) /\ (i_1 <= 3).
 }
-Prove: base_offset(1 + i + x) <= base_offset(1 + i_1 + x).
+Prove: table_to_offset(a, 1 + i + x_1) <= table_to_offset(a, 1 + i_1 + x_1).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function g
+------------------------------------------------------------
+
+Goal Check 'KO' (file tests/wp_acsl/base_offset.i, line 29):
+Prove: table_of_base(G_z_33) = table_of_base(G_x_31).
+
+------------------------------------------------------------
+
+Goal Check 'KO' (file tests/wp_acsl/base_offset.i, line 30):
+Prove: table_of_base(G_y_32) != table_of_base(G_x_31).
 
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/bitwise.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/bitwise.res.oracle
index 70d1558a270afd984352f05fee911ed8f71bc1c3..320a3fd9ef45d2ece137443e12d54dc8fd2b4ecb 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/bitwise.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/bitwise.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/bitwise.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function band
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/bitwise2.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/bitwise2.res.oracle
index 93a098b82182b131c38a3fba3754d8b758c02d10..107c96ad0ad4ac2eb88940c98f7ff9726181977f 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/bitwise2.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/bitwise2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/bitwise2.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function job1
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/block_length.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/block_length.res.oracle
index a3bc5a8c09bbefbfedf38d930c39ae2c8c780c59..30094770c411e4aa75176fddc8e066d4a72b9dd0 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/block_length.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/block_length.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/block_length.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/boolean.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/boolean.res.oracle
index ea971496a84eeef7fce6ea5c19ceae7878256dec..61274ae7016221aea497a6e1da08c24d18c39a02 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/boolean.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/boolean.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/boolean.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 4 goals scheduled
 [wp] [Qed] Goal typed_u8_is_continue_assigns_part3 : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/checks.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/checks.0.res.oracle
index bae891952be7ca996280d35951a229bd1336993e..795c0dfaafc34ca26946948a2665e97dde5f859d 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/checks.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/checks.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/checks.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/checks.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/checks.1.res.oracle
index 6de4c09508772db4e0a498cd8342d9401c6e88eb..d9362c1ce5cc1fe74d725ed4624ae6a958693cf7 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/checks.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/checks.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/checks.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/checks.2.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/checks.2.res.oracle
index db600bf51f7bba62adcd95988f5b589ddb7fa068..38d790b5a4d7ec91bd75576bd168291c4eac1231 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/checks.2.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/checks.2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/checks.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
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 8f21ca532c0fe39f1713a5a780ff7e2cb2fa5f56..f318abf289fadf2fa603a1f23a2c77466a989011 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
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp_acsl/chunk_typing.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function function
 ------------------------------------------------------------
   Function function
@@ -32,19 +31,20 @@ 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)].
 Assume {
-  Type: 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).
+  Type: IsArray1_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).
   (* Heap *)
   Type: (region(i16_0.base) <= 0) /\ (region(i32_0.base) <= 0) /\
       (region(i64_0.base) <= 0) /\ (region(i8_0.base) <= 0) /\
       (region(u16_0.base) <= 0) /\ (region(u32_0.base) <= 0) /\
       (region(u64_0.base) <= 0) /\ (region(u8_0.base) <= 0) /\
-      IsArray1_sint8(x) /\ linked(Malloc_0) /\ sconst(Mchar_0).
+      linked(Malloc_0) /\ sconst(Mchar_0).
   (* Goal *)
   When: (0 <= i) /\ (i <= 9).
   (* Initializer *)
@@ -1879,9 +1879,14 @@ Prove: true.
 [wp] Warning: Memory model hypotheses for function 'function':
   /*@
      behavior typed:
-     requires \separated(x+(..),
-                \union(i8+(..),u8+(..),i16+(..),u16+(..),i32+(..),u32+(..),
-                  i64+(..),u64+(..)));
+       requires \separated(i16 + (..), (char const *)x + (..));
+       requires \separated(i32 + (..), (char const *)x + (..));
+       requires \separated(i64 + (..), (char const *)x + (..));
+       requires \separated(i8 + (..), (char const *)x + (..));
+       requires \separated(u16 + (..), (char const *)x + (..));
+       requires \separated(u32 + (..), (char const *)x + (..));
+       requires \separated(u64 + (..), (char const *)x + (..));
+       requires \separated(u8 + (..), (char const *)x + (..));
      */
   void function(signed char * /*[10]*/ i8, unsigned char * /*[10]*/ u8,
                 short * /*[10]*/ i16, unsigned short * /*[10]*/ u16,
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing_usable.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing_usable.res.oracle
index f066a94e1eb05f0ceb3f905405e624205a997b7a..40c1a5853ba9a3b15b69d970d38ae3fd4867bcf2 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing_usable.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing_usable.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp_acsl/chunk_typing_usable.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function usable_axiom
 [rte] annotating function usable_lemma
 [wp] 3 goals scheduled
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/classify_float.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/classify_float.res.oracle
index 8ce615934da8264b474018856ccfe959b005583b..27e7dccf57532b66742c01ee93edb017b646013d 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/classify_float.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/classify_float.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/classify_float.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 ------------------------------------------------------------
   Global
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/ctor.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/ctor.res.oracle
index 6a6bd49b1a01dafc18260e0d12b3ddff5141c855..dc62954e6b56dc190839ba2e88927577dc635871 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/ctor.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/ctor.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/ctor.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 ------------------------------------------------------------
   Axiomatic 'Event'
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/div_mod.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/div_mod.res.oracle
index 91eb8c84ada2f687e4648035e003eaac5f5bd9b9..670b0774270e298341dd46d12f96d11cc431aa67 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/div_mod.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/div_mod.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/div_mod.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/e_imply.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/e_imply.res.oracle
index b6ef93ebb149ffb7d229fb2a13648258cbd2db62..ea5fa8f594547d2bf9cc4d1969c692bad80c8188 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/e_imply.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/e_imply.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/e_imply.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/equal.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/equal.res.oracle
index 3a3c58f00c05df2dbf9f333e5bcb987f3ed4fc9b..a543f1f54a26874ef7f4f376be1c4b2d51369253 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/equal.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/equal.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/equal.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function simple_array
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/float_compare.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/float_compare.res.oracle
index b43e2d4a8152b36cd0531f01f796d4665b036ec1..54ae1cc9e6b493c54f2fbed3298c0e419efb64b3 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/float_compare.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/float_compare.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/float_compare.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Global
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/float_const.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/float_const.res.oracle
index d1a648f8189a2f4429714cfb27e2cf3890c45531..6d6043595cf02040d1ccd036cab58b9a0246bbf2 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/float_const.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/float_const.res.oracle
@@ -5,7 +5,6 @@
 [kernel:parser:decimal-float] tests/wp_acsl/float_const.i:19: Warning: 
   Floating-point constant 0.1 is not represented exactly. Will use 0x1.999999999999ap-4.
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 8 goals scheduled
 [wp:print-generated] 
@@ -36,8 +35,8 @@
     
     goal wp_goal :
       forall f:t.
-       let r = of_f32 (to_f32 (of_f64 f)) in
-       eq_f64 f (0x1.999999999999Ap-4:t) -> of_f64 (to_f64 r) = r
+       let r = of_f32 f in
+       eq_f32 f (0x1.99999Ap-4:t) -> of_f32 (to_f32 (of_f64 (to_f64 r))) = r
   end
 [wp:print-generated] 
   theory WP1
@@ -67,8 +66,8 @@
     
     goal wp_goal :
       forall f:t.
-       eq_f64 f (0x1.999999999999Ap-4:t) ->
-       not of_f64 f = (13421773.0 / 134217728.0)
+       eq_f32 f (0x1.99999Ap-4:t) ->
+       not of_f32 f = (3602879701896397.0 / 36028797018963968.0)
   end
 [wp:print-generated] 
   theory WP2
@@ -98,8 +97,7 @@
     
     goal wp_goal :
       forall f:t.
-       eq_f64 f (0x1.999999999999Ap-4:t) ->
-       of_f64 f = (3602879701896397.0 / 36028797018963968.0)
+       eq_f32 f (0x1.99999Ap-4:t) -> of_f32 f = (13421773.0 / 134217728.0)
   end
 [wp:print-generated] 
   theory WP3
@@ -128,8 +126,7 @@
     (* use frama_c_wp.cfloat.Cfloat *)
     
     goal wp_goal :
-      forall f:t.
-       eq_f64 f (0x1.999999999999Ap-4:t) -> not of_f64 f = (1.0 / 10.0)
+      forall f:t. eq_f32 f (0x1.99999Ap-4:t) -> not of_f32 f = (1.0 / 10.0)
   end
 [wp:print-generated] 
   theory WP4
@@ -159,9 +156,8 @@
     
     goal wp_goal :
       forall f:t1.
-       let r = of_f321 f in
-       eq_f32 f (0x1.99999Ap-4:t1) ->
-       of_f321 (to_f321 (of_f641 (to_f641 r))) = r
+       let r = of_f321 (to_f321 (of_f641 f)) in
+       eq_f64 f (0x1.999999999999Ap-4:t1) -> of_f641 (to_f641 r) = r
   end
 [wp:print-generated] 
   theory WP5
@@ -191,8 +187,8 @@
     
     goal wp_goal :
       forall f:t1.
-       eq_f32 f (0x1.99999Ap-4:t1) ->
-       not of_f321 f = (3602879701896397.0 /' 36028797018963968.0)
+       eq_f64 f (0x1.999999999999Ap-4:t1) ->
+       not of_f641 f = (13421773.0 /' 134217728.0)
   end
 [wp:print-generated] 
   theory WP6
@@ -222,7 +218,8 @@
     
     goal wp_goal :
       forall f:t1.
-       eq_f32 f (0x1.99999Ap-4:t1) -> of_f321 f = (13421773.0 /' 134217728.0)
+       eq_f64 f (0x1.999999999999Ap-4:t1) ->
+       of_f641 f = (3602879701896397.0 /' 36028797018963968.0)
   end
 [wp:print-generated] 
   theory WP7
@@ -251,7 +248,8 @@
     (* use frama_c_wp.cfloat.Cfloat1 *)
     
     goal wp_goal :
-      forall f:t1. eq_f32 f (0x1.99999Ap-4:t1) -> not of_f321 f = (1.0 /' 10.0)
+      forall f:t1.
+       eq_f64 f (0x1.999999999999Ap-4:t1) -> not of_f641 f = (1.0 /' 10.0)
   end
 [wp] 8 goals generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/funvar_inv.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/funvar_inv.0.res.oracle
index 98e419a07aee8ba4ba48cee5ccb3604e37bc21c3..2c16374dc4ab5dda44513eea004949b6fed2b4f0 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/funvar_inv.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/funvar_inv.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Hoare' [...]
 [kernel] Parsing tests/wp_acsl/funvar_inv.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_acsl/funvar_inv.i:24: Warning: 
   Can not compare pointers in Empty model
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/funvar_inv.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/funvar_inv.1.res.oracle
index 1e8b67744c38ef7bd61f9b0ed242afdea349b035..9ed2d133feedc53a1329bd81aaf5f4c4960d8e9d 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/funvar_inv.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/funvar_inv.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_acsl/funvar_inv.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
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
new file mode 100644
index 0000000000000000000000000000000000000000..233aa076c4f47f9a17aefdc2159597328de1ab61
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle/generalized_checks.res.oracle
@@ -0,0 +1,138 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_acsl/generalized_checks.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Axiomatic 'Th'
+------------------------------------------------------------
+
+Lemma C:
+Assume: 'A'
+Prove: (P_Q x_0) -> (P_R x_0)
+
+------------------------------------------------------------
+
+Lemma L:
+Assume: 'A'
+Prove: (P_P x_0) -> (P_R x_0)
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function caller
+------------------------------------------------------------
+
+Goal Post-condition 'R' in 'caller':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition 'R1,ko' in 'caller':
+Assume {
+  Type: is_sint32(caller_0) /\ is_sint32(x).
+  (* Pre-condition *)
+  Have: P_A(x) /\ P_CA1(x).
+  (* Call 'job' *)
+  Have: P_B(caller_0).
+}
+Prove: P_CB1(caller_0).
+
+------------------------------------------------------------
+
+Goal Post-condition 'R2,ko' in 'caller':
+Assume {
+  Type: is_sint32(caller_0) /\ is_sint32(x).
+  (* Pre-condition *)
+  Have: P_A(x) /\ P_CA1(x).
+  (* Call 'job' *)
+  Have: P_B(caller_0).
+}
+Prove: P_CA2(x).
+
+------------------------------------------------------------
+
+Goal Assigns nothing in 'caller':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns nothing in 'caller' (1/2):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns nothing in 'caller' (2/2):
+Call Result at line 65
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition 'A' in 'job'' in 'caller' at call 'job' (file tests/wp_acsl/generalized_checks.i, line 65)
+:
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition 'CA1' in 'job'' in 'caller' at call 'job' (file tests/wp_acsl/generalized_checks.i, line 65)
+:
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition 'CA2,ko' in 'job'' in 'caller' at call 'job' (file tests/wp_acsl/generalized_checks.i, line 65)
+:
+Assume { Type: is_sint32(x). (* Pre-condition *) Have: P_A(x) /\ P_CA1(x). }
+Prove: P_CA2(x).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function job
+------------------------------------------------------------
+
+Goal Post-condition 'B' in 'job':
+Let x_1 = L_F(x).
+Assume {
+  Type: is_sint32(x) /\ is_sint32(x_1).
+  (* Pre-condition *)
+  Have: P_A(x).
+}
+Prove: P_B(x_1).
+
+------------------------------------------------------------
+
+Goal Post-condition 'CB1' in 'job':
+Let x_1 = L_F(x).
+Assume {
+  Type: is_sint32(x) /\ is_sint32(x_1).
+  (* Pre-condition *)
+  Have: P_A(x).
+}
+Prove: P_CB1(x_1).
+
+------------------------------------------------------------
+
+Goal Post-condition 'CB2,ko' in 'job':
+Let x_1 = L_F(x).
+Assume {
+  Type: is_sint32(x) /\ is_sint32(x_1).
+  (* Pre-condition *)
+  Have: P_A(x).
+}
+Prove: P_CB2(x_1).
+
+------------------------------------------------------------
+
+Goal Assigns nothing in 'job':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns nothing in 'job' (1/2):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns nothing in 'job' (2/2):
+Call Result at line 52
+Prove: true.
+
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/implicit_enum_cast.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/implicit_enum_cast.res.oracle
index eb1d9e231e865f0617f96b469f30cf34c5808723..42361373ebac6c8663e3e5546108a194331eb896 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/implicit_enum_cast.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/implicit_enum_cast.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/implicit_enum_cast.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function bar
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/inductive.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/inductive.res.oracle
index a1016679f96bf1124f0d163eec275e1e005514b5..5a0fc4b056cc4d4e20fa1c9abef0dcf5cf6072f2 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/inductive.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/inductive.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/inductive.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 3 goals scheduled
 ---------------------------------------------
 --- Context 'typed' Cluster 'Compound' 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/init_label.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/init_label.res.oracle
index fa3df7a23c2dfe79628ecb33c9faafbe31eaed1d..d6d7a763dabdbea22d9406d84cb02d2b21587f8d 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/init_label.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/init_label.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/init_label.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_acsl/init_label.i:27: Warning: 
   No code nor implicit assigns clause for function main, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/init_value.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/init_value.0.res.oracle
index ce62bdd3dcb6bc382affb839cfc6bc059ffb20a3..c072c17ac8b64cf178f59ff7f1087f5bcdb32880 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/init_value.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/init_value.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-no-let [...]
 [kernel] Parsing tests/wp_acsl/init_value.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function fa1
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/init_value.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/init_value.1.res.oracle
index ec03acf8c197dad4cb8666eb3bd4c9c80359baf1..9501f9dee9b89f89211b0539e9b92a7d6dd01576 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/init_value.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/init_value.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-no-let [...]
 [kernel] Parsing tests/wp_acsl/init_value.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function fa1
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/init_value_mem.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/init_value_mem.0.res.oracle
index 2e42b9e3cb6a8630994a1fb4c7b1a47a9d35b696..c1cd26ad0172b9be22729b1c29f15e9e44681a06 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/init_value_mem.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/init_value_mem.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/init_value_mem.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/init_value_mem.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/init_value_mem.1.res.oracle
index 9a56e40c6559a000edbcd84c661d7d221bdb1f6d..c84b034766cb8247a37687e4559607b6510b27eb 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/init_value_mem.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/init_value_mem.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Hoare' [...]
 [kernel] Parsing tests/wp_acsl/init_value_mem.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_acsl/init_value_mem.i:24: Warning: 
   Can not load value in Empty model
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/initialized_memtyped.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/initialized_memtyped.res.oracle
index 391310e752a810f4c24a79f1233708b798619757..106088887237948475c2ecd809f1749403db46fb 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/initialized_memtyped.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/initialized_memtyped.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/initialized_memtyped.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function formal
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/initialized_memvar.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/initialized_memvar.res.oracle
index a243863d16ac7d5d0b344bbedb01ec951f90f0e4..5a91bd928d651804096c4ff7df91b8872952db8d 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/initialized_memvar.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/initialized_memvar.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/initialized_memvar.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function globals
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/intbool.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/intbool.res.oracle
index 753b578819b62e9364dbca8337b287cebf45f950..be8e2dc018cf0f402c6f5db0a4ed3f9484ec68fe 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/intbool.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/intbool.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/intbool.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function bug
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/invalid_pointer.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/invalid_pointer.res.oracle
index f1bb59e94b46d298d0042efddae2e4398c206640..a9d75cace6c480bb82fe3bd6f959244041928bb4 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/invalid_pointer.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/invalid_pointer.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/invalid_pointer.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_acsl/invalid_pointer.c:21: Warning: void object
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/label_escape.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/label_escape.res.oracle
index 69e92d2508b73b01a15556d24710437e2dab2264..4fca509b7392b2e7a3b27d079450d68e8503c62e 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/label_escape.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/label_escape.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/label_escape.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/logic.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/logic.res.oracle
index 85d318865a1934c7bb5c8f657a5ea7317cb64852..631003d71ae2bd9f15345fe79b47e6560a2aa869 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/logic.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/logic.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/logic.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_acsl/logic.i:65: Warning: 
   Cast with incompatible pointers types (source: __anonstruct_Buint_4*)
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 d6d7c7ffd7f9c9eccad217d19b140b14684eb9d4..c4c9cd16d8a6f2fab6c268ab7db6f9a08b92b855 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/looplabels.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/looplabels.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/looplabels.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function copy
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/memvar_chunk_typing.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/memvar_chunk_typing.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..26231a706b7047c6fddebcf89f9bf3c419d934e2
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle/memvar_chunk_typing.res.oracle
@@ -0,0 +1,11 @@
+# frama-c -wp -wp-rte [...]
+[kernel] Parsing tests/wp_acsl/memvar_chunk_typing.i (no preprocessing)
+[wp] Running WP plugin...
+------------------------------------------------------------
+  Global
+------------------------------------------------------------
+
+Lemma L:
+Prove: (is_uint8 C_0) -> (P_P C_0)
+
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/null.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/null.res.oracle
index 7d61a351b3eaf5debd682c5568fa7e3159307953..16ac874aa695270bd9cf2784c559eb4e32c7fa23 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/null.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/null.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/null.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Global
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/pointer.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/pointer.res.oracle
index 1737e32302ff4c5e5d4697e084868bd3665b1c7c..4339266bbaf17b0b122e18a85903f672b452e038 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/pointer.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/pointer.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/pointer.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_acsl/pointer.i:50: Warning: 
   Uncomparable locations p_0 and mem:t.(0)
@@ -236,8 +235,10 @@ Prove: false.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'compare':
-  /*@ behavior typed: requires \separated(&p,q+(..)); */
+  /*@ behavior typed:
+        requires \separated(q + (..), &p); */
   void compare(int *q);
 [wp] Warning: Memory model hypotheses for function 'absurd':
-  /*@ behavior typed: requires \separated(&p,q+(..)); */
+  /*@ behavior typed:
+        requires \separated(q + (..), &p); */
   void absurd(int *q);
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/post_result.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/post_result.res.oracle
index 0f84cd85b5cd7a46cd0967aa751957bce8f12f13..ea63412d59c5d71be853ac19c19e87d65ecbae1a 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/post_result.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/post_result.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/post_result.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function correct
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/precedence.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/precedence.res.oracle
index 0071a69eb1e7fb791cc0233cb8322a7c9a4b96a0..eac17274f2665b22412eeef5c0f3cdc6d7215b32 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/precedence.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/precedence.res.oracle
@@ -37,7 +37,6 @@
 [kernel:annot-error] tests/wp_acsl/precedence.i:176: Warning: 
   P is not a logic variable. Ignoring code annotation
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function bitwise
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/predicates_functions.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/predicates_functions.res.oracle
index cc8be9b8f30eaa467abd089ef3985f5513521604..666a26c85f56963f5b071d371f368c685ab8e46c 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/predicates_functions.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/predicates_functions.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/predicates_functions.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 1 goal scheduled
 [wp:print-generated] 
   theory WP
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/range.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/range.res.oracle
index 84774868393af390c003b21be78894daabd7b934..e0054bf13b602a75c7f62e23aa586efff7111dd3 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/range.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/range.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/range.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function test
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/reads.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/reads.res.oracle
index 3a8f0e7073f21c2fd8b6fa11751e7b29521945c7..430cdc96add4646c44083c74bfc1b93928ca43d1 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/reads.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/reads.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/reads.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/record.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/record.res.oracle
index da2599913d086186fdfc2beb58e1ef65993d3322..43d8c4d3eceaa9b41e44c062e7c6911fc91ab7ca 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/record.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/record.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/record.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
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 42be62e61943aacc4721bde62a57dd5b2d7b9a34..f4bf9c3fb0ee68f5f3174bd207003e8881f3eb04 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/simpl_is_type.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function check_acsl
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/sizeof.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/sizeof.res.oracle
index f7f75c471935ecbc0714fc8b0b5e947d60fb64d1..36be29ece00d5befea013d85ab46a0f7ef6cfa1e 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/sizeof.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/sizeof.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/sizeof.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function foo
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle
index 671f41e12dab20cba05bfa5d58879b49162d44be..0a7a16a6acadb3ef41857bbbff863c300b5da1be 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte -wp-no-let [...]
 [kernel] Parsing tests/wp_acsl/struct_fields.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function foo
 [wp] 2 goals scheduled
 ---------------------------------------------
@@ -217,16 +216,17 @@ end
     
     (* use frama_c_wp.memory.Memory *)
     
-    (* use Chunk *)
-    
     (* use S1_X *)
     
+    (* use Chunk *)
+    
     (* use Compound *)
     
     goal wp_goal :
       forall t:addr -> bool, t1:int -> int, t2:addr -> int, t3:addr -> int, t4:
-       addr -> int, a:addr.
+       addr -> int, a:addr, x:S1_X.
        region (base a) <= 0 ->
+       IsS1_X x ->
        is_sint16_chunk t3 ->
        is_sint32_chunk t4 ->
        is_sint8_chunk t2 ->
@@ -241,15 +241,15 @@ end
 
 Goal Assertion 'rte,mem_access' (file tests/wp_acsl/struct_fields.i, line 15):
 Assume {
-  Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
+  Type: IsS1_X(r) /\ is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint8_chunk(Mchar_0) /\
       IsS1_X(Load_S1_X(p, Mchar_0, Mint_0, Mint_1)).
   (* Heap *)
   Type: (region(p.base) <= 0) /\ linked(Malloc_0) /\ sconst(Mchar_0) /\
       cinits(Init_0).
-  Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
+  Type: IsS1_X(r) /\ is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint8_chunk(Mchar_0).
-  Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
+  Type: IsS1_X(r) /\ is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint8_chunk(Mchar_0).
   (* Block In *)
   Have: ({ Init_F1_X_a = false ; Init_F1_X_b = false ; Init_F1_X_c = false }) =
@@ -262,16 +262,16 @@ Prove: valid_rd(Malloc_0, p, 3).
 Goal Assertion 'rte,mem_access' (file tests/wp_acsl/struct_fields.i, line 16):
 Let a = Load_S1_X(p, Mchar_0, Mint_0, Mint_1).
 Assume {
-  Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
+  Type: IsS1_X(r) /\ is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint8_chunk(Mchar_0) /\ IsS1_X(a).
   (* Heap *)
   Type: (region(p.base) <= 0) /\ linked(Malloc_0) /\ sconst(Mchar_0) /\
       cinits(Init_0).
-  Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
+  Type: IsS1_X(r) /\ is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint8_chunk(Mchar_0).
-  Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
+  Type: IsS1_X(r) /\ is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint8_chunk(Mchar_0).
-  Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
+  Type: IsS1_X(r) /\ is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint8_chunk(Mchar_0).
   (* Block In *)
   Have: ({ Init_F1_X_a = false ; Init_F1_X_b = false ; Init_F1_X_c = false }) =
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/struct_use_case.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/struct_use_case.res.oracle
index 0c38eb7360b7bfa42438f241c774cb8a16d84fb8..64f1be48e24c86ff4c8a415eec93aa0fa33581d0 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/struct_use_case.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/struct_use_case.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Caveat)' [...]
 [kernel] Parsing tests/wp_acsl/struct_use_case.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/sum_types.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/sum_types.res.oracle
index 41bb0db407147d61133f3a2d16373ed8ce45e1a8..ed60c90f28251a77c85ba2795070ecd1e677415e 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/sum_types.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/sum_types.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/sum_types.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 3 goals scheduled
 ---------------------------------------------
 --- Context 'typed' Cluster 'A_A' 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/tset.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/tset.res.oracle
index 50ee7b41eb8b5ccfacdd869f64bc9b502f7f82b3..60245b69a897f75bf1485cc637107cacb55a45d3 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/tset.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/tset.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/tset.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 ------------------------------------------------------------
   Global
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/type_guard.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/type_guard.res.oracle
index 272aafaea491f208989b8333e68fb50e0ad5d0ac..795eedf06cd80d6c7b0ebd3e2d5e5384c049503b 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/type_guard.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/type_guard.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/type_guard.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/unit_bit_test.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/unit_bit_test.res.oracle
index fd300d3519d9efe6d15d2ed49b727063784ac000..9cc603d5697fb6981218c143fa1352eff8620530 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/unit_bit_test.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/unit_bit_test.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/unit_bit_test.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function rotate_left
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/unit_bool.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/unit_bool.res.oracle
index d4de7cfa3f0f970563a557098110b87b7e45f8d3..ed47c09c4a64ce354e0558afdac39b0e2c0c76cf 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/unit_bool.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/unit_bool.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/unit_bool.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Axiomatic 'Foo'
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/unit_compare.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/unit_compare.res.oracle
index daf696e3420f36a45f874ab2cb9adacde0e679ec..b0b0dba7b56f820f5ccdc133b8d9012b4f41d519 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/unit_compare.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/unit_compare.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/unit_compare.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/unsupported_builtin.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/unsupported_builtin.res.oracle
index ba6653276cc75ae8be4101cb33aa82a76395cc3b..0becba4e3779f4a17ec4a22b65cbde6ffa263a4b 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/unsupported_builtin.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/unsupported_builtin.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/unsupported_builtin.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_acsl/unsupported_builtin.i:10: Warning: 
   No code nor implicit assigns clause for function foo, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/user_def_type_guard.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/user_def_type_guard.res.oracle
index bb65f617048e92dcc6b68dd241c9719529e8b3be..c617b1318c2d2ecbab5e0c441ba6513bfc85a418 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/user_def_type_guard.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/user_def_type_guard.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/user_def_type_guard.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/arith.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/arith.0.res.oracle
index 54afe789f7401e45161e0acdb40d9ba1b26c41e2..7f14ed8bcd3e729b54b79658add3bb4d944a617f 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/arith.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/arith.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/arith.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 24 goals scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_ASSOC_land_qed_ok : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/arith.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/arith.1.res.oracle
index 8164480855d10ab65821a833fe4a2e948355e0b0..414816fbfb37797ae157187361886b952bf51dda 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/arith.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/arith.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-steps 50 [...]
 [kernel] Parsing tests/wp_acsl/arith.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_cast_sgn_usgn_ensures_qed_ko_KO : Unsuccess
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assign_array.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assign_array.res.oracle
index 5ec6a5228a3cd7e392da615936157e928f9ccf0a..09587f786aa777e3aa09854a3f2c8dc5fc94ac13 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assign_array.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assign_array.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/assign_array.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 4 goals scheduled
 [wp] [Qed] Goal typed_jobA_assigns_exit : Valid
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 b2c5f9a9db3f18275eb72bff62e0519326fb2767..660872093ac27a7d2ae67acedee77f2b66c6c471 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
@@ -1,13 +1,39 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/assigned_initialized_memtyped.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 42 goals scheduled
+[wp] [Alt-Ergo] Goal typed_initialize_loop_invariant_CHECK_preserved : Valid
+[wp] [Qed] Goal typed_initialize_loop_invariant_CHECK_established : Valid
+[wp] [Alt-Ergo] Goal typed_initialize_check_CHECK : Valid
+[wp] [Qed] Goal typed_initialize_loop_assigns_part1 : Valid
+[wp] [Qed] Goal typed_initialize_loop_assigns_part2 : Valid
+[wp] [Qed] Goal typed_initialize_loop_assigns_part3 : Valid
+[wp] [Alt-Ergo] Goal typed_range_check_CHECK : Valid
+[wp] [Qed] Goal typed_range_loop_assigns_part1 : Valid
+[wp] [Qed] Goal typed_range_loop_assigns_part2 : Valid
+[wp] [Qed] Goal typed_range_loop_assigns_part3 : Valid
+[wp] [Alt-Ergo] Goal typed_field_check_CHECK : Valid
+[wp] [Qed] Goal typed_field_loop_assigns_part1 : Valid
+[wp] [Qed] Goal typed_field_loop_assigns_part2 : Valid
 [wp] [Alt-Ergo] Goal typed_array_check_CHECK : Valid
 [wp] [Qed] Goal typed_array_loop_assigns_part1 : Valid
 [wp] [Qed] Goal typed_array_loop_assigns_part2 : Valid
 [wp] [Qed] Goal typed_array_loop_assigns_part3 : Valid
+[wp] [Alt-Ergo] Goal typed_index_check_CHECK : Valid
+[wp] [Qed] Goal typed_index_loop_assigns_part1 : Valid
+[wp] [Qed] Goal typed_index_loop_assigns_part2 : Valid
+[wp] [Qed] Goal typed_index_loop_assigns_part3 : Valid
+[wp] [Alt-Ergo] Goal typed_descr_check_CHECK : Valid
+[wp] [Qed] Goal typed_descr_loop_assigns_part1 : Valid
+[wp] [Alt-Ergo] Goal typed_descr_loop_assigns_part2 : Valid
+[wp] [Qed] Goal typed_descr_loop_assigns_part3 : Valid
+[wp] [Qed] Goal typed_descr_loop_assigns_part4 : Valid
+[wp] [Qed] Goal typed_descr_loop_assigns_part5 : Valid
+[wp] [Alt-Ergo] Goal typed_comp_check_CHECK : Valid
+[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] [Alt-Ergo] Goal typed_assigned_glob_check_CHECK : Valid
 [wp] [Alt-Ergo] Goal typed_assigned_glob_loop_invariant_CHECK_preserved : Valid
 [wp] [Qed] Goal typed_assigned_glob_loop_invariant_CHECK_established : Valid
@@ -19,33 +45,6 @@
 [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] [Alt-Ergo] Goal typed_comp_check_CHECK : Valid
-[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] [Alt-Ergo] Goal typed_descr_check_CHECK : Valid
-[wp] [Qed] Goal typed_descr_loop_assigns_part1 : Valid
-[wp] [Alt-Ergo] Goal typed_descr_loop_assigns_part2 : Valid
-[wp] [Qed] Goal typed_descr_loop_assigns_part3 : Valid
-[wp] [Qed] Goal typed_descr_loop_assigns_part4 : Valid
-[wp] [Qed] Goal typed_descr_loop_assigns_part5 : Valid
-[wp] [Alt-Ergo] Goal typed_field_check_CHECK : Valid
-[wp] [Qed] Goal typed_field_loop_assigns_part1 : Valid
-[wp] [Qed] Goal typed_field_loop_assigns_part2 : Valid
-[wp] [Alt-Ergo] Goal typed_index_check_CHECK : Valid
-[wp] [Qed] Goal typed_index_loop_assigns_part1 : Valid
-[wp] [Qed] Goal typed_index_loop_assigns_part2 : Valid
-[wp] [Qed] Goal typed_index_loop_assigns_part3 : Valid
-[wp] [Alt-Ergo] Goal typed_initialize_loop_invariant_CHECK_preserved : Valid
-[wp] [Qed] Goal typed_initialize_loop_invariant_CHECK_established : Valid
-[wp] [Alt-Ergo] Goal typed_initialize_check_CHECK : Valid
-[wp] [Qed] Goal typed_initialize_loop_assigns_part1 : Valid
-[wp] [Qed] Goal typed_initialize_loop_assigns_part2 : Valid
-[wp] [Qed] Goal typed_initialize_loop_assigns_part3 : Valid
-[wp] [Alt-Ergo] Goal typed_range_check_CHECK : Valid
-[wp] [Qed] Goal typed_range_loop_assigns_part1 : Valid
-[wp] [Qed] Goal typed_range_loop_assigns_part2 : Valid
-[wp] [Qed] Goal typed_range_loop_assigns_part3 : Valid
 [wp] Proved goals:   42 / 42
   Qed:            27 
   Alt-Ergo:       15
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.res.oracle
index 45f96059729f403bf623e724e9e3b002964abac5..73c1299e84eef5626085f89187fbc140eae7a64b 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.res.oracle
@@ -1,31 +1,30 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/assigned_initialized_memvar.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 22 goals scheduled
+[wp] [Alt-Ergo] Goal typed_initialize_loop_invariant_CHECK_preserved : Valid
+[wp] [Qed] Goal typed_initialize_loop_invariant_CHECK_established : Valid
+[wp] [Alt-Ergo] Goal typed_initialize_check_CHECK : Valid
+[wp] [Qed] Goal typed_initialize_loop_assigns : Valid
+[wp] [Alt-Ergo] Goal typed_range_check_CHECK : Valid
+[wp] [Qed] Goal typed_range_loop_assigns_part1 : Valid
+[wp] [Qed] Goal typed_range_loop_assigns_part2 : Valid
+[wp] [Alt-Ergo] Goal typed_field_check_CHECK : Valid
+[wp] [Qed] Goal typed_field_loop_assigns : Valid
 [wp] [Alt-Ergo] Goal typed_array_check_CHECK : Valid
 [wp] [Qed] Goal typed_array_loop_assigns : Valid
-[wp] [Alt-Ergo] Goal typed_comp_check_CHECK : Valid
-[wp] [Qed] Goal typed_comp_loop_assigns : Valid
+[wp] [Alt-Ergo] Goal typed_index_check_CHECK : Valid
+[wp] [Qed] Goal typed_index_loop_assigns_part1 : Valid
+[wp] [Qed] Goal typed_index_loop_assigns_part2 : Valid
 [wp] [Alt-Ergo] Goal typed_descr_check_CHECK : Valid
 [wp] [Qed] Goal typed_descr_loop_assigns_part1 : Valid
 [wp] [Alt-Ergo] Goal typed_descr_loop_assigns_part2 : Valid
 [wp] [Qed] Goal typed_descr_loop_assigns_part3 : Valid
 [wp] [Qed] Goal typed_descr_loop_assigns_part4 : Valid
 [wp] [Qed] Goal typed_descr_loop_assigns_part5 : Valid
-[wp] [Alt-Ergo] Goal typed_field_check_CHECK : Valid
-[wp] [Qed] Goal typed_field_loop_assigns : Valid
-[wp] [Alt-Ergo] Goal typed_index_check_CHECK : Valid
-[wp] [Qed] Goal typed_index_loop_assigns_part1 : Valid
-[wp] [Qed] Goal typed_index_loop_assigns_part2 : Valid
-[wp] [Alt-Ergo] Goal typed_initialize_loop_invariant_CHECK_preserved : Valid
-[wp] [Qed] Goal typed_initialize_loop_invariant_CHECK_established : Valid
-[wp] [Alt-Ergo] Goal typed_initialize_check_CHECK : Valid
-[wp] [Qed] Goal typed_initialize_loop_assigns : Valid
-[wp] [Alt-Ergo] Goal typed_range_check_CHECK : Valid
-[wp] [Qed] Goal typed_range_loop_assigns_part1 : Valid
-[wp] [Qed] Goal typed_range_loop_assigns_part2 : Valid
+[wp] [Alt-Ergo] Goal typed_comp_check_CHECK : Valid
+[wp] [Qed] Goal typed_comp_loop_assigns : Valid
 [wp] Proved goals:   22 / 22
   Qed:            13 
   Alt-Ergo:        9
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_not_initialized_memtyped.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_not_initialized_memtyped.res.oracle
index da65ee4ddd2bfffa0a8b410458696f43d072bb8a..183c0c59b683a4e8f1257724c2d6ea67dbd8ef8a 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_not_initialized_memtyped.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_not_initialized_memtyped.res.oracle
@@ -1,18 +1,17 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/assigned_not_initialized_memtyped.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 9 goals scheduled
+[wp] [Alt-Ergo] Goal typed_atomic_check_FAIL : Unsuccess
+[wp] [Alt-Ergo] Goal typed_comp_check_FAIL : Unsuccess
 [wp] [Alt-Ergo] Goal typed_array_check_FAIL : Unsuccess
-[wp] [Alt-Ergo] Goal typed_assigned_glob_array_check_FAIL : Unsuccess
-[wp] [Alt-Ergo] Goal typed_assigned_glob_array_check_OK : Valid
 [wp] [Alt-Ergo] Goal typed_assigned_glob_atomic_check_FAIL : Unsuccess
 [wp] [Alt-Ergo] Goal typed_assigned_glob_atomic_check_OK : Valid
 [wp] [Alt-Ergo] Goal typed_assigned_glob_comp_check_FAIL : Unsuccess
 [wp] [Alt-Ergo] Goal typed_assigned_glob_comp_check_OK : Valid
-[wp] [Alt-Ergo] Goal typed_atomic_check_FAIL : Unsuccess
-[wp] [Alt-Ergo] Goal typed_comp_check_FAIL : Unsuccess
+[wp] [Alt-Ergo] Goal typed_assigned_glob_array_check_FAIL : Unsuccess
+[wp] [Alt-Ergo] Goal typed_assigned_glob_array_check_OK : Valid
 [wp] Proved goals:    3 / 9
   Qed:             0 
   Alt-Ergo:        3  (unsuccess: 6)
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_not_initialized_memvar.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_not_initialized_memvar.res.oracle
index d43006f651cbab443155805de39a03a2ad7b042d..e5a1208fc8f44c52782c44786da7d621138f1091 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_not_initialized_memvar.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_not_initialized_memvar.res.oracle
@@ -1,12 +1,11 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/assigned_not_initialized_memvar.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
-[wp] [Alt-Ergo] Goal typed_array_check_FAIL : Unsuccess
 [wp] [Alt-Ergo] Goal typed_atomic_check_FAIL : Unsuccess
 [wp] [Alt-Ergo] Goal typed_comp_check_FAIL : Unsuccess
+[wp] [Alt-Ergo] Goal typed_array_check_FAIL : Unsuccess
 [wp] Proved goals:    0 / 3
   Alt-Ergo:        0  (unsuccess: 3)
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigns_path.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigns_path.res.oracle
index 1c72369eadb0141c75c9fb022c8f36a4559cb1d7..180d946c3170c9be3b7dfdaa9a4df4820f951158 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigns_path.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigns_path.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/assigns_path.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 9 goals scheduled
 [wp] [Qed] Goal typed_job_ensures_N : Valid
@@ -21,5 +20,6 @@
   job                       6        3        9       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'job':
-  /*@ behavior typed: requires \separated(&p,b+(..)); */
+  /*@ behavior typed:
+        requires \separated(b + (..), &p); */
   void job(int n, int *b);
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigns_range.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigns_range.0.res.oracle
index 12d57a19994c19e1752f5f0e499f6270d2970d22..3cbb5dfd2f11d8fd8feb15bf5e57bb40c917e3a8 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigns_range.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigns_range.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/assigns_range.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 17 goals scheduled
 [wp] [Qed] Goal typed_call_assigns_all_assigns_exit_part1 : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigns_range.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigns_range.1.res.oracle
index d1cface46cfd4030462b77ed7885c624776d5ed8..18f62e7ca9b9d00fabe5574939745779e8c99cec 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigns_range.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigns_range.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-steps 50 [...]
 [kernel] Parsing tests/wp_acsl/assigns_range.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 6 goals scheduled
 [wp] [Alt-Ergo] Goal typed_call_assigns_t1_assigns_exit : Unsuccess
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/axioms.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/axioms.res.oracle
index 2f3e2cbcff8f30f4f441ef12eee791c834f2ace6..f2b749cff0c1d4178cd95a5bb4e17051664932a8 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/axioms.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/axioms.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/axioms.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 10 goals scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures_P_todo : Unsuccess
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/base_offset.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/base_offset.res.oracle
index 365c8b069cab811184cebb19b0cf514909a33d35..05b7c9c11f25194d55795c9aba8475fecd23d1f0 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/base_offset.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/base_offset.res.oracle
@@ -1,16 +1,18 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/base_offset.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
-[wp] 3 goals scheduled
+[wp] 5 goals scheduled
 [wp] [Qed] Goal typed_f_ensures : Valid
 [wp] [Qed] Goal typed_f_ensures_2 : Valid
-[wp] [Alt-Ergo] Goal typed_f_ensures_3 : Unsuccess
-[wp] Proved goals:    2 / 3
+[wp] [Alt-Ergo] Goal typed_f_ensures_3 : Valid
+[wp] [Alt-Ergo] Goal typed_g_check_KO : Unsuccess
+[wp] [Alt-Ergo] Goal typed_g_check_KO_2 : Unsuccess
+[wp] Proved goals:    3 / 5
   Qed:             2 
-  Alt-Ergo:        0  (unsuccess: 1)
+  Alt-Ergo:        1  (unsuccess: 2)
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
-  f                         2        -        3      66.7%
+  f                         2        1        3       100%
+  g                         -        -        2       0.0%
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise.res.oracle
index fe9cf947ab420526afde486234dc6a35235c00c0..a91b7a0149b5b87b9fc08bf7b402236915adc151 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/bitwise.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 29 goals scheduled
 [wp] [Qed] Goal typed_band_ensures : Valid
@@ -12,27 +11,27 @@
 [wp] [Qed] Goal typed_band_bit2_ensures_band4 : Valid
 [wp] [Qed] Goal typed_band_bit3_ensures_band5 : Valid
 [wp] [Qed] Goal typed_band_bit4_ensures_band6 : Valid
-[wp] [Alt-Ergo] Goal typed_band_bool_false_ensures : Valid
-[wp] [Qed] Goal typed_band_bool_true_ensures : Valid
-[wp] [Qed] Goal typed_bnot_ensures : Valid
 [wp] [Qed] Goal typed_bor_ensures : Valid
 [wp] [Qed] Goal typed_bor_ensures_bor0 : Valid
 [wp] [Qed] Goal typed_bor_bit1_ensures_bor1 : Valid
 [wp] [Qed] Goal typed_bor_bit2_ensures_bor2 : Valid
 [wp] [Qed] Goal typed_bor_bit3_ensures_bor3 : Valid
-[wp] [Alt-Ergo] Goal typed_bor_bool_false_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_bor_bool_true_ensures : Valid
 [wp] [Qed] Goal typed_bxor_ensures : Valid
 [wp] [Qed] Goal typed_bxor_bit1_ensures : Valid
 [wp] [Qed] Goal typed_bxor_bit2_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_bxor_bool_false_ensures : Valid
-[wp] [Qed] Goal typed_bxor_bool_true_ensures : Valid
+[wp] [Qed] Goal typed_bnot_ensures : Valid
 [wp] [Qed] Goal typed_lshift_ensures : Valid
 [wp] [Qed] Goal typed_lshift_shift1_ensures_lsl1 : Valid
 [wp] [Qed] Goal typed_lshift_shift1_ensures_lsl2 : Valid
 [wp] [Qed] Goal typed_lshift_shift2_ensures_lsl3 : Valid
 [wp] [Qed] Goal typed_rshift_ensures : Valid
 [wp] [Qed] Goal typed_rshift_shift1_ensures_lsr1 : Valid
+[wp] [Alt-Ergo] Goal typed_bor_bool_true_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_bor_bool_false_ensures : Valid
+[wp] [Qed] Goal typed_band_bool_true_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_band_bool_false_ensures : Valid
+[wp] [Qed] Goal typed_bxor_bool_true_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_bxor_bool_false_ensures : Valid
 [wp] Proved goals:   29 / 29
   Qed:            25 
   Alt-Ergo:        4
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise2.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise2.res.oracle
index 722cd23bada5690be0e1e98def00b5986f6da59d..df621b7dc0c486eb9d2d42f2c6941751c8cd9653 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise2.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/bitwise2.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 5 goals scheduled
 [wp] [Qed] Goal typed_job1_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/block_length.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/block_length.res.oracle
index c366fd7097fd7ee890f69f1d2627ce9ecc6d726b..41e658859356999332ae7131da7c0504d1a344c0 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/block_length.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/block_length.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/block_length.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 10 goals scheduled
 [wp] [Qed] Goal typed_f_ensures_Pt : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/boolean.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/boolean.res.oracle
index 9df0dc2a56038df5b6357bcc942089b311adeb89..339f025ca519ea7f68aef813cc884a842def83ae 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/boolean.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/boolean.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/boolean.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 4 goals scheduled
 [wp] [Alt-Ergo] Goal typed_u8_is_continue_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/checks.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/checks.res.oracle
index b4d2560332c3367fd94cbf59b7e677e8be87dd0a..76d4cc6f9ddb98747bf335c3dd82f12c1ec50b75 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/checks.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/checks.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-steps 5 [...]
 [kernel] Parsing tests/wp_acsl/checks.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 4 goals scheduled
 [wp] [Alt-Ergo] Goal typed_main_check_c1 : Unsuccess
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing.res.oracle
index 89b1b1b5b973e603935151a80fee6115eeaa1b79..48e98d4fa14c783c2f68c1b0a33ea97593912457 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp_acsl/chunk_typing.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function function
 [wp] 39 goals scheduled
 [wp] [Alt-Ergo] Goal typed_function_ensures : Valid
@@ -53,9 +52,14 @@
 [wp] Warning: Memory model hypotheses for function 'function':
   /*@
      behavior typed:
-     requires \separated(x+(..),
-                \union(i8+(..),u8+(..),i16+(..),u16+(..),i32+(..),u32+(..),
-                  i64+(..),u64+(..)));
+       requires \separated(i16 + (..), (char const *)x + (..));
+       requires \separated(i32 + (..), (char const *)x + (..));
+       requires \separated(i64 + (..), (char const *)x + (..));
+       requires \separated(i8 + (..), (char const *)x + (..));
+       requires \separated(u16 + (..), (char const *)x + (..));
+       requires \separated(u32 + (..), (char const *)x + (..));
+       requires \separated(u64 + (..), (char const *)x + (..));
+       requires \separated(u8 + (..), (char const *)x + (..));
      */
   void function(signed char * /*[10]*/ i8, unsigned char * /*[10]*/ u8,
                 short * /*[10]*/ i16, unsigned short * /*[10]*/ u16,
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing_usable.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing_usable.res.oracle
index c503421c8a958092c2d9bd7e08643dac8c075331..01ceab39f726f162ae53c9bbc5f7d7be11fc1cef 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing_usable.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing_usable.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp_acsl/chunk_typing_usable.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function usable_axiom
 [rte] annotating function usable_lemma
 [wp] Warning: native support for coq is deprecated, use tip instead
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.0.res.oracle
index 80fb3297716e38d68086c61059ada03e9d6381c9..9d414c889b3bb3207f9ce5869c66bbaa0c70e18f 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/classify_float.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 3 goals scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_InfN_not_finite : Valid
 [wp] [Alt-Ergo] Goal typed_lemma_InfP_not_finite : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.1.res.oracle
index bef955a1d640a7e2b4ab9af3633501ca1b5301ee..e49465837218c5419ceae5e14c75d99ed2b0babf 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/classify_float.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: native support for alt-ergo is deprecated, use why3 instead
 [wp] 3 goals scheduled
 [wp] [Alt-Ergo (native)] Goal typed_lemma_InfN_not_finite : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.2.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.2.res.oracle
index f0c942664c189643200669817d97a9b96cd651f0..4da1cb298a6881cbb3a8943597b4f8ecdad3de68 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.2.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/classify_float.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: native support for coq is deprecated, use tip instead
 [wp] 3 goals scheduled
 [wp] [Coq] Goal typed_lemma_InfN_not_finite : Saved script
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.3.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.3.res.oracle
index b6583d3f4c6a466b4fb40a446ac02a1f289ffa84..6f5af142a49b2d515937796f08d2fb2f3d51e1fe 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.3.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.3.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Real)' [...]
 [kernel] Parsing tests/wp_acsl/classify_float.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 3 goals scheduled
 [wp] [Qed] Goal typed_real_lemma_InfN_not_finite : Valid
 [wp] [Qed] Goal typed_real_lemma_InfP_not_finite : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/cnf.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/cnf.res.oracle
index 979b8b88f24de686b3269c1c829b0bf3c69cf033..9ecfe8363f1cdff07c5577f231aed7513c9adf00 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/cnf.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/cnf.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/cnf.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 43 goals scheduled
 [wp:cnf] CNF=P_A /\ P_A1 /\ P_A2
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/ctor.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/ctor.res.oracle
index e9fd5565a05fff14d503d81b5214be2d05e00dbb..8aa8444599fedd28182aef2628080b91ad06681a 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/ctor.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/ctor.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/ctor.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 2 goals scheduled
 [wp] [Qed] Goal typed_lemma_cons : Valid
 [wp] [Qed] Goal typed_lemma_diff : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/div_mod.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/div_mod.0.res.oracle
index 711ee91f78a6c24e79eb927a9efda21d173c0324..94777d12beffa59d8b5b76ed6f77bc2e4b7fb764 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/div_mod.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/div_mod.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/div_mod.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 22 goals scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures_d0_div_pos_pos : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/div_mod.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/div_mod.1.res.oracle
index 711ee91f78a6c24e79eb927a9efda21d173c0324..94777d12beffa59d8b5b76ed6f77bc2e4b7fb764 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/div_mod.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/div_mod.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/div_mod.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 22 goals scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures_d0_div_pos_pos : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/div_mod.2.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/div_mod.2.res.oracle
index b798c16bdb6bc2b59169d585e06bf09ab3a7b7d3..65c66c6e2b9d8eb7cfe6f226277d15564e207144 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/div_mod.2.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/div_mod.2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-steps 50 [...]
 [kernel] Parsing tests/wp_acsl/div_mod.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures_d7_div_0_x_ko : Unsuccess
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/e_imply.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/e_imply.res.oracle
index 7718ca4b67d4ec3eb13fac67b914fe1b9201dacd..1f2b15cef67cb8058051884f76366f81771e4800 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/e_imply.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/e_imply.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/e_imply.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 42 goals scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures_p0 : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/equal.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/equal.res.oracle
index da11be9212d4d290de284dbfa46cf79f3d630faf..950c758b70c5295e2c48394f5367085488c07c9f 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/equal.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/equal.res.oracle
@@ -1,15 +1,14 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/equal.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 6 goals scheduled
-[wp] [Alt-Ergo] Goal typed_simple_array_ensures : Valid
 [wp] [Qed] Goal typed_simple_struct_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_simple_array_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_with_array_struct_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_with_ptr_and_array_struct_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_with_ptr_array_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_with_ptr_struct_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_with_ptr_array_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_with_ptr_and_array_struct_ensures : Valid
 [wp] Proved goals:    6 / 6
   Qed:             1 
   Alt-Ergo:        5
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/float_compare.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/float_compare.0.res.oracle
index cb949a9f9545c5163da4efda55c2ac57205e9b0b..0bf8482694768045a032e0ddceb752fb2a1dac83 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/float_compare.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/float_compare.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/float_compare.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 19 goals scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_finite_32_64 : Valid
@@ -10,6 +9,9 @@
 [wp] [Alt-Ergo] Goal typed_lemma_test_double_compare_greater : Valid
 [wp] [Alt-Ergo] Goal typed_lemma_test_float_compare : Valid
 [wp] [Alt-Ergo] Goal typed_lemma_test_float_compare_greater : Valid
+[wp] [Alt-Ergo] Goal typed_cmp_ff_ensures_DEF : Valid
+[wp] [Alt-Ergo] Goal typed_cmp_ff_ensures_REL1 : Valid
+[wp] [Alt-Ergo] Goal typed_cmp_ff_ensures_REL2 : Valid
 [wp] [Alt-Ergo] Goal typed_cmp_dd_ensures_DEF : Valid
 [wp] [Alt-Ergo] Goal typed_cmp_dd_ensures_REL1 : Valid
 [wp] [Alt-Ergo] Goal typed_cmp_dd_ensures_REL2 : Valid
@@ -18,9 +20,6 @@
 [wp] [Alt-Ergo] Goal typed_cmp_fd_ensures_REL2 : Valid
 [wp] [Alt-Ergo] Goal typed_cmp_fd_assert : Valid
 [wp] [Alt-Ergo] Goal typed_cmp_fd_assert_2 : Valid
-[wp] [Alt-Ergo] Goal typed_cmp_ff_ensures_DEF : Valid
-[wp] [Alt-Ergo] Goal typed_cmp_ff_ensures_REL1 : Valid
-[wp] [Alt-Ergo] Goal typed_cmp_ff_ensures_REL2 : Valid
 [wp] [Qed] Goal typed_cmp_fnan_ensures_POS : Valid
 [wp] [Qed] Goal typed_cmp_fnan_ensures_NEG : Valid
 [wp] Proved goals:   19 / 19
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/float_compare.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/float_compare.1.res.oracle
index 08e524f9e5ad5fc53f396d2a7df478d33f6e2778..27675ba0b6830fff79c02e047b5d86136f7f0eee 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/float_compare.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/float_compare.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Real)' [...]
 [kernel] Parsing tests/wp_acsl/float_compare.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 19 goals scheduled
 [wp] [Qed] Goal typed_real_lemma_finite_32_64 : Valid
@@ -10,6 +9,9 @@
 [wp] [Alt-Ergo] Goal typed_real_lemma_test_double_compare_greater : Valid
 [wp] [Alt-Ergo] Goal typed_real_lemma_test_float_compare : Valid
 [wp] [Alt-Ergo] Goal typed_real_lemma_test_float_compare_greater : Valid
+[wp] [Qed] Goal typed_real_cmp_ff_ensures_DEF : Valid
+[wp] [Qed] Goal typed_real_cmp_ff_ensures_REL1 : Valid
+[wp] [Qed] Goal typed_real_cmp_ff_ensures_REL2 : Valid
 [wp] [Qed] Goal typed_real_cmp_dd_ensures_DEF : Valid
 [wp] [Qed] Goal typed_real_cmp_dd_ensures_REL1 : Valid
 [wp] [Qed] Goal typed_real_cmp_dd_ensures_REL2 : Valid
@@ -18,9 +20,6 @@
 [wp] [Qed] Goal typed_real_cmp_fd_ensures_REL2 : Valid
 [wp] [Qed] Goal typed_real_cmp_fd_assert : Valid
 [wp] [Qed] Goal typed_real_cmp_fd_assert_2 : Valid
-[wp] [Qed] Goal typed_real_cmp_ff_ensures_DEF : Valid
-[wp] [Qed] Goal typed_real_cmp_ff_ensures_REL1 : Valid
-[wp] [Qed] Goal typed_real_cmp_ff_ensures_REL2 : Valid
 [wp] [Qed] Goal typed_real_cmp_fnan_ensures_POS : Valid
 [wp] [Qed] Goal typed_real_cmp_fnan_ensures_NEG : Valid
 [wp] Proved goals:   19 / 19
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/float_const.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/float_const.res.oracle
index bc8717807fd0d5bfde96f27734717207d76c39db..ff8fe2744f860a45392f3658b1e2e6f238fb2b38 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/float_const.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/float_const.res.oracle
@@ -4,17 +4,16 @@
   Floating-point constant 0.1f is not represented exactly. Will use 0x1.99999a0000000p-4.
   (warn-once: no further messages from category 'parser:decimal-float' will be emitted)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 8 goals scheduled
-[wp] [Alt-Ergo] Goal typed_double_convertible_check : Valid
-[wp] [Alt-Ergo] Goal typed_double_convertible_check_2 : Valid
-[wp] [Alt-Ergo] Goal typed_double_convertible_check_3 : Valid
-[wp] [Alt-Ergo] Goal typed_double_convertible_check_4 : Valid
 [wp] [Alt-Ergo] Goal typed_float_convertible_check : Valid
 [wp] [Alt-Ergo] Goal typed_float_convertible_check_2 : Valid
 [wp] [Alt-Ergo] Goal typed_float_convertible_check_3 : Valid
 [wp] [Alt-Ergo] Goal typed_float_convertible_check_4 : Valid
+[wp] [Alt-Ergo] Goal typed_double_convertible_check : Valid
+[wp] [Alt-Ergo] Goal typed_double_convertible_check_2 : Valid
+[wp] [Alt-Ergo] Goal typed_double_convertible_check_3 : Valid
+[wp] [Alt-Ergo] Goal typed_double_convertible_check_4 : Valid
 [wp] Proved goals:    8 / 8
   Qed:             0 
   Alt-Ergo:        8
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/funvar_inv.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/funvar_inv.res.oracle
index d5aaa7c1240344acd52290366c4a370cf83c6c69..538b5fb67c2e328febca6d2fbe935d934dde6b0c 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/funvar_inv.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/funvar_inv.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_acsl/funvar_inv.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
 [wp] [Qed] Goal typed_ref_f_loop_assigns : Valid
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
new file mode 100644
index 0000000000000000000000000000000000000000..ee38ba7972748686bc43809b5174f8930279ea0e
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/generalized_checks.res.oracle
@@ -0,0 +1,33 @@
+# frama-c -wp -wp-timeout 1 [...]
+[kernel] Parsing tests/wp_acsl/generalized_checks.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 17 goals scheduled
+[wp] [Alt-Ergo] Goal typed_check_lemma_C_ko : Unsuccess
+[wp] [Alt-Ergo] Goal typed_lemma_L_ko : Unsuccess
+[wp] [Alt-Ergo] Goal typed_job_ensures_B : Valid
+[wp] [Alt-Ergo] Goal typed_job_check_ensures_CB1 : Valid
+[wp] [Alt-Ergo] Goal typed_job_check_ensures_CB2_ko : Unsuccess
+[wp] [Qed] Goal typed_job_assigns_exit : Valid
+[wp] [Qed] Goal typed_job_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_job_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_caller_ensures_R : Valid
+[wp] [Alt-Ergo] Goal typed_caller_ensures_R1_ko : Unsuccess
+[wp] [Alt-Ergo] Goal typed_caller_ensures_R2_ko : Unsuccess
+[wp] [Qed] Goal typed_caller_assigns_exit : Valid
+[wp] [Qed] Goal typed_caller_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_caller_assigns_normal_part2 : Valid
+[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] Proved goals:   11 / 17
+  Qed:             9 
+  Alt-Ergo:        2  (unsuccess: 6)
+------------------------------------------------------------
+ Axiomatics                WP     Alt-Ergo  Total   Success
+  Axiomatic Th              -        -        2       0.0%
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  job                       3        2        6      83.3%
+  caller                    6        -        9      66.7%
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/implicit_enum_cast.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/implicit_enum_cast.res.oracle
index 39d383ddb17868508b08b0c47a490d79c50ecacc..1d332c3eba2f75eb4907e0cfbeff3a314b09d366 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/implicit_enum_cast.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/implicit_enum_cast.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/implicit_enum_cast.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 9 goals scheduled
 [wp] [Qed] Goal typed_bar_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_label.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_label.res.oracle
index 222fe3b90403ab5186f4c3212dc8a1808a4ef491..e48f553e2947fc9590f4931437b4a48767d92ff5 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_label.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_label.res.oracle
@@ -1,15 +1,14 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/init_label.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_acsl/init_label.i:27: Warning: 
   No code nor implicit assigns clause for function main, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
 [wp] 4 goals scheduled
-[wp] [Alt-Ergo] Goal typed_extra_ensures_KO : Unsuccess
-[wp] [Qed] Goal typed_foreign_ensures_OK : Valid
-[wp] [Alt-Ergo] Goal typed_job_ensures_OK : Valid
 [wp] [Qed] Goal typed_main_requires_OK : Valid
+[wp] [Alt-Ergo] Goal typed_job_ensures_OK : Valid
+[wp] [Qed] Goal typed_foreign_ensures_OK : Valid
+[wp] [Alt-Ergo] Goal typed_extra_ensures_KO : Unsuccess
 [wp] Proved goals:    3 / 4
   Qed:             2 
   Alt-Ergo:        1  (unsuccess: 1)
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.0.res.oracle
index 1fc7282684fabcb88b04bd94e84983e2209e1941..d6bc501d6c9ad682aa1542e85bb31d2df4ed5cf6 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.0.res.oracle
@@ -1,13 +1,8 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/init_value.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 24 goals scheduled
-[wp] [Qed] Goal typed_fa1_ensures_qed_ok : Valid
-[wp] [Qed] Goal typed_fa2_ensures_qed_ok : Valid
-[wp] [Qed] Goal typed_fa3_ensures_qed_ok : Valid
-[wp] [Alt-Ergo] Goal typed_fs1_ensures_qed_ok : Valid
 [wp] [Qed] Goal typed_main_requires_qed_ok_Struct_Simple_a : Valid
 [wp] [Qed] Goal typed_main_requires_qed_ok_Struct_Simple_b : Valid
 [wp] [Qed] Goal typed_main_requires_qed_ok_Simple_Array_0 : Valid
@@ -28,6 +23,10 @@
 [wp] [Qed] Goal typed_main_requires_qed_ok_4 : Valid
 [wp] [Alt-Ergo] Goal typed_main_requires_qed_ok_5 : Valid
 [wp] [Qed] Goal typed_main_requires_qed_ok_direct_init_union : Valid
+[wp] [Qed] Goal typed_fa1_ensures_qed_ok : Valid
+[wp] [Qed] Goal typed_fa2_ensures_qed_ok : Valid
+[wp] [Qed] Goal typed_fa3_ensures_qed_ok : Valid
+[wp] [Alt-Ergo] Goal typed_fs1_ensures_qed_ok : Valid
 [wp] Proved goals:   24 / 24
   Qed:            19 
   Alt-Ergo:        5
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.1.res.oracle
index b790e8063540490ffa7c7565dc919b0fae209af7..3d74eca2ac3488de79a65c2b32cf9e21149e3922 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.1.res.oracle
@@ -1,18 +1,8 @@
 # frama-c -wp -wp-steps 50 [...]
 [kernel] Parsing tests/wp_acsl/init_value.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 18 goals scheduled
-[wp] [Alt-Ergo] Goal typed_fa1_ensures_qed_ko : Unsuccess
-[wp] [Alt-Ergo] Goal typed_fa1_ensures_qed_ko_2 : Unsuccess
-[wp] [Alt-Ergo] Goal typed_fa2_ensures_qed_ko : Unsuccess
-[wp] [Alt-Ergo] Goal typed_fa2_ensures_qed_ko_2 : Unsuccess
-[wp] [Alt-Ergo] Goal typed_fa3_ensures_qed_ko : Unsuccess
-[wp] [Alt-Ergo] Goal typed_fa3_ensures_qed_ko_2 : Unsuccess
-[wp] [Alt-Ergo] Goal typed_fa3_ensures_qed_ko_3 : Unsuccess
-[wp] [Alt-Ergo] Goal typed_fs1_ensures_qed_ko : Unsuccess
-[wp] [Alt-Ergo] Goal typed_fs1_ensures_qed_ko_2 : Unsuccess
 [wp] [Alt-Ergo] Goal typed_main_ko_requires_qed_ko_Sc_eq_ko : Unsuccess
 [wp] [Alt-Ergo] Goal typed_main_ko_requires_qed_ko_Sc_t : Unsuccess
 [wp] [Alt-Ergo] Goal typed_main_ko_requires_qed_ko_Sc_c_2 : Unsuccess
@@ -22,6 +12,15 @@
 [wp] [Alt-Ergo] Goal typed_main_ko_requires_qed_ko_T1_6 : Unsuccess
 [wp] [Alt-Ergo] Goal typed_main_ko_requires_qed_ko_indirect_init_union_b : Unsuccess
 [wp] [Alt-Ergo] Goal typed_main_ko_requires_qed_ko_indirect_init_union_t : Unsuccess
+[wp] [Alt-Ergo] Goal typed_fa1_ensures_qed_ko : Unsuccess
+[wp] [Alt-Ergo] Goal typed_fa1_ensures_qed_ko_2 : Unsuccess
+[wp] [Alt-Ergo] Goal typed_fa2_ensures_qed_ko : Unsuccess
+[wp] [Alt-Ergo] Goal typed_fa2_ensures_qed_ko_2 : Unsuccess
+[wp] [Alt-Ergo] Goal typed_fa3_ensures_qed_ko : Unsuccess
+[wp] [Alt-Ergo] Goal typed_fa3_ensures_qed_ko_2 : Unsuccess
+[wp] [Alt-Ergo] Goal typed_fa3_ensures_qed_ko_3 : Unsuccess
+[wp] [Alt-Ergo] Goal typed_fs1_ensures_qed_ko : Unsuccess
+[wp] [Alt-Ergo] Goal typed_fs1_ensures_qed_ko_2 : Unsuccess
 [wp] Proved goals:    0 / 18
   Alt-Ergo:        0  (unsuccess: 18)
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value_mem.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value_mem.res.oracle
index d53071687811c413fbd4f51ff936bcebb02460eb..3cf52a8c9857dd1125d0a39b33d93223c0bbccbd 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value_mem.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value_mem.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/init_value_mem.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Alt-Ergo] Goal typed_main_ensures_P : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memtyped.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memtyped.res.oracle
index 53fe740ee7bb040a142f98f1af9bc780f40f16a8..88684268b9cb445cdfdf9909b4e607ac18a0664f 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memtyped.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memtyped.res.oracle
@@ -1,14 +1,8 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/initialized_memtyped.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 28 goals scheduled
-[wp] [Alt-Ergo] Goal typed_formal_assert_provable : Valid
-[wp] [Alt-Ergo] Goal typed_glob_arr_ensures_provable : Valid
-[wp] [Alt-Ergo] Goal typed_glob_arr_ensures_unknown : Unsuccess
-[wp] [Alt-Ergo] Goal typed_glob_var_ensures_provable : Valid
-[wp] [Alt-Ergo] Goal typed_glob_var_ensures_unknown : Unsuccess
 [wp] [Alt-Ergo] Goal typed_test_check_unknown : Unsuccess
 [wp] [Alt-Ergo] Goal typed_test_check_unknown_2 : Unsuccess
 [wp] [Alt-Ergo] Goal typed_test_check_unknown_3 : Unsuccess
@@ -32,6 +26,11 @@
 [wp] [Alt-Ergo] Goal typed_test_check_provable_3 : Valid
 [wp] [Alt-Ergo] Goal typed_test_check_unknown_13 : Unsuccess
 [wp] [Alt-Ergo] Goal typed_test_check_provable_4 : Valid
+[wp] [Alt-Ergo] Goal typed_glob_var_ensures_provable : Valid
+[wp] [Alt-Ergo] Goal typed_glob_var_ensures_unknown : Unsuccess
+[wp] [Alt-Ergo] Goal typed_glob_arr_ensures_provable : Valid
+[wp] [Alt-Ergo] Goal typed_glob_arr_ensures_unknown : Unsuccess
+[wp] [Alt-Ergo] Goal typed_formal_assert_provable : Valid
 [wp] Proved goals:   13 / 28
   Qed:             6 
   Alt-Ergo:        7  (unsuccess: 15)
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memvar.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memvar.res.oracle
index ea40fb15e882b9468480b994c6da3818d571bd08..fa2acc12292c85ee69c240a5795f611dfc93f72f 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memvar.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memvar.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/initialized_memvar.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 54 goals scheduled
 [wp] [Qed] Goal typed_globals_check_qed_ok : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/intbool.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/intbool.res.oracle
index cf80df81df28ed71dbfd6179d39a6c80d6e9e836..8bf8b806834460be113b2e184c35831f88f0e3ad 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/intbool.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/intbool.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/intbool.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Qed] Goal typed_bug_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/invalid_pointer.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/invalid_pointer.res.oracle
index 600fdf9a79bf6be04ab2a6f2959a82199c5e350f..089501d0a3a6713dce8e372db5c147a9a61e7bbb 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/invalid_pointer.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/invalid_pointer.res.oracle
@@ -1,10 +1,18 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/invalid_pointer.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_acsl/invalid_pointer.c:21: Warning: void object
 [wp] 19 goals scheduled
+[wp] [Qed] Goal typed_memvar_check_M1 : Valid
+[wp] [Qed] Goal typed_memvar_check_P0 : Valid
+[wp] [Qed] Goal typed_memvar_check_P1 : Valid
+[wp] [Qed] Goal typed_memvar_check_P2 : Valid
+[wp] [Alt-Ergo] Goal typed_pointer_check_M1 : Valid
+[wp] [Alt-Ergo] Goal typed_pointer_check_P0 : Valid
+[wp] [Alt-Ergo] Goal typed_pointer_check_P1 : Valid
+[wp] [Alt-Ergo] Goal typed_pointer_check_P2 : Valid
+[wp] [Alt-Ergo] Goal typed_pointer_check_NULL : Valid
 [wp] [Alt-Ergo] Goal typed_array_check_ARR : Valid
 [wp] [Qed] Goal typed_compound_check_M1 : Valid
 [wp] [Qed] Goal typed_compound_check_P0 : Valid
@@ -15,15 +23,6 @@
 [wp] [Alt-Ergo] Goal typed_compound_check_F2 : Valid
 [wp] [Alt-Ergo] Goal typed_compound_check_G2 : Valid
 [wp] [Qed] Goal typed_compound_check_AM : Valid
-[wp] [Qed] Goal typed_memvar_check_M1 : Valid
-[wp] [Qed] Goal typed_memvar_check_P0 : Valid
-[wp] [Qed] Goal typed_memvar_check_P1 : Valid
-[wp] [Qed] Goal typed_memvar_check_P2 : Valid
-[wp] [Alt-Ergo] Goal typed_pointer_check_M1 : Valid
-[wp] [Alt-Ergo] Goal typed_pointer_check_P0 : Valid
-[wp] [Alt-Ergo] Goal typed_pointer_check_P1 : Valid
-[wp] [Alt-Ergo] Goal typed_pointer_check_P2 : Valid
-[wp] [Alt-Ergo] Goal typed_pointer_check_NULL : Valid
 [wp] Proved goals:   19 / 19
   Qed:             9 
   Alt-Ergo:       10
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/label_escape.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/label_escape.0.res.oracle
index 43a22d025e26733246823853ffd6f34479980aec..f71b1ba16e121a7d7ceb9e0f4a0461b6aa8aaf37 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/label_escape.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/label_escape.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/label_escape.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Qed] Goal typed_g_assert_qed_ok_ok : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/label_escape.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/label_escape.1.res.oracle
index 6481802874a5ee384f099fc9cff435e5d6c1c4b4..fa9e50b10c43a4e1a1fd30d2be9088b20fe2faf4 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/label_escape.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/label_escape.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-steps 50 [...]
 [kernel] Parsing tests/wp_acsl/label_escape.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_f_assert_qed_ko_oracle_ko : Unsuccess
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/logic.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/logic.res.oracle
index 4f622671cdd1a80fe80834e171d582f737a8eb23..7c60acbc6bc552e898b693a4c1dff4beba722107 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/logic.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/logic.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/logic.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_acsl/logic.i:65: Warning: 
   Cast with incompatible pointers types (source: __anonstruct_Buint_4*)
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/looplabels.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/looplabels.res.oracle
index 492eb9634e02a5de82d75e9f75556fa0a65dfa1b..c7494eb3cc7153f07bca64930c983b2c19743d6c 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/looplabels.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/looplabels.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/looplabels.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 8 goals scheduled
 [wp] [Alt-Ergo] Goal typed_copy_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/memvar_chunk_typing.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/memvar_chunk_typing.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..b6dab655323e029a174df65e0e9f50255dd4c94e
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/memvar_chunk_typing.res.oracle
@@ -0,0 +1,12 @@
+# frama-c -wp -wp-rte [...]
+[kernel] Parsing tests/wp_acsl/memvar_chunk_typing.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] 1 goal scheduled
+[wp] [Alt-Ergo] Goal typed_lemma_L : Valid
+[wp] Proved goals:    1 / 1
+  Qed:             0 
+  Alt-Ergo:        1
+------------------------------------------------------------
+ Axiomatics                WP     Alt-Ergo  Total   Success
+  Lemma                     -        1        1       100%
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/null.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/null.res.oracle
index c1a5e39bed0436f4bc7f0b7dda00ddf3f3d3b62e..1f8e9e4734906168f09d6bb3896f221f95211933 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/null.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/null.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/null.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_valid_non_null : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/pointer.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/pointer.0.res.oracle
index 310d71f125800a7127da749babf9e34cea6597e5..9e0fd3122c659339481553df508465ea91fdba64 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/pointer.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/pointer.0.res.oracle
@@ -1,22 +1,21 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_acsl/pointer.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_acsl/pointer.i:50: Warning: 
   Uncomparable locations p_0 and mem:t.(0)
 [wp] tests/wp_acsl/pointer.i:49: Warning: 
   Uncomparable locations p_0 and mem:t.(0)
 [wp] 9 goals scheduled
-[wp] [Alt-Ergo] Goal typed_ref_absurd_ensures_qed_ko_Base_oracle_ko : Unsuccess
-[wp] [Alt-Ergo] Goal typed_ref_absurd_ensures_qed_ko_Comp_oracle_ko : Unsuccess
 [wp] [Qed] Goal typed_ref_array_ensures_Lt : Valid
 [wp] [Qed] Goal typed_ref_array_ensures_Le : Valid
 [wp] [Qed] Goal typed_ref_array_ensures_Eq : Valid
-[wp] [Alt-Ergo] Goal typed_ref_mixed_array_pointer_ensures_qed_ko_Le_oracle_ko : Unsuccess (Stronger)
-[wp] [Alt-Ergo] Goal typed_ref_mixed_array_pointer_ensures_qed_ko_Lt_oracle_ko : Unsuccess (Stronger)
 [wp] [Alt-Ergo] Goal typed_ref_pointer_ensures_qed_ko_Le_oracle_ko : Unsuccess
 [wp] [Alt-Ergo] Goal typed_ref_pointer_ensures_qed_ko_Eq_oracle_ko : Unsuccess
+[wp] [Alt-Ergo] Goal typed_ref_mixed_array_pointer_ensures_qed_ko_Le_oracle_ko : Unsuccess (Stronger)
+[wp] [Alt-Ergo] Goal typed_ref_mixed_array_pointer_ensures_qed_ko_Lt_oracle_ko : Unsuccess (Stronger)
+[wp] [Alt-Ergo] Goal typed_ref_absurd_ensures_qed_ko_Base_oracle_ko : Unsuccess
+[wp] [Alt-Ergo] Goal typed_ref_absurd_ensures_qed_ko_Comp_oracle_ko : Unsuccess
 [wp] Proved goals:    3 / 9
   Qed:             3 
   Alt-Ergo:        0  (unsuccess: 6)
@@ -28,5 +27,6 @@
   absurd                    -        -        2       0.0%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'absurd':
-  /*@ behavior typed_ref: requires \separated(&p,q+(..)); */
+  /*@ behavior typed_ref:
+        requires \separated(q + (..), &p); */
   void absurd(int *q);
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/pointer.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/pointer.1.res.oracle
index ee3c703ca332e470ac35ac0e4f6b09f71ac1fcb0..5e0172dd87d30107441b9959cdf9c1f5460443b4 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/pointer.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/pointer.1.res.oracle
@@ -1,22 +1,21 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/pointer.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_acsl/pointer.i:50: Warning: 
   Uncomparable locations p_0 and mem:t.(0)
 [wp] tests/wp_acsl/pointer.i:49: Warning: 
   Uncomparable locations p_0 and mem:t.(0)
 [wp] 9 goals scheduled
-[wp] [Alt-Ergo] Goal typed_absurd_ensures_qed_ko_Base_oracle_ko : Unsuccess
-[wp] [Alt-Ergo] Goal typed_absurd_ensures_qed_ko_Comp_oracle_ko : Unsuccess
 [wp] [Qed] Goal typed_array_ensures_Lt : Valid
 [wp] [Qed] Goal typed_array_ensures_Le : Valid
 [wp] [Qed] Goal typed_array_ensures_Eq : Valid
-[wp] [Alt-Ergo] Goal typed_mixed_array_pointer_ensures_qed_ko_Le_oracle_ko : Unsuccess (Stronger)
-[wp] [Alt-Ergo] Goal typed_mixed_array_pointer_ensures_qed_ko_Lt_oracle_ko : Unsuccess (Stronger)
 [wp] [Alt-Ergo] Goal typed_pointer_ensures_qed_ko_Le_oracle_ko : Unsuccess
 [wp] [Alt-Ergo] Goal typed_pointer_ensures_qed_ko_Eq_oracle_ko : Unsuccess
+[wp] [Alt-Ergo] Goal typed_mixed_array_pointer_ensures_qed_ko_Le_oracle_ko : Unsuccess (Stronger)
+[wp] [Alt-Ergo] Goal typed_mixed_array_pointer_ensures_qed_ko_Lt_oracle_ko : Unsuccess (Stronger)
+[wp] [Alt-Ergo] Goal typed_absurd_ensures_qed_ko_Base_oracle_ko : Unsuccess
+[wp] [Alt-Ergo] Goal typed_absurd_ensures_qed_ko_Comp_oracle_ko : Unsuccess
 [wp] Proved goals:    3 / 9
   Qed:             3 
   Alt-Ergo:        0  (unsuccess: 6)
@@ -28,5 +27,6 @@
   absurd                    -        -        2       0.0%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'absurd':
-  /*@ behavior typed: requires \separated(&p,q+(..)); */
+  /*@ behavior typed:
+        requires \separated(q + (..), &p); */
   void absurd(int *q);
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/post_result.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/post_result.res.oracle
index e45ff82098c22fb28f57acffc6f86cc9fcbec1ce..d2eb8110c9572bed694b5fc19c23611c22e92687 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/post_result.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/post_result.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-steps 50 [...]
 [kernel] Parsing tests/wp_acsl/post_result.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Qed] Goal typed_correct_assert_OK : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/precedence.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/precedence.0.res.oracle
index ecfa8fc993b3a8ac1a995dd25bf4cebcab0d226c..24278f6c3aaaaf689932142d4c270d79f18cc1a7 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/precedence.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/precedence.0.res.oracle
@@ -37,29 +37,8 @@
 [kernel:annot-error] tests/wp_acsl/precedence.i:176: Warning: 
   P is not a logic variable. Ignoring code annotation
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 52 goals scheduled
-[wp] [Qed] Goal typed_bitwise_ensures_r_precedence_and_xor : Valid
-[wp] [Qed] Goal typed_bitwise_ensures_l_precedence_and_xor : Valid
-[wp] [Qed] Goal typed_bitwise_ensures_r_precedence_xor_or : Valid
-[wp] [Qed] Goal typed_bitwise_ensures_l_precedence_xor_or : Valid
-[wp] [Qed] Goal typed_bitwise_ensures_r_precedence_or_implies : Valid
-[wp] [Qed] Goal typed_bitwise_ensures_l_precedence_or_implies : Valid
-[wp] [Qed] Goal typed_bitwise_ensures_ok_r_precedence_implies_or : Valid
-[wp] [Qed] Goal typed_bitwise_ensures_ok_since : Valid
-[wp] [Qed] Goal typed_bitwise_ensures_r_assoc_implies : Valid
-[wp] [Qed] Goal typed_bitwise_ensures_r_precedence_implies_equiv : Valid
-[wp] [Qed] Goal typed_bitwise_ensures_l_precedence_implies_equiv : Valid
-[wp] [Qed] Goal typed_comparison_ensures_chainable_lt_lt : Valid
-[wp] [Qed] Goal typed_comparison_ensures_chainable_le_le : Valid
-[wp] [Qed] Goal typed_comparison_ensures_chainable_gt_gt : Valid
-[wp] [Qed] Goal typed_comparison_ensures_chainable_ge_ge : Valid
-[wp] [Qed] Goal typed_comparison_ensures_chainable_eq_eq : Valid
-[wp] [Qed] Goal typed_comparison_ensures_r_precedence_eq_and : Valid
-[wp] [Qed] Goal typed_comparison_ensures_l_precedence_eq_and : Valid
-[wp] [Qed] Goal typed_comparison_ensures_r_precedence_neq_and : Valid
-[wp] [Qed] Goal typed_comparison_ensures_l_precedence_neq_and : Valid
 [wp] [Qed] Goal typed_predicate_ensures_r_precedence_and_xor : Valid
 [wp] [Qed] Goal typed_predicate_ensures_l_precedence_and_xor : Valid
 [wp] [Qed] Goal typed_predicate_ensures_r_precedence_xor_or : Valid
@@ -90,6 +69,26 @@
 [wp] [Qed] Goal typed_predicate_ensures_scope_let : Valid
 [wp] [Qed] Goal typed_predicate_ensures_scope_let_2 : Valid
 [wp] [Qed] Goal typed_predicate_ensures_r_precedence_ite_naming : Valid
+[wp] [Qed] Goal typed_comparison_ensures_chainable_lt_lt : Valid
+[wp] [Qed] Goal typed_comparison_ensures_chainable_le_le : Valid
+[wp] [Qed] Goal typed_comparison_ensures_chainable_gt_gt : Valid
+[wp] [Qed] Goal typed_comparison_ensures_chainable_ge_ge : Valid
+[wp] [Qed] Goal typed_comparison_ensures_chainable_eq_eq : Valid
+[wp] [Qed] Goal typed_comparison_ensures_r_precedence_eq_and : Valid
+[wp] [Qed] Goal typed_comparison_ensures_l_precedence_eq_and : Valid
+[wp] [Qed] Goal typed_comparison_ensures_r_precedence_neq_and : Valid
+[wp] [Qed] Goal typed_comparison_ensures_l_precedence_neq_and : Valid
+[wp] [Qed] Goal typed_bitwise_ensures_r_precedence_and_xor : Valid
+[wp] [Qed] Goal typed_bitwise_ensures_l_precedence_and_xor : Valid
+[wp] [Qed] Goal typed_bitwise_ensures_r_precedence_xor_or : Valid
+[wp] [Qed] Goal typed_bitwise_ensures_l_precedence_xor_or : Valid
+[wp] [Qed] Goal typed_bitwise_ensures_r_precedence_or_implies : Valid
+[wp] [Qed] Goal typed_bitwise_ensures_l_precedence_or_implies : Valid
+[wp] [Qed] Goal typed_bitwise_ensures_ok_r_precedence_implies_or : Valid
+[wp] [Qed] Goal typed_bitwise_ensures_ok_since : Valid
+[wp] [Qed] Goal typed_bitwise_ensures_r_assoc_implies : Valid
+[wp] [Qed] Goal typed_bitwise_ensures_r_precedence_implies_equiv : Valid
+[wp] [Qed] Goal typed_bitwise_ensures_l_precedence_implies_equiv : Valid
 [wp] [Qed] Goal typed_predicate_bitwise_ensures_r_precedence_equiv_Pand : Valid
 [wp] [Qed] Goal typed_predicate_bitwise_ensures_l_precedence_equiv_Pand : Valid
 [wp] Proved goals:   52 / 52
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/precedence.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/precedence.1.res.oracle
index 614ab5823135cfbd7a55bd7fd46986e759545d50..1aa717f83fed226738c1ce9aaeaabf722f6e8206 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/precedence.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/precedence.1.res.oracle
@@ -37,23 +37,8 @@
 [kernel:annot-error] tests/wp_acsl/precedence.i:176: Warning: 
   P is not a logic variable. Ignoring code annotation
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 37 goals scheduled
-[wp] [Alt-Ergo] Goal typed_bitwise_ensures_ko_l_precedence_xor_and : Unsuccess
-[wp] [Alt-Ergo] Goal typed_bitwise_ensures_ko_r_precedence_xor_and : Unsuccess
-[wp] [Alt-Ergo] Goal typed_bitwise_ensures_ko_l_precedence_or_xor : Unsuccess
-[wp] [Alt-Ergo] Goal typed_bitwise_ensures_ko_r_precedence_or_xor : Unsuccess
-[wp] [Alt-Ergo] Goal typed_bitwise_ensures_ko_l_precedence_implies_or : Unsuccess
-[wp] [Alt-Ergo] Goal typed_bitwise_ensures_ko_l_assoc_implies : Unsuccess
-[wp] [Alt-Ergo] Goal typed_bitwise_ensures_ko_r_precedence_equiv_implies : Unsuccess
-[wp] [Alt-Ergo] Goal typed_bitwise_ensures_ko_l_precedence_equiv_implies : Unsuccess
-[wp] [Alt-Ergo] Goal typed_comparison_ensures_ko_r_precedence_and_eq : Unsuccess
-[wp] [Alt-Ergo] Goal typed_comparison_ensures_ko_l_precedence_and_eq : Unsuccess
-[wp] [Alt-Ergo] Goal typed_comparison_ensures_ko_l_nonassoc_eq : Unsuccess
-[wp] [Alt-Ergo] Goal typed_comparison_ensures_ko_r_nonassoc_eq : Unsuccess
-[wp] [Alt-Ergo] Goal typed_comparison_ensures_ko_r_precedence_and_neq : Unsuccess
-[wp] [Alt-Ergo] Goal typed_comparison_ensures_ko_l_precedence_and_neq : Unsuccess
 [wp] [Alt-Ergo] Goal typed_predicate_ensures_ko_l_precedence_xor_and : Unsuccess
 [wp] [Alt-Ergo] Goal typed_predicate_ensures_ko_r_precedence_xor_and : Unsuccess
 [wp] [Alt-Ergo] Goal typed_predicate_ensures_ko_l_precedence_or_xor : Unsuccess
@@ -77,6 +62,20 @@
 [wp] [Alt-Ergo] Goal typed_predicate_ensures_ko_m_precedence_let_ite : Unsuccess
 [wp] [Alt-Ergo] Goal typed_predicate_ensures_ko_l_precedence_let_ite : Unsuccess
 [wp] [Alt-Ergo] Goal typed_predicate_ensures_ko_l_assoc_naming : Unsuccess
+[wp] [Alt-Ergo] Goal typed_comparison_ensures_ko_r_precedence_and_eq : Unsuccess
+[wp] [Alt-Ergo] Goal typed_comparison_ensures_ko_l_precedence_and_eq : Unsuccess
+[wp] [Alt-Ergo] Goal typed_comparison_ensures_ko_l_nonassoc_eq : Unsuccess
+[wp] [Alt-Ergo] Goal typed_comparison_ensures_ko_r_nonassoc_eq : Unsuccess
+[wp] [Alt-Ergo] Goal typed_comparison_ensures_ko_r_precedence_and_neq : Unsuccess
+[wp] [Alt-Ergo] Goal typed_comparison_ensures_ko_l_precedence_and_neq : Unsuccess
+[wp] [Alt-Ergo] Goal typed_bitwise_ensures_ko_l_precedence_xor_and : Unsuccess
+[wp] [Alt-Ergo] Goal typed_bitwise_ensures_ko_r_precedence_xor_and : Unsuccess
+[wp] [Alt-Ergo] Goal typed_bitwise_ensures_ko_l_precedence_or_xor : Unsuccess
+[wp] [Alt-Ergo] Goal typed_bitwise_ensures_ko_r_precedence_or_xor : Unsuccess
+[wp] [Alt-Ergo] Goal typed_bitwise_ensures_ko_l_precedence_implies_or : Unsuccess
+[wp] [Alt-Ergo] Goal typed_bitwise_ensures_ko_l_assoc_implies : Unsuccess
+[wp] [Alt-Ergo] Goal typed_bitwise_ensures_ko_r_precedence_equiv_implies : Unsuccess
+[wp] [Alt-Ergo] Goal typed_bitwise_ensures_ko_l_precedence_equiv_implies : Unsuccess
 [wp] Proved goals:    0 / 37
   Alt-Ergo:        0  (unsuccess: 37)
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/range.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/range.res.oracle
index c6b10dca91fe2ad85c93d5e62e1fe17319d85ced..4d389265cd8cfe3e45d227c229e032c109d86e81 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/range.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/range.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/range.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 4 goals scheduled
 [wp] [Qed] Goal typed_test_ensures_P1_ok : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/reads.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/reads.0.res.oracle
index 6444362e5e27c13a024bd8614eb9f008aa06e9d6..119c06c6c1dfbb48898ce45bc196e5c3689084ff 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/reads.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/reads.0.res.oracle
@@ -1,16 +1,15 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/reads.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 7 goals scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures_qed_ok : Valid
 [wp] [Alt-Ergo] Goal typed_g_ensures_qed_ok : Valid
-[wp] [Qed] Goal typed_modifies_x_ensures_qed_ok_F_OK : Valid
-[wp] [Alt-Ergo] Goal typed_modifies_x_ensures_qed_ok_W_OK_todo : Unsuccess
 [wp] [Qed] Goal typed_modifies_y_ensures_qed_ok_F_OK : Valid
 [wp] [Qed] Goal typed_modifies_y_ensures_qed_ok_G_OK : Valid
 [wp] [Alt-Ergo] Goal typed_modifies_y_ensures_qed_ok_W_OK_todo : Unsuccess
+[wp] [Qed] Goal typed_modifies_x_ensures_qed_ok_F_OK : Valid
+[wp] [Alt-Ergo] Goal typed_modifies_x_ensures_qed_ok_W_OK_todo : Unsuccess
 [wp] Proved goals:    5 / 7
   Qed:             3 
   Alt-Ergo:        2  (unsuccess: 2)
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/reads.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/reads.1.res.oracle
index 4d228ae7143e4d240f29aafffcfc7618adf7083e..213fdec4cb23e08311a46680cd43fd429fcbdb8b 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/reads.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/reads.1.res.oracle
@@ -1,12 +1,11 @@
 # frama-c -wp -wp-steps 50 [...]
 [kernel] Parsing tests/wp_acsl/reads.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
+[wp] [Alt-Ergo] Goal typed_modifies_y_ensures_qed_ko_H_KO : Unsuccess
 [wp] [Alt-Ergo] Goal typed_modifies_x_ensures_qed_ko_G_KO : Unsuccess
 [wp] [Alt-Ergo] Goal typed_modifies_x_ensures_qed_ko_H_KO : Unsuccess
-[wp] [Alt-Ergo] Goal typed_modifies_y_ensures_qed_ko_H_KO : Unsuccess
 [wp] Proved goals:    0 / 3
   Alt-Ergo:        0  (unsuccess: 3)
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/record.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/record.0.res.oracle
index be665b9cca19398eac29db96cd1c29d149437d9b..aafa831a5d6a86746fef022bccf843e81e16bd6e 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/record.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/record.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/record.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 11 goals scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures_M1_qed_ok : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/record.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/record.1.res.oracle
index 6cf9ed0803c41b4a71a709be66ec53f1bd7a8465..9ee1634559a2f85d09871a1b2067cc62165789fc 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/record.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/record.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-steps 50 [...]
 [kernel] Parsing tests/wp_acsl/record.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures_KP5_qed_ko : Unsuccess
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/simpl_is_type.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/simpl_is_type.res.oracle
index 2f04de9548a29027bb99c38b83bda1f2218378e7..514d6f40bcb0115e003f31c0188db30b84330fa2 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/simpl_is_type.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/simpl_is_type.res.oracle
@@ -1,12 +1,8 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/simpl_is_type.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 18 goals scheduled
-[wp] [Alt-Ergo] Goal typed_check_acsl_check_ok_C1_absurd_is_cint : Valid
-[wp] [Alt-Ergo] Goal typed_check_acsl_check_ok_C2_absurd_is_cint : Valid
-[wp] [Qed] Goal typed_check_acsl_check_ok_C5_absurd_cmp : Valid
 [wp] [Alt-Ergo] Goal typed_f_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_f_loop_invariant_preserved : Valid
 [wp] [Qed] Goal typed_f_loop_invariant_established : Valid
@@ -22,6 +18,9 @@
 [wp] [Alt-Ergo] Goal typed_g_loop_invariant_2_preserved : Valid
 [wp] [Qed] Goal typed_g_loop_invariant_2_established : Valid
 [wp] [Qed] Goal typed_g_loop_assigns : Valid
+[wp] [Alt-Ergo] Goal typed_check_acsl_check_ok_C1_absurd_is_cint : Valid
+[wp] [Alt-Ergo] Goal typed_check_acsl_check_ok_C2_absurd_is_cint : Valid
+[wp] [Qed] Goal typed_check_acsl_check_ok_C5_absurd_cmp : Valid
 [wp] Proved goals:   18 / 18
   Qed:             7 
   Alt-Ergo:       11
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/sizeof.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/sizeof.res.oracle
index 1e3debd836303f7253d635f15b49a21a346a7900..5eebd01bb772c8c769aad75003426bde3ce45e22 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/sizeof.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/sizeof.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/sizeof.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Alt-Ergo] Goal typed_foo_assert_A : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/struct_use_case.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/struct_use_case.0.res.oracle
index bc32b522fd6c20392a5e46e940e61fd69be127bd..3b8c905ab63c750db0beaea8c971bb48aa3f7200 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/struct_use_case.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/struct_use_case.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Caveat)' [...]
 [kernel] Parsing tests/wp_acsl/struct_use_case.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Alt-Ergo] Goal typed_caveat_f_ensures_ok : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/struct_use_case.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/struct_use_case.1.res.oracle
index 692720f957a3fb4851d401a52fdd8a418ace2058..f43f461d6c19f94662e891f022c78bad8b526551 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/struct_use_case.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/struct_use_case.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Caveat)' -wp-steps 50 [...]
 [kernel] Parsing tests/wp_acsl/struct_use_case.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Alt-Ergo] Goal typed_caveat_f_ensures_ko : Unsuccess
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/tset.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/tset.res.oracle
index 6277a80bafac2040ddbd17a73a3d67febdf2117e..bad7bc16a7c6f386454f91feeaed9372c22b7c5b 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/tset.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/tset.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/tset.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: native support for coq is deprecated, use tip instead
 [wp] 4 goals scheduled
 [wp] [Qed] Goal typed_lemma_UNION_DESCR : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/type_guard.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/type_guard.0.res.oracle
index 9b59b6bac5cbeb58aacf9c1ba5e82a9e06cd990f..d891a56629221496f7672b2df57900c1cf543c29 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/type_guard.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/type_guard.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/type_guard.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures_qed_ok : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/type_guard.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/type_guard.1.res.oracle
index 986a53101347925a5f3f8d6be7f833570067dfbe..6cd53f6a5bbe80f3012e01a633118bcdac18a013 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/type_guard.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/type_guard.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-steps 50 [...]
 [kernel] Parsing tests/wp_acsl/type_guard.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures_qed_ko : Unsuccess
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/unit_bit_test.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/unit_bit_test.res.oracle
index f4ce0c5e62321a946f91d8dfa1999a086dfe835b..e1fcca70b0a74d4ec83cc56da21c38db1866d05f 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/unit_bit_test.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/unit_bit_test.res.oracle
@@ -1,13 +1,12 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/unit_bit_test.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 4 goals scheduled
-[wp] [Qed] Goal typed_rotate_left_ensures_bit_zero : Valid
-[wp] [Alt-Ergo] Goal typed_rotate_left_ensures_other_bits : Valid
 [wp] [Qed] Goal typed_sum_ensures_ok : Valid
 [wp] [Alt-Ergo] Goal typed_sum_ensures_ko : Unsuccess
+[wp] [Qed] Goal typed_rotate_left_ensures_bit_zero : Valid
+[wp] [Alt-Ergo] Goal typed_rotate_left_ensures_other_bits : Valid
 [wp] Proved goals:    3 / 4
   Qed:             2 
   Alt-Ergo:        1  (unsuccess: 1)
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/unit_bool.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/unit_bool.res.oracle
index ebd003d69d448bf8f2ea836a8c0a326bd170b200..6d9d902295debff8da4f9c576a73dc4a62c9c02e 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/unit_bool.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/unit_bool.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/unit_bool.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 15 goals scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_f_1 : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/user_def_type_guard.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/user_def_type_guard.0.res.oracle
index 3eb172046e582d56554da52046ce258384ca862f..022b0364fa9ee3d9b289bfb3c241136c2e77bb6b 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/user_def_type_guard.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/user_def_type_guard.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_acsl/user_def_type_guard.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures_qed_ok : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/user_def_type_guard.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/user_def_type_guard.1.res.oracle
index a9b8d3dfbf95ac0b271f92b83355c0e69c91a841..0368f3b6126af38d9c7dc865d96336e7677090bd 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/user_def_type_guard.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/user_def_type_guard.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-steps 50 [...]
 [kernel] Parsing tests/wp_acsl/user_def_type_guard.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures_qed_ko : Unsuccess
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts0708.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts0708.res.oracle
index bcd622025b443a3f54f6d4cf76267067003c2ed0..fc7dbb7557375a27b8f636f82c2ff029d6d9dca5 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts0708.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts0708.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts0708.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts0843.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts0843.res.oracle
index 27c968f5192f71b0734cbd8e66470d94fe130421..8c6fd6aed1b7c5243665509741e7e24b10b1b1d3 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts0843.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts0843.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts0843.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f3
@@ -53,3 +52,7 @@ Goal Instance of 'Pre-condition (file tests/wp_bts/bts0843.i, line 12) in 'f3''
 Prove: true.
 
 ------------------------------------------------------------
+[wp] Warning: Memory model hypotheses for function 'f3':
+  /*@ behavior typed:
+        requires \separated(&p, &p->a); */
+  void f3(void);
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts779.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts779.res.oracle
index bf5748d6871b1eb64d32887e583b80a946760f7c..0340355af423b21ba8a63a6e43d4a90ecf02a36e 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts779.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts779.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts779.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts788.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts788.res.oracle
index 59fb21a87df970d7586c084d7b416099a704bf30..fcb5d4edc8639f9d425fbee2ebd30647340de889 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts788.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts788.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_bts/bts788.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts986.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts986.res.oracle
index f0a8fc075ef2b1ef704531b09a173e69cbcce599..f7dbfc4d45a09b6b9ad0e8b85880c2960ff53936 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts986.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts986.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts986.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_0896.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_0896.res.oracle
index 2918c8ef8abf5cae6128a95b2987705aa82f5cec..8e39845f5244432af66b2c8cb5089df1639ff511 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_0896.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_0896.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_0896.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_1174.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_1174.res.oracle
index 0f15882a71638c4b6817b680fb0d30129b4f6887..377b382940609689df319629a70bdfd49c887b52 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_1174.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_1174.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_1174.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function job
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_1176.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_1176.res.oracle
index f309987b2d579bf867a56342a3c81a72c432cfbd..b56f41848c0865b4acdef17fdac95ef7fa48e55a 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_1176.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_1176.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_1176.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_1360.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_1360.res.oracle
index 717419064133157a6bc6d19b725979e2d733fe50..7c44e0c9ee57925c84a2e57dd1e15ff1a96f603f 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_1360.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_1360.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp_bts/bts_1360.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function foo_correct
 [rte] annotating function foo_wrong
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_1382.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_1382.res.oracle
index 07498d37853ed0b526e39db6fbf78d2dfa216971..d59e50a899d25afd1fed7894040cff25c96ebba0 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_1382.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_1382.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_1382.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_bts/bts_1382.i:18: Warning: 
   Cast with incompatible pointers types (source: sint32*) (target: sint8*)
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 bbb9f2c50e5c2187e02a4836419b5a7a53d54e31..aa5c4e320017bf051c70668612f5c91e0cea0fe1 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_1462.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function local
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_1586.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_1586.res.oracle
index c2ffd640b72c7d3ba1fd4514b60ecd7e4456ca47..4020061d0ec44c03bc9d59578561dc3b7965518b 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_1586.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_1586.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_1586.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function compute_bizarre with behavior Bizarre
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_1588.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_1588.res.oracle
index 00b3e3e05a966b9e870ac215440527f43dc9441d..a688528d7bc5b18ca5ddde8d44aa69c4c8583364 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_1588.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_1588.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_1588.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_bts/bts_1588.i:19: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_1601.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_1601.res.oracle
index 897003473316c3a94c56e22d00d8626c152a9aa4..a7a44770530b48f65807c1cdfeb42ca20823b9ac 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_1601.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_1601.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_1601.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function foo
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_1647.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_1647.res.oracle
index 72a0500b84a012502e2064d05b13353e7d840196..d2d36e4287a387e29ae21351c92540767d685465 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_1647.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_1647.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_1647.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_1776.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_1776.res.oracle
index a7a3e7e5f916a0f2f38761dbf8ec5caf0a5d80f8..aff5dc75447d73eeda97747d7a31ae338cbc89c4 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_1776.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_1776.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_1776.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_1828.0.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_1828.0.res.oracle
index 0054a9afc534ef9dabc91f05cfd5c7473c1f35d4..640c9952226375d9ac25aa5260796f23f8a44c67 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_1828.0.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_1828.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_1828.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function global_frame
@@ -67,5 +66,6 @@ Prove: global(L_two_24) != one_0.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'global_frame':
-  /*@ behavior typed: requires \separated(&zero,one); */
+  /*@ behavior typed:
+        requires \separated(one, &zero); */
   void global_frame(int *one, int arg);
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_1828.1.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_1828.1.res.oracle
index 3949d8d5a746ef39ce761d4744be2896bfa2b93e..5b00c3b48f392cf59718f82003f6f14f9c6376d4 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_1828.1.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_1828.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_bts/bts_1828.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function global_frame
@@ -48,8 +47,8 @@ Prove: global(L_two_24) != one_0.
 [wp] Warning: Memory model hypotheses for function 'global_frame':
   /*@
      behavior typed_ref:
-     requires \separated(zero,one);
-     requires \valid(zero);
-     requires \valid(one);
+       requires \separated(zero, one);
+       requires \valid(one);
+       requires \valid(zero);
      */
   void global_frame(int *one, int arg);
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_2040.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_2040.res.oracle
index 69059aeba4873a76afba9c3df04a20dd76e0e1ea..3601e1976dd36c501db6dff8996b4430a3abb9cf 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_2040.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_2040.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_2040.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function call
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_2079.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_2079.res.oracle
index 3aaa31af0f66251205832210b85c9d2de28f5238..a59bf7022499d7715b34018a9c0b5b37229f4b9c 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_2079.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_2079.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_2079.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_2110.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_2110.res.oracle
index b1af7c7da5cf23d35ee6e70c4dbfdb89fb3af036..ccaf0802ca728955534bc9243cd74a446b58e60b 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_2110.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_2110.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_2110.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 ---------------------------------------------
@@ -96,16 +95,15 @@ end
     
     (* use frama_c_wp.memory.Memory *)
     
+    (* use S2_A *)
+    
     (* use Compound *)
     
     goal wp_goal :
-      forall t:int -> int, t1:addr -> int, a:addr, a1:addr, i:int.
-       let a2 = shiftfield_F1_FD_pos a1 in
-       let x = get t1 a2 in
-       not x = i ->
-       region (base a1) <= 0 ->
-       region (base a) <= 0 ->
-       linked t -> is_sint32 i -> is_sint32 x -> not invalid t a2 1 -> a2 = a
+      forall t:addr -> int, t1:addr -> int, a:addr.
+       let a1 = Load_S2_A a t in
+       let a2 = Load_S2_A a (havoc t1 t a 1) in
+       region (base a) <= 0 -> IsS2_A a1 -> IsS2_A a2 -> EqS2_A a2 a1
   end
 [wp:print-generated] 
   theory WP1
@@ -125,14 +123,15 @@ end
     
     (* use frama_c_wp.memory.Memory *)
     
-    (* use S2_A *)
-    
     (* use Compound *)
     
     goal wp_goal :
-      forall t:addr -> int, t1:addr -> int, a:addr.
-       let a1 = Load_S2_A a t in
-       let a2 = Load_S2_A a (havoc t1 t a 1) in
-       region (base a) <= 0 -> IsS2_A a1 -> IsS2_A a2 -> EqS2_A a2 a1
+      forall t:int -> int, t1:addr -> int, a:addr, a1:addr, i:int.
+       let a2 = shiftfield_F1_FD_pos a1 in
+       let x = get t1 a2 in
+       not x = i ->
+       region (base a1) <= 0 ->
+       region (base a) <= 0 ->
+       linked t -> is_sint32 i -> is_sint32 x -> not invalid t a2 1 -> a2 = a
   end
 [wp] 2 goals generated
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_2159.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_2159.res.oracle
index aac7caf8ba126a5f68785b6f0999837bce7388a9..445eee0ff7667ada42e020df177835474aa85f27 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_2159.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_2159.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_2159.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function job
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_2201.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_2201.res.oracle
index 9669fdaf70d1e473e934014e843acd650c4b1db3..61491a01bbbc8eb4bb111c8c08a71bdf6e391b0a 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_2201.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_2201.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_2201.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_2246.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_2246.res.oracle
index 961bf49840094db6af8e8b4f91cc980e5af0bdeb..9d81968e9e5457308a1058107e00dcc574be8b46 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_2246.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_2246.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_2246.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function bad
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_2501.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_2501.res.oracle
index f38cfc4e5fd899a8c35a4e59f8b143d23457487a..550dd7a5454b01100b579c964ea4a0784253e269 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_2501.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_2501.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_2501.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 2 goals scheduled
 [wp] 2 goals generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_bts/oracle/ergo_typecheck.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/ergo_typecheck.res.oracle
index 694a8eed3ce377d9b01781323efae6aa05baa8a4..5cbab700501139b9988a526165935592e16c5bb3 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/ergo_typecheck.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/ergo_typecheck.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/ergo_typecheck.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_bts/oracle/ex5.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/ex5.res.oracle
index b37af5db7fee1f02ca661429b7f9954e48c38d54..b7b15905eb28679b166ca6e89fcfb8e5bcbc97c8 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/ex5.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/ex5.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/ex5.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function dummy
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue-364.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue-364.res.oracle
index ae3e885d9102d1aaf30d13185e12852f38e45c0b..cb25cf5612d6889bfaae292402eabc65e15e5e33 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue-364.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue-364.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue-364.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue-516.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue-516.res.oracle
index 9bf1f55fb108cb0f070e334ef8477d3704698b31..7a59fcea651b51295a354f4963df487bc73e6335 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue-516.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue-516.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue-516.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No definition for 'to_logic_list' interpreted as reads nothing
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue-684-exit.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue-684-exit.res.oracle
index 2b2e6c21c2df88606ff2a10ab33ab0e66f8f3272..cb499212b74e034784cefec5bc0743455477de99 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue-684-exit.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue-684-exit.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue-684-exit.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function inconditional_exit
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue_141.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue_141.res.oracle
index f84001a741b81c764034372d35bdefbf903406f3..9dd3dd748e7ee050326d660ce198563a2c639db4 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue_141.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue_141.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte -wp-steps 50 [...]
 [kernel] Parsing tests/wp_bts/issue_141.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function f
 [rte] annotating function main
 [wp] tests/wp_bts/issue_141.i:18: Warning: 
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue_198.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue_198.res.oracle
index 3995ac6f0b637b0ab3ea9a463f2ed9f6e838ff9e..e7f427ccd5d7c4cafa4fbdc06014a05b965aa853 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue_198.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue_198.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_198.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 ------------------------------------------------------------
   Global
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue_447.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue_447.res.oracle
index e034a5bf910e1e91fc6c1ddb3273ef13ff0805f6..f8dc63d5e2026929898298dece6f3877bb581932 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue_447.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue_447.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_447.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 ------------------------------------------------------------
   Global
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue_453.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue_453.res.oracle
index 99a9aed869aba27df4dcc5f81f4bf76cb47161f2..9c1dde973cc4e3eb98f278b9b5e659b8b357387b 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue_453.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue_453.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_453.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f1
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue_494.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue_494.res.oracle
index 297b4d981860ff3428f2fa865dc0c1739945acb6..faaeeb6e2dd17053e3ed2dd5f8cb9a5eb2890623 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue_494.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue_494.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_494.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue_508.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue_508.res.oracle
index 179be9f834bcce480b9e2d76af6eea6f591bb5be..69016b5d1ff4920ddce03d5b1be0a83071485b7d 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue_508.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue_508.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_508.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function add
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue_711.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue_711.res.oracle
index 786b948ba145cf3846cd5d627264465f6d001c4a..d30781324d40f3bac332a4451a931fcc924badb3 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue_711.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue_711.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_711.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 ------------------------------------------------------------
   Axiomatic 'LISTS'
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue_715_a.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue_715_a.res.oracle
index 3d37a96e7d7d04c126f309232865a95e64b7cb7c..e41e8f471f50b9d327ff0a48c2556f9a990f57af 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue_715_a.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue_715_a.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_715_a.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_bts/issue_715_a.i:6: Warning: 
   No code nor implicit assigns clause for function dummy, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue_715_b.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue_715_b.res.oracle
index 06b261910a55579c8431e60213bf9906b379709c..8c82bc192bafd62b31a091cb7954318093d79a85 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue_715_b.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue_715_b.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_715_b.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_bts/issue_715_b.i:9: Warning: 
   No code nor implicit assigns clause for function dummy, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
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 d54cb3838366d89778e8abc0cccae8de0cef42f0..14535c7cf0c072d0d5733260c788e4cb80ebb297 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_751.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function acquire
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 81c0ed9a9db7f1fea76ada3447ea8325532e6c3f..0021dc1ad13f35291453f98e675313a297afc67c 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_801.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function LoopCurrent
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue_81.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue_81.res.oracle
index 3c3d2d46a68d9024af31e4d184d6a5d81b5478d4..ede0b64f8b9bb21f73b923ba01523ba756be0499 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue_81.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue_81.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_81.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function getMax
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue_825.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue_825.res.oracle
index 65c234448ba7d4d4dff459d117eb43ab42bf7ee7..6af1e96a96a3ebadd603d0249caef12e68caca2f 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue_825.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue_825.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_825.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function issue
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue_837.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue_837.res.oracle
index d1e95f07802a37aca4d1c87ef2585aad84f75219..6505c959c081e472fd5b92a077fddf9aac826e27 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue_837.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue_837.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_837.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function bar
diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue_898.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue_898.res.oracle
index f3dbc6f8d161250a1dab323a3012745b1929ae9c..d832b6f57960c51cd42578d6398f586a9028bc4f 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/issue_898.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/issue_898.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_898.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function job
diff --git a/src/plugins/wp/tests/wp_bts/oracle/nupw-bcl-bts1120.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/nupw-bcl-bts1120.res.oracle
index 094d64fd5cc15c062e1c9bf26f9235d9517c3538..60c6a834f15bdb4a543704f01696ec53c64f493f 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/nupw-bcl-bts1120.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/nupw-bcl-bts1120.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/nupw-bcl-bts1120.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] tests/wp_bts/nupw-bcl-bts1120.i:54: Warning: 
   [cfg] Forget exits clause of node <blkIn-stmt:26>
 [wp] tests/wp_bts/nupw-bcl-bts1120.i:54: Warning: 
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts0708.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts0708.res.oracle
index 665ff4aed3b2d3bde5d07b65bebea1e0975c4908..15fb0108e378694f738e976e4a1618109cb9519f 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts0708.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts0708.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts0708.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures_A : Valid
@@ -13,12 +12,11 @@
   f                         -        1        1       100%
 ------------------------------------------------------------
 [wp] Running WP plugin...
-[wp] 2 goals scheduled
-[wp] [Alt-Ergo] Goal typed_f_ensures_A : Valid
+[wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures_B : Valid
-[wp] Proved goals:    2 / 2
+[wp] Proved goals:    1 / 1
   Qed:             0 
-  Alt-Ergo:        2
+  Alt-Ergo:        1
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   f                         -        2        2       100%
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts0843.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts0843.res.oracle
index c532eebcae878973b96521ed3e1280ab1922fd2a..fbd210f679cb91ec29196a1b2f0e5f4b01f8f764 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts0843.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts0843.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts0843.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 4 goals scheduled
 [wp] [Qed] Goal typed_f3_assigns : Valid
@@ -16,3 +15,7 @@
   f3                        1        -        1       100%
   g3                        1        2        3       100%
 ------------------------------------------------------------
+[wp] Warning: Memory model hypotheses for function 'f3':
+  /*@ behavior typed:
+        requires \separated(&p, &p->a); */
+  void f3(void);
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts779.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts779.res.oracle
index c5515d3585a14c0612808fb0a41e166a3140ef24..7f1e9b6e40fe2f7f02428d4290e889a9fc0c5d1b 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts779.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts779.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp_bts/bts779.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function f
 [wp] 2 goals scheduled
 [wp] [Alt-Ergo] Goal typed_f_assert : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts788.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts788.res.oracle
index 81c8416d16fa9cc15b002e06f197ea2b90cb992f..07263eaba248a77e6041f55a890d6f20ca8d897a 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts788.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts788.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_bts/bts788.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
 [wp] [Qed] Goal typed_ref_main_ensures_I0 : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts986.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts986.res.oracle
index 03a9507ea8164f81b9a8754bf234bfdf23c7df0a..8d3d1c250bfcf2ce2a168b360d6dd34898d11e1f 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts986.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts986.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-steps 50 [...]
 [kernel] Parsing tests/wp_bts/bts986.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_f_assert_A : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1174.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1174.res.oracle
index 5a020f66ee15f500ca4b306d8c19558a61fbe81f..2cdd4e30969e83cd3bcbaaaa19602507ea67c65f 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1174.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1174.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Real)' [...]
 [kernel] Parsing tests/wp_bts/bts_1174.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: native support for coq is deprecated, use tip instead
 [wp] 1 goal scheduled
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1176.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1176.res.oracle
index abcda8d369d768828e71481a8ba74ed4b21686fc..e3b5535c1cb8a5f5e3557c9a4fe0ef85b2566b19 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1176.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1176.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-steps 50 [...]
 [kernel] Parsing tests/wp_bts/bts_1176.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Qed] Goal typed_f_assert_qed_ok : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1360.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1360.res.oracle
index bf325fc4ff10e2061af50113485fc79a7b5b41a7..0d96c29ae0cfc5a4764a83ebf72d2b57b8f48240 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1360.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1360.res.oracle
@@ -1,20 +1,19 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp_bts/bts_1360.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function foo_correct
 [rte] annotating function foo_wrong
 [wp] 10 goals scheduled
-[wp] [Qed] Goal typed_foo_correct_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_foo_correct_assert_rte_mem_access : Valid
-[wp] [Qed] Goal typed_foo_correct_assert_rte_mem_access_2 : Valid
-[wp] [Qed] Goal typed_foo_correct_assert_rte_mem_access_3 : Valid
-[wp] [Qed] Goal typed_foo_correct_assigns : Valid
 [wp] [Qed] Goal typed_foo_wrong_ensures : Valid
 [wp] [Qed] Goal typed_foo_wrong_assert_rte_mem_access : Valid
 [wp] [Qed] Goal typed_foo_wrong_assert_rte_mem_access_2 : Valid
 [wp] [Alt-Ergo] Goal typed_foo_wrong_assert_rte_mem_access_3 : Unsuccess
 [wp] [Qed] Goal typed_foo_wrong_assigns : Valid
+[wp] [Qed] Goal typed_foo_correct_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_foo_correct_assert_rte_mem_access : Valid
+[wp] [Qed] Goal typed_foo_correct_assert_rte_mem_access_2 : Valid
+[wp] [Qed] Goal typed_foo_correct_assert_rte_mem_access_3 : Valid
+[wp] [Qed] Goal typed_foo_correct_assigns : Valid
 [wp] Proved goals:    9 / 10
   Qed:             8 
   Alt-Ergo:        1  (unsuccess: 1)
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1462.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1462.res.oracle
index 84c5b56ed462a1d9dd9ebb007fc6ac74b2987c6d..c34b04935c1d1bddbbe582eea0d3fc8cfdc4f5ae 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1462.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1462.res.oracle
@@ -1,13 +1,8 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_1462.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 13 goals scheduled
-[wp] [Qed] Goal typed_local_loop_invariant_preserved : Valid
-[wp] [Qed] Goal typed_local_loop_invariant_established : Valid
-[wp] [Qed] Goal typed_local_loop_assigns_part1 : Valid
-[wp] [Qed] Goal typed_local_loop_assigns_part2 : Valid
 [wp] [Alt-Ergo] Goal typed_wrong_assert_for_value : Valid
 [wp] [Alt-Ergo] Goal typed_wrong_loop_invariant_A_KO_preserved : Unsuccess
 [wp] [Qed] Goal typed_wrong_loop_invariant_A_KO_established : Valid
@@ -17,6 +12,10 @@
 [wp] [Qed] Goal typed_wrong_loop_invariant_C_established : Valid
 [wp] [Alt-Ergo] Goal typed_wrong_assert_consequence_of_false_invariant : Valid
 [wp] [Qed] Goal typed_wrong_loop_assigns : Valid
+[wp] [Qed] Goal typed_local_loop_invariant_preserved : Valid
+[wp] [Qed] Goal typed_local_loop_invariant_established : Valid
+[wp] [Qed] Goal typed_local_loop_assigns_part1 : Valid
+[wp] [Qed] Goal typed_local_loop_assigns_part2 : Valid
 [wp] Proved goals:   12 / 13
   Qed:            10 
   Alt-Ergo:        2  (unsuccess: 1)
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1586.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1586.res.oracle
index 8f62c5605c854c1e152b2bf68e57a954a670b56a..5d88cb99d2cc007af88b732ec74b9808ac99452b 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1586.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1586.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_1586.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 4 goals scheduled
 [wp] [Qed] Goal typed_compute_bizarre_Bizarre_ensures_TRANS : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1588.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1588.res.oracle
index 5d175d94ffb0c144848044e01ea79e7d07726b41..4b070090eaa9f81b91cddfdb7c1827c22dcce062 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1588.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1588.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_1588.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_bts/bts_1588.i:19: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1601.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1601.res.oracle
index 7efb8386c5fb64310ffdde108116eadb36aaa950..86708cc7d79dc64c967451ea2382b2cc185d3eb5 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1601.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1601.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_1601.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 8 goals scheduled
 [wp] [Alt-Ergo] Goal typed_foo_assert : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1828.0.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1828.0.res.oracle
index 24788faf50d022b02cd79a79e3d0022ec3ce87f9..91203bd8a7c316be36b9377c010047ff59f965b9 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1828.0.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1828.0.res.oracle
@@ -1,15 +1,14 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_1828.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 6 goals scheduled
+[wp] [Alt-Ergo] Goal typed_local_frame_assert_ok : Valid
 [wp] [Alt-Ergo] Goal typed_global_frame_ensures_sep_iff_ref : Unsuccess
 [wp] [Alt-Ergo] Goal typed_global_frame_ensures_one_iff_ref : Unsuccess
 [wp] [Qed] Goal typed_global_frame_ensures_zero_always : Valid
 [wp] [Qed] Goal typed_global_frame_assert_ok : Valid
 [wp] [Qed] Goal typed_global_frame_assert_ok_2 : Valid
-[wp] [Alt-Ergo] Goal typed_local_frame_assert_ok : Valid
 [wp] Proved goals:    4 / 6
   Qed:             3 
   Alt-Ergo:        1  (unsuccess: 2)
@@ -19,5 +18,6 @@
   global_frame              3        -        5      60.0%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'global_frame':
-  /*@ behavior typed: requires \separated(&zero,one); */
+  /*@ behavior typed:
+        requires \separated(one, &zero); */
   void global_frame(int *one, int arg);
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1828.1.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1828.1.res.oracle
index f560c0a026a581f5e35e055a63f695517f83361c..e5edde37e9b7b942c93989d95bb6fd04d5118460 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1828.1.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1828.1.res.oracle
@@ -1,15 +1,14 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_bts/bts_1828.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 6 goals scheduled
+[wp] [Alt-Ergo] Goal typed_ref_local_frame_assert_ok : Valid
 [wp] [Qed] Goal typed_ref_global_frame_ensures_sep_iff_ref : Valid
 [wp] [Qed] Goal typed_ref_global_frame_ensures_one_iff_ref : Valid
 [wp] [Qed] Goal typed_ref_global_frame_ensures_zero_always : Valid
 [wp] [Qed] Goal typed_ref_global_frame_assert_ok : Valid
 [wp] [Qed] Goal typed_ref_global_frame_assert_ok_2 : Valid
-[wp] [Alt-Ergo] Goal typed_ref_local_frame_assert_ok : Valid
 [wp] Proved goals:    6 / 6
   Qed:             5 
   Alt-Ergo:        1
@@ -21,8 +20,8 @@
 [wp] Warning: Memory model hypotheses for function 'global_frame':
   /*@
      behavior typed_ref:
-     requires \separated(zero,one);
-     requires \valid(zero);
-     requires \valid(one);
+       requires \separated(zero, one);
+       requires \valid(one);
+       requires \valid(zero);
      */
   void global_frame(int *one, int arg);
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2040.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2040.res.oracle
index 058efe3f4e9bbaa5cc8e2b915c0e488596667b08..c47673e6b51df770410f04e7619b358ecea293f0 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2040.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2040.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_2040.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Qed] Goal typed_call_assert : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2079.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2079.res.oracle
index bfcb01c492df22e9d7a750db82d299ee4de2515c..6f837f71940fa5aaa41c56c688dcd642832c139f 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2079.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2079.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_2079.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Qed] Goal typed_main_ensures_Eval_P : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2159.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2159.res.oracle
index afb849952b4a2ce73cc71497cf071e0b709ae5a6..c02dc9c178f3388a2f3c6212d3f540aabdb1a1db 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2159.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2159.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_2159.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_job_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.0.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.0.res.oracle
index 75f2f1ffe2071220b336af525af0ee88edf4bf51..99642408d02d9bb3678f5267181dfb4e16a0d6bd 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.0.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-timeout 1 [...]
 [kernel] Parsing tests/wp_bts/bts_2471.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_foo_assert_ko : Unsuccess
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.1.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.1.res.oracle
index 332bc081e7b4a91d0a25fc9745a7707148d7e385..ffb3913bc3829c2336a99250827f72c490e1ca85 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.1.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-timeout 1 [...]
 [kernel] Parsing tests/wp_bts/bts_2471.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: native support for alt-ergo is deprecated, use why3 instead
 [wp] 1 goal scheduled
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.2.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.2.res.oracle
index 50cddea1b703876cc9d4b83bc02a9f43f0eca368..daef8736024e638253e9724c9732a577d90cb7df 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.2.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/bts_2471.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: native support for coq is deprecated, use tip instead
 [wp] 1 goal scheduled
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/ergo_typecheck.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/ergo_typecheck.res.oracle
index 7c15d302575a2787a8d5b4fcfbc5b1f35d9a26fd..abf5b9692634744f0f1b390c33f4920e344ebc89 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/ergo_typecheck.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/ergo_typecheck.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/ergo_typecheck.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 8 goals scheduled
 [wp] [Qed] Goal typed_f_ensures_var_divded : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue-364.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue-364.res.oracle
index 6fda3dfb53cdbe4d142f181cfcd95bde55934ad6..ea1d384da71ead051acf621bac6241aa441336bc 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue-364.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue-364.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue-364.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Alt-Ergo] Goal typed_main_assert_ZERO : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue-684-exit.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue-684-exit.res.oracle
index e1937ad2d564359816d4d03bcc49474a3b53ab07..be5d63c71f629ebf2cfc190d1532174e3f93b970 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue-684-exit.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue-684-exit.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue-684-exit.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 4 goals scheduled
 [wp] [Qed] Goal typed_inconditional_exit_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_143.0.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_143.0.res.oracle
index 485a5ed91f445fec2802b93aed25a1818a448a18..9d615ddd682dd47aa3bb673b79d3b40cb090cb74 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_143.0.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_143.0.res.oracle
@@ -1,10 +1,9 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_143.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 2 goals scheduled
-[wp] [Alt-Ergo] Goal typed_lemma_ok_because_inconsistent : Valid
 [wp] [Alt-Ergo] Goal typed_lemma_ok_because_consistent : Valid
+[wp] [Alt-Ergo] Goal typed_lemma_ok_because_inconsistent : Valid
 [wp] Proved goals:    2 / 2
   Qed:             0 
   Alt-Ergo:        2
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_143.1.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_143.1.res.oracle
index 0e57e63b9d92096579de23fb61f4ecdc47a27feb..08841f4f3a5743e7882829ae4b5b2530c704ef60 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_143.1.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_143.1.res.oracle
@@ -1,11 +1,10 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_143.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: native support for coq is deprecated, use tip instead
 [wp] 2 goals scheduled
-[wp] [Alt-Ergo] Goal typed_lemma_ok_because_inconsistent : Valid
 [wp] [Alt-Ergo] Goal typed_lemma_ok_because_consistent : Valid
+[wp] [Alt-Ergo] Goal typed_lemma_ok_because_inconsistent : Valid
 [wp] Proved goals:    2 / 2
   Qed:             0 
   Alt-Ergo:        2
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_143.2.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_143.2.res.oracle
index 485a5ed91f445fec2802b93aed25a1818a448a18..9d615ddd682dd47aa3bb673b79d3b40cb090cb74 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_143.2.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_143.2.res.oracle
@@ -1,10 +1,9 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_143.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 2 goals scheduled
-[wp] [Alt-Ergo] Goal typed_lemma_ok_because_inconsistent : Valid
 [wp] [Alt-Ergo] Goal typed_lemma_ok_because_consistent : Valid
+[wp] [Alt-Ergo] Goal typed_lemma_ok_because_inconsistent : Valid
 [wp] Proved goals:    2 / 2
   Qed:             0 
   Alt-Ergo:        2
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_143.3.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_143.3.res.oracle
index a4f2f3787a6ec3253bd62a7b86092493fc73a35f..376255d0dcbdd0874f047745de334d291a25548a 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_143.3.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_143.3.res.oracle
@@ -1,14 +1,13 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_143.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: native support for coq is deprecated, use tip instead
 [wp] 2 goals scheduled
+[wp] [Coq (native)] Goal typed_lemma_ok_because_consistent : Failed
+  Command './tests/inexistant-prover' not found
 [wp] [Coq] Goal typed_lemma_ok_because_inconsistent : Default tactic
 [wp] [Coq (native)] Goal typed_lemma_ok_because_inconsistent : Failed
   Command './tests/inexistant-prover' not found
-[wp] [Coq (native)] Goal typed_lemma_ok_because_consistent : Failed
-  Command './tests/inexistant-prover' not found
 [wp] Proved goals:    0 / 2
   Coq (native):    0  (failed: 2)
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_198.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_198.res.oracle
index 6ab759c07bb389275ba7929463d7845c9067f1c5..19ffd064dfc2f54284c5d1c1ba830da766e51f95 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_198.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_198.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_198.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_broken : Valid
 [wp] Proved goals:    1 / 1
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_447.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_447.res.oracle
index d5e25e1edd51b8fae4459cf3e5683a831767202b..df5e033c97cf32024c587ccc4efe29ecd824e07b 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_447.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_447.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_447.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_foo : Valid
 [wp] Proved goals:    1 / 1
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_453.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_453.res.oracle
index c23bd61bb48e42e8db14f2a7fa52829d737daaf5..c4d33cc9b69a9af5442f34759db1c02b3fd3aa32 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_453.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_453.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_453.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 6 goals scheduled
 [wp] [Qed] Goal typed_f1_loop_assigns : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_494.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_494.res.oracle
index b4c5c4f42866f939a7acfe6c1e19579c55c53d0a..437f33f00c3f348ac81f2cec3c4520c286180eae 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_494.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_494.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_494.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_508.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_508.res.oracle
index 72ff7aaa1bdf490a9bfff9ae776ff4ffafb7aabb..f5c735d0395f2270a0b38e8c52423f4688eea914 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_508.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_508.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_508.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
 [wp] [Alt-Ergo] Goal typed_add_assigns_part1 : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_711.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_711.res.oracle
index ebb6855f35d74c7a9195b5d5f9d6618841d84fa9..87633b0ea70e4a4143717cec91bbe1ceba92e119 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_711.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_711.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_711.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_A : Valid
 [wp] Proved goals:    1 / 1
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_715_a.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_715_a.res.oracle
index ed8d24a253a4e71985d065afaebccfcdc9098daf..2ab4a1454a9c1cf87dce7dc02bf19b648ae792ad 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_715_a.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_715_a.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_715_a.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_bts/issue_715_a.i:6: Warning: 
   No code nor implicit assigns clause for function dummy, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_715_b.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_715_b.res.oracle
index 9f9bc155c5feeb1c347aec5a7d8c9c5c32cd9a73..694a10a84e816776f16530112304a39f25cb8716 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_715_b.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_715_b.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_715_b.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_bts/issue_715_b.i:9: Warning: 
   No code nor implicit assigns clause for function dummy, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_751.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_751.res.oracle
index 300d4c7ea1fe2d07d1a4a810572949bf17b21c8d..6fc62ce363bb63402e570f6ae0c8ab870bee5c61 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_751.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_751.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_751.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 40 goals scheduled
 [wp] [Alt-Ergo] Goal typed_acquire_loop_invariant_RANGE_preserved : Valid
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 338d948dadce37b4611ab359bb52de36e190c59e..455278246bd518ab7843f951f86963da8d6c9ae1 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_801.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 6 goals scheduled
 [wp] [Qed] Goal typed_LoopCurrent_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_81.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_81.res.oracle
index 9486ece4eccbf935e4da4957d98eb7d28619cef9..30935254772c056f74fa6ec471beff51f1e79d08 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_81.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_81.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_81.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_getMax_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_825.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_825.res.oracle
index 35895046c313f3c5b9afccb4df714ce09f77ecc0..2b809a025c2ffac3da40e70fc650e26459984b06 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_825.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_825.res.oracle
@@ -1,17 +1,16 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_825.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 8 goals scheduled
-[wp] [Alt-Ergo] Goal typed_issue_check_ko : Unsuccess
-[wp] [Alt-Ergo] Goal typed_issue_check_ko_2 : Unsuccess
 [wp] [Alt-Ergo] Goal typed_job_ensures : Unsuccess
 [wp] [Qed] Goal typed_job_loop_invariant_preserved : Valid
 [wp] [Qed] Goal typed_job_loop_invariant_established : Valid
 [wp] [Qed] Goal typed_job_loop_assigns_part1 : Valid
 [wp] [Alt-Ergo] Goal typed_job_loop_assigns_part2 : Unsuccess
 [wp] [Qed] Goal typed_job_assigns : Valid
+[wp] [Alt-Ergo] Goal typed_issue_check_ko : Unsuccess
+[wp] [Alt-Ergo] Goal typed_issue_check_ko_2 : Unsuccess
 [wp] Proved goals:    4 / 8
   Qed:             4 
   Alt-Ergo:        0  (unsuccess: 4)
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_837.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_837.res.oracle
index 1e55e4e4da4d50a375b1d5045388b3b665121725..64c3d264d8c78c5fc4f60fd53162e685061f1d06 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_837.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_837.res.oracle
@@ -1,18 +1,17 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_837.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 9 goals scheduled
+[wp] [Qed] Goal typed_foo_assigns_part1 : Valid
+[wp] [Qed] Goal typed_foo_assigns_part2 : Valid
+[wp] [Qed] Goal typed_foo_assigns_part3 : Valid
+[wp] [Qed] Goal typed_foo_assigns_part4 : Valid
 [wp] [Qed] Goal typed_bar_assigns_part1 : Valid
 [wp] [Qed] Goal typed_bar_assigns_part2 : Valid
 [wp] [Qed] Goal typed_bar_assigns_part3 : Valid
 [wp] [Qed] Goal typed_bar_assigns_part4 : Valid
 [wp] [Qed] Goal typed_bar_assigns_part5 : Valid
-[wp] [Qed] Goal typed_foo_assigns_part1 : Valid
-[wp] [Qed] Goal typed_foo_assigns_part2 : Valid
-[wp] [Qed] Goal typed_foo_assigns_part3 : Valid
-[wp] [Qed] Goal typed_foo_assigns_part4 : Valid
 [wp] Proved goals:    9 / 9
   Qed:             9
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_898.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_898.res.oracle
index 7d9049804fb645d575944e4ce403903b3c3e6b8c..9e1e9bcdbead3094f0f8b7672cd5ea7de62f534d 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_898.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/issue_898.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/issue_898.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Alt-Ergo] Goal typed_job_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/nupw-bcl-bts1120.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/nupw-bcl-bts1120.res.oracle
index 272e07b8fe6b7f3f20d9efa62f062148aa8fcb80..164271bc40ab026c97fa2a3ab4579fcb40c49bda 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/nupw-bcl-bts1120.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/nupw-bcl-bts1120.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_bts/nupw-bcl-bts1120.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] [CFG] Goal unreachable_smt_with_contract_assigns : Valid (Unreachable)
 [wp] [CFG] Goal unreachable_smt_with_contract_exits_ok : Valid (Unreachable)
 [wp] [CFG] Goal unreachable_smt_with_contract_ensures_ok : Valid (Unreachable)
diff --git a/src/plugins/wp/tests/wp_gallery/oracle/binary-multiplication-without-overflow.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/binary-multiplication-without-overflow.res.oracle
index f573edafe8d54e38b786507fc9900efc9d02cf1f..4a3a4384db14cfb12387b0265f04c6a284b3954f 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle/binary-multiplication-without-overflow.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle/binary-multiplication-without-overflow.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte -warn-unsigned-overflow [...]
 [kernel] Parsing tests/wp_gallery/binary-multiplication-without-overflow.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function BinaryMultiplication
 [wp] Goal typed_lemma_ax1_lack : not tried
 [wp] Goal typed_lemma_sizeof_ok_ok : trivial
diff --git a/src/plugins/wp/tests/wp_gallery/oracle/binary-multiplication.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/binary-multiplication.res.oracle
index 129465cef770b75b8586fd5e8ed73e23198a3561..58d59aef85258fe52c3a1d4b176d66dd618f57cf 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle/binary-multiplication.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle/binary-multiplication.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp_gallery/binary-multiplication.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function BinaryMultiplication
 [wp] Goal typed_lemma_ax1_lack : not tried
 [wp] Goal typed_lemma_ax2_lack : not tried
diff --git a/src/plugins/wp/tests/wp_gallery/oracle/find.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/find.res.oracle
index b4f4caaaf02b52cb3b93f4e6c14e4c309f6fa375..b8198f111f13136e793f65b38dfee5cbd67a1d9d 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle/find.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle/find.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp_gallery/find.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function find
 [rte] annotating function find_ptr
 [rte] annotating function iter_ptr
@@ -20,9 +19,9 @@
 [wp] Goal typed_find_loop_assigns : trivial
 [wp] Goal typed_find_loop_variant_decrease : not tried
 [wp] Goal typed_find_loop_variant_positive : not tried
+[wp] Goal typed_find_not_found_ensures : not tried
 [wp] Goal typed_find_found_ensures : not tried
 [wp] Goal typed_find_found_ensures_2 : not tried
-[wp] Goal typed_find_not_found_ensures : not tried
 [wp] Goal typed_find_ptr_complete_found_not_found : trivial
 [wp] Goal typed_find_ptr_disjoint_found_not_found : trivial
 [wp] Goal typed_find_ptr_ensures_Range : not tried
@@ -38,9 +37,9 @@
 [wp] Goal typed_find_ptr_loop_assigns : trivial
 [wp] Goal typed_find_ptr_loop_variant_decrease : not tried
 [wp] Goal typed_find_ptr_loop_variant_positive : not tried
+[wp] Goal typed_find_ptr_not_found_ensures : not tried
 [wp] Goal typed_find_ptr_found_ensures : not tried
 [wp] Goal typed_find_ptr_found_ensures_2 : not tried
-[wp] Goal typed_find_ptr_not_found_ensures : not tried
 [wp] Goal typed_iter_ptr_ensures_Last : not tried
 [wp] Goal typed_iter_ptr_loop_invariant_Range_preserved : not tried
 [wp] Goal typed_iter_ptr_loop_invariant_Range_established : not tried
diff --git a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo1_solved.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo1_solved.res.oracle
index 388a5387f67843dbacafd4aad8d4615860dbde18..cdf72d9135a17beec35a1d60cacb9a081f9d7175 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo1_solved.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo1_solved.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp_gallery/frama_c_exo1_solved.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function exo1
 [wp] Goal typed_exo1_ensures : not tried
 [wp] Goal typed_exo1_ensures_2 : not tried
diff --git a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo2_solved.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo2_solved.res.oracle
index 01cfab82cf38c1afd040a1dda9d285e2ab0317ab..daf1e9d366bd36406edf6a848378db5cfd4ed352 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo2_solved.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo2_solved.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte -no-warn-signed-overflow [...]
 [kernel] Parsing tests/wp_gallery/frama_c_exo2_solved.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function max_subarray
 [wp] Goal typed_max_subarray_ensures : not tried
 [wp] Goal typed_max_subarray_ensures_2 : not tried
diff --git a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.res.oracle
index d0d68abc9caadab4d4002d9a8bd206d5e529a233..e21f8f5fe4bc97954c318b6c4531baf28e311bc2 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_gallery/frama_c_exo3_solved.old.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function equal_elements
 [wp] Goal typed_ref_equal_elements_ensures : not tried
 [wp] Goal typed_ref_equal_elements_ensures_2 : not tried
@@ -56,8 +55,8 @@
 [wp] Warning: Memory model hypotheses for function 'equal_elements':
   /*@
      behavior typed_ref:
-     requires \separated(v1,v2,a+(..));
-     requires \valid(v1);
-     requires \valid(v2);
+       requires \separated(v1, v2, a + (..));
+       requires \valid(v1);
+       requires \valid(v2);
      */
   void equal_elements(int *a, int *v1, int *v2);
diff --git a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.v2.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.v2.res.oracle
index 8b40acb3f436b766feb9fef4bb8d7b960945d098..0a5004c676571d4ea94cd0cf4e06b37217771f29 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.v2.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.v2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_gallery/frama_c_exo3_solved.old.v2.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function equal_elements
 [wp] Goal typed_ref_equal_elements_ensures_v1_good : not tried
 [wp] Goal typed_ref_equal_elements_ensures_v2_good : not tried
@@ -57,8 +56,8 @@
 [wp] Warning: Memory model hypotheses for function 'equal_elements':
   /*@
      behavior typed_ref:
-     requires \separated(v1,v2,a+(..));
-     requires \valid(v1);
-     requires \valid(v2);
+       requires \separated(v1, v2, a + (..));
+       requires \valid(v1);
+       requires \valid(v2);
      */
   void equal_elements(int *a, int *v1, int *v2);
diff --git a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.simplified.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.simplified.res.oracle
index d19091020e7771f01268a28a7d9a158e21d88c20..fb3bb56176fc1dab5f0860370d48c9f6384ab68a 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.simplified.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.simplified.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp_gallery/frama_c_exo3_solved.simplified.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function pair
 [wp] Goal typed_pair_complete_has_pair_no_pair : trivial
 [wp] Goal typed_pair_disjoint_has_pair_no_pair : trivial
@@ -36,5 +35,5 @@
 [wp] Goal typed_pair_loop_variant_positive : not tried
 [wp] Goal typed_pair_loop_variant_2_decrease : not tried
 [wp] Goal typed_pair_loop_variant_2_positive : not tried
-[wp] Goal typed_pair_has_pair_ensures : not tried
 [wp] Goal typed_pair_no_pair_ensures : not tried
+[wp] Goal typed_pair_has_pair_ensures : not tried
diff --git a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_hashtbl_solved.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_hashtbl_solved.res.oracle
index 064dce264b9e7e20ae5c3d9799927e9b346ed87c..2429963d412aaa3b426504d27c25d7c2fc60722a 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_hashtbl_solved.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_hashtbl_solved.res.oracle
@@ -1,69 +1,14 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp_gallery/frama_c_hashtbl_solved.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function add
 [rte] annotating function eq_string
 [rte] annotating function hash
 [rte] annotating function init
 [rte] annotating function mem_binding
 [rte] annotating function size
-[wp] Goal typed_add_complete_full_nominal : not tried
-[wp] Goal typed_add_disjoint_full_nominal : not tried
-[wp] Goal typed_add_assert_rte_index_bound : not tried
-[wp] Goal typed_add_assert_rte_mem_access : not tried
-[wp] Goal typed_add_assert_rte_index_bound_2 : not tried
-[wp] Goal typed_add_assert_rte_index_bound_3 : not tried
-[wp] Goal typed_add_assert_rte_index_bound_4 : not tried
-[wp] Goal typed_add_assert_rte_index_bound_5 : not tried
-[wp] Goal typed_add_assert_rte_mem_access_2 : not tried
-[wp] Goal typed_add_assert_rte_mem_access_3 : not tried
-[wp] Goal typed_add_assert_rte_index_bound_6 : not tried
-[wp] Goal typed_add_assert_rte_mem_access_4 : not tried
-[wp] Goal typed_add_assert_rte_mem_access_5 : not tried
-[wp] Goal typed_add_assert_rte_signed_overflow : not tried
-[wp] Goal typed_add_assert_rte_mem_access_6 : not tried
-[wp] Goal typed_add_assert_rte_mem_access_7 : not tried
-[wp] Goal typed_add_assert_rte_signed_overflow_2 : not tried
-[wp] Goal typed_add_assigns_exit : trivial
-[wp] Goal typed_add_assigns_normal_part1 : trivial
-[wp] Goal typed_add_assigns_normal_part2 : not tried
-[wp] Goal typed_add_assigns_normal_part3 : not tried
-[wp] Goal typed_add_assigns_normal_part4 : not tried
-[wp] Goal typed_add_assigns_normal_part5 : not tried
-[wp] Goal typed_add_assigns_normal_part6 : not tried
-[wp] Goal typed_add_assigns_normal_part7 : not tried
-[wp] Goal typed_add_assigns_normal_part8 : not tried
-[wp] Goal typed_add_assigns_normal_part9 : not tried
-[wp] Goal typed_add_call_hash_requires : not tried
-[wp] Goal typed_add_full_ensures : not tried
-[wp] Goal typed_add_full_assigns_exit : trivial
-[wp] Goal typed_add_full_assigns_normal_part1 : trivial
-[wp] Goal typed_add_full_assigns_normal_part2 : not tried
-[wp] Goal typed_add_full_assigns_normal_part3 : not tried
-[wp] Goal typed_add_full_assigns_normal_part4 : not tried
-[wp] Goal typed_add_full_assigns_normal_part5 : not tried
-[wp] Goal typed_add_full_assigns_normal_part6 : not tried
-[wp] Goal typed_add_full_assigns_normal_part7 : not tried
-[wp] Goal typed_add_full_assigns_normal_part8 : not tried
-[wp] Goal typed_add_full_assigns_normal_part9 : not tried
-[wp] Goal typed_add_nominal_ensures : not tried
-[wp] Goal typed_add_nominal_ensures_2 : not tried
-[wp] Goal typed_add_nominal_ensures_3 : not tried
-[wp] Goal typed_add_nominal_ensures_4 : not tried
-[wp] Goal typed_add_nominal_ensures_5 : not tried
-[wp] Goal typed_add_nominal_assigns_exit : trivial
-[wp] Goal typed_add_nominal_assigns_normal_part1 : trivial
-[wp] Goal typed_add_nominal_assigns_normal_part2 : not tried
-[wp] Goal typed_add_nominal_assigns_normal_part3 : not tried
-[wp] Goal typed_add_nominal_assigns_normal_part4 : not tried
-[wp] Goal typed_add_nominal_assigns_normal_part5 : not tried
-[wp] Goal typed_add_nominal_assigns_normal_part6 : not tried
-[wp] Goal typed_add_nominal_assigns_normal_part7 : not tried
-[wp] Goal typed_add_nominal_assigns_normal_part8 : not tried
-[wp] Goal typed_add_nominal_assigns_normal_part9 : not tried
-[wp] Goal typed_eq_string_complete_not_eq_eq : trivial
-[wp] Goal typed_eq_string_disjoint_not_eq_eq : trivial
+[wp] Goal typed_eq_string_complete_eq_not_eq : trivial
+[wp] Goal typed_eq_string_disjoint_eq_not_eq : trivial
 [wp] Goal typed_eq_string_loop_invariant_preserved : not tried
 [wp] Goal typed_eq_string_loop_invariant_established : not tried
 [wp] Goal typed_eq_string_loop_invariant_2_preserved : not tried
@@ -91,6 +36,9 @@
 [wp] Goal typed_hash_assigns_part2 : not tried
 [wp] Goal typed_hash_loop_variant_decrease : not tried
 [wp] Goal typed_hash_loop_variant_positive : not tried
+[wp] Goal typed_size_ensures : not tried
+[wp] Goal typed_size_assert_rte_mem_access : not tried
+[wp] Goal typed_size_assigns : not tried
 [wp] Goal typed_init_ensures : not tried
 [wp] Goal typed_init_ensures_2 : not tried
 [wp] Goal typed_init_assert_rte_mem_access : not tried
@@ -109,8 +57,62 @@
 [wp] Goal typed_init_assigns_part3 : not tried
 [wp] Goal typed_init_loop_variant_decrease : not tried
 [wp] Goal typed_init_loop_variant_positive : not tried
-[wp] Goal typed_mem_binding_complete_not_found_found : not tried
-[wp] Goal typed_mem_binding_disjoint_not_found_found : not tried
+[wp] Goal typed_add_complete_full_nominal : not tried
+[wp] Goal typed_add_disjoint_full_nominal : not tried
+[wp] Goal typed_add_assert_rte_index_bound : not tried
+[wp] Goal typed_add_assert_rte_mem_access : not tried
+[wp] Goal typed_add_assert_rte_index_bound_2 : not tried
+[wp] Goal typed_add_assert_rte_index_bound_3 : not tried
+[wp] Goal typed_add_assert_rte_index_bound_4 : not tried
+[wp] Goal typed_add_assert_rte_index_bound_5 : not tried
+[wp] Goal typed_add_assert_rte_mem_access_2 : not tried
+[wp] Goal typed_add_assert_rte_mem_access_3 : not tried
+[wp] Goal typed_add_assert_rte_index_bound_6 : not tried
+[wp] Goal typed_add_assert_rte_mem_access_4 : not tried
+[wp] Goal typed_add_assert_rte_mem_access_5 : not tried
+[wp] Goal typed_add_assert_rte_signed_overflow : not tried
+[wp] Goal typed_add_assert_rte_mem_access_6 : not tried
+[wp] Goal typed_add_assert_rte_mem_access_7 : not tried
+[wp] Goal typed_add_assert_rte_signed_overflow_2 : not tried
+[wp] Goal typed_add_assigns_exit : trivial
+[wp] Goal typed_add_assigns_normal_part1 : trivial
+[wp] Goal typed_add_assigns_normal_part2 : not tried
+[wp] Goal typed_add_assigns_normal_part3 : not tried
+[wp] Goal typed_add_assigns_normal_part4 : not tried
+[wp] Goal typed_add_assigns_normal_part5 : not tried
+[wp] Goal typed_add_assigns_normal_part6 : not tried
+[wp] Goal typed_add_assigns_normal_part7 : not tried
+[wp] Goal typed_add_assigns_normal_part8 : not tried
+[wp] Goal typed_add_assigns_normal_part9 : not tried
+[wp] Goal typed_add_call_hash_requires : not tried
+[wp] Goal typed_add_nominal_ensures : not tried
+[wp] Goal typed_add_nominal_ensures_2 : not tried
+[wp] Goal typed_add_nominal_ensures_3 : not tried
+[wp] Goal typed_add_nominal_ensures_4 : not tried
+[wp] Goal typed_add_nominal_ensures_5 : not tried
+[wp] Goal typed_add_nominal_assigns_exit : trivial
+[wp] Goal typed_add_nominal_assigns_normal_part1 : trivial
+[wp] Goal typed_add_nominal_assigns_normal_part2 : not tried
+[wp] Goal typed_add_nominal_assigns_normal_part3 : not tried
+[wp] Goal typed_add_nominal_assigns_normal_part4 : not tried
+[wp] Goal typed_add_nominal_assigns_normal_part5 : not tried
+[wp] Goal typed_add_nominal_assigns_normal_part6 : not tried
+[wp] Goal typed_add_nominal_assigns_normal_part7 : not tried
+[wp] Goal typed_add_nominal_assigns_normal_part8 : not tried
+[wp] Goal typed_add_nominal_assigns_normal_part9 : not tried
+[wp] Goal typed_add_full_ensures : not tried
+[wp] Goal typed_add_full_assigns_exit : trivial
+[wp] Goal typed_add_full_assigns_normal_part1 : trivial
+[wp] Goal typed_add_full_assigns_normal_part2 : not tried
+[wp] Goal typed_add_full_assigns_normal_part3 : not tried
+[wp] Goal typed_add_full_assigns_normal_part4 : not tried
+[wp] Goal typed_add_full_assigns_normal_part5 : not tried
+[wp] Goal typed_add_full_assigns_normal_part6 : not tried
+[wp] Goal typed_add_full_assigns_normal_part7 : not tried
+[wp] Goal typed_add_full_assigns_normal_part8 : not tried
+[wp] Goal typed_add_full_assigns_normal_part9 : not tried
+[wp] Goal typed_mem_binding_complete_found_not_found : not tried
+[wp] Goal typed_mem_binding_disjoint_found_not_found : not tried
 [wp] Goal typed_mem_binding_loop_invariant_preserved : not tried
 [wp] Goal typed_mem_binding_loop_invariant_established : not tried
 [wp] Goal typed_mem_binding_loop_invariant_2_preserved : not tried
@@ -149,6 +151,3 @@
 [wp] Goal typed_mem_binding_call_eq_string_requires_2 : not tried
 [wp] Goal typed_mem_binding_found_ensures : not tried
 [wp] Goal typed_mem_binding_not_found_ensures : not tried
-[wp] Goal typed_size_ensures : not tried
-[wp] Goal typed_size_assert_rte_mem_access : not tried
-[wp] Goal typed_size_assigns : not tried
diff --git a/src/plugins/wp/tests/wp_gallery/oracle/loop-statement.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/loop-statement.res.oracle
index 52b5a0ec02f3a5baff3c2969562156e94d7035b8..50da7d7cc9742dc4a67cbc33ad14e981cf8ba729 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle/loop-statement.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle/loop-statement.res.oracle
@@ -1,9 +1,12 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_gallery/loop-statement.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Goal typed_lemma_Lb : not tried
+[wp] Goal typed_loop_statement_requires_Scond : not tried
+[wp] Goal typed_loop_statement_ensures_Sbody : not tried
+[wp] Goal typed_loop_statement_assigns : trivial
+[wp] Goal typed_loop_statement_requires_Rinv : not tried
 [wp] Goal typed_loop_statement_ensures_Scond : not tried
 [wp] Goal typed_loop_statement_ensures_Sloop : not tried
 [wp] Goal typed_loop_statement_loop_invariant_Iloop_preserved : not tried
@@ -14,7 +17,3 @@
 [wp] Goal typed_loop_statement_assigns_2_exit_part2 : not tried
 [wp] Goal typed_loop_statement_assigns_2_normal_part1 : trivial
 [wp] Goal typed_loop_statement_assigns_2_normal_part2 : not tried
-[wp] Goal typed_loop_statement_requires_Rinv : not tried
-[wp] Goal typed_loop_statement_requires_Scond : not tried
-[wp] Goal typed_loop_statement_ensures_Sbody : not tried
-[wp] Goal typed_loop_statement_assigns : trivial
diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/binary-multiplication-without-overflow.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/binary-multiplication-without-overflow.res.oracle
index 0c30eb6cf12b6ad09707403db775ab3eea05fc4f..41402c7b8c2aef45ecafd2238c6896a462d04be1 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/binary-multiplication-without-overflow.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/binary-multiplication-without-overflow.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte -warn-unsigned-overflow [...]
 [kernel] Parsing tests/wp_gallery/binary-multiplication-without-overflow.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function BinaryMultiplication
 [wp] 16 goals scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_ax1_lack : Unsuccess
diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/binary-multiplication.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/binary-multiplication.res.oracle
index 92bfb254ae46eca98320c3de32493e1daf5d5130..c0a3091f89c5126ccf596644dbedb9dedd65dfbc 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/binary-multiplication.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/binary-multiplication.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp_gallery/binary-multiplication.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function BinaryMultiplication
 [wp] 17 goals scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_ax4_ok : Valid
diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/find.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/find.res.oracle
index c73a41611eb1f2a78315fc603a476714cb052c57..a081d0c388b7caff1c718d895bacd308dfeaf6aa 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/find.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/find.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_gallery/find.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 41 goals scheduled
 [wp] [Qed] Goal typed_find_complete_found_not_found : Valid
@@ -17,9 +16,9 @@
 [wp] [Qed] Goal typed_find_loop_assigns : Valid
 [wp] [Qed] Goal typed_find_loop_variant_decrease : Valid
 [wp] [Qed] Goal typed_find_loop_variant_positive : Valid
+[wp] [Alt-Ergo] Goal typed_find_not_found_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_find_found_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_find_found_ensures_2 : Valid
-[wp] [Alt-Ergo] Goal typed_find_not_found_ensures : Valid
 [wp] [Qed] Goal typed_find_ptr_complete_found_not_found : Valid
 [wp] [Qed] Goal typed_find_ptr_disjoint_found_not_found : Valid
 [wp] [Qed] Goal typed_find_ptr_ensures_Range : Valid
@@ -34,9 +33,9 @@
 [wp] [Qed] Goal typed_find_ptr_loop_assigns : Valid
 [wp] [Qed] Goal typed_find_ptr_loop_variant_decrease : Valid
 [wp] [Alt-Ergo] Goal typed_find_ptr_loop_variant_positive : Valid
+[wp] [Alt-Ergo] Goal typed_find_ptr_not_found_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_find_ptr_found_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_find_ptr_found_ensures_2 : Valid
-[wp] [Alt-Ergo] Goal typed_find_ptr_not_found_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_iter_ptr_ensures_Last : Valid
 [wp] [Alt-Ergo] Goal typed_iter_ptr_loop_invariant_Range_preserved : Valid
 [wp] [Alt-Ergo] Goal typed_iter_ptr_loop_invariant_Range_established : Valid
@@ -58,54 +57,13 @@
 [rte] annotating function find
 [rte] annotating function find_ptr
 [rte] annotating function iter_ptr
-[wp] 44 goals scheduled
-[wp] [Qed] Goal typed_find_complete_found_not_found : Valid
-[wp] [Qed] Goal typed_find_disjoint_found_not_found : Valid
-[wp] [Qed] Goal typed_find_ensures_Range : Valid
-[wp] [Qed] Goal typed_find_ensures_NoneBefore : Valid
-[wp] [Alt-Ergo] Goal typed_find_loop_invariant_NotFound_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_find_loop_invariant_NotFound_established : Valid
-[wp] [Alt-Ergo] Goal typed_find_loop_invariant_Range_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_find_loop_invariant_Range_established : Valid
-[wp] [Alt-Ergo] Goal typed_find_loop_invariant_Valid_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_find_loop_invariant_Valid_established : Valid
+[wp] 3 goals scheduled
 [wp] [Alt-Ergo] Goal typed_find_assert_rte_mem_access : Valid
 [wp] [Alt-Ergo] Goal typed_find_assert_rte_signed_overflow : Valid
-[wp] [Qed] Goal typed_find_loop_assigns : Valid
-[wp] [Qed] Goal typed_find_loop_variant_decrease : Valid
-[wp] [Qed] Goal typed_find_loop_variant_positive : Valid
-[wp] [Alt-Ergo] Goal typed_find_found_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_find_found_ensures_2 : Valid
-[wp] [Alt-Ergo] Goal typed_find_not_found_ensures : Valid
-[wp] [Qed] Goal typed_find_ptr_complete_found_not_found : Valid
-[wp] [Qed] Goal typed_find_ptr_disjoint_found_not_found : Valid
-[wp] [Qed] Goal typed_find_ptr_ensures_Range : Valid
-[wp] [Qed] Goal typed_find_ptr_ensures_NoneBefore : Valid
-[wp] [Alt-Ergo] Goal typed_find_ptr_loop_invariant_NotFound_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_find_ptr_loop_invariant_NotFound_established : Valid
-[wp] [Alt-Ergo] Goal typed_find_ptr_loop_invariant_Range_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_find_ptr_loop_invariant_Range_established : Valid
-[wp] [Alt-Ergo] Goal typed_find_ptr_loop_invariant_Valid_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_find_ptr_loop_invariant_Valid_established : Valid
 [wp] [Alt-Ergo] Goal typed_find_ptr_assert_rte_mem_access : Valid
-[wp] [Alt-Ergo] Goal typed_find_ptr_assert_Hack : Valid
-[wp] [Qed] Goal typed_find_ptr_loop_assigns : Valid
-[wp] [Qed] Goal typed_find_ptr_loop_variant_decrease : Valid
-[wp] [Alt-Ergo] Goal typed_find_ptr_loop_variant_positive : Valid
-[wp] [Alt-Ergo] Goal typed_find_ptr_found_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_find_ptr_found_ensures_2 : Valid
-[wp] [Alt-Ergo] Goal typed_find_ptr_not_found_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_iter_ptr_ensures_Last : Valid
-[wp] [Alt-Ergo] Goal typed_iter_ptr_loop_invariant_Range_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_iter_ptr_loop_invariant_Range_established : Valid
-[wp] [Alt-Ergo] Goal typed_iter_ptr_loop_invariant_Valid_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_iter_ptr_loop_invariant_Valid_established : Valid
-[wp] [Qed] Goal typed_iter_ptr_loop_assigns : Valid
-[wp] [Qed] Goal typed_iter_ptr_loop_variant_decrease : Valid
-[wp] [Alt-Ergo] Goal typed_iter_ptr_loop_variant_positive : Valid
-[wp] Proved goals:   29 / 44
+[wp] Proved goals:    3 / 3
   Qed:             0 
-  Alt-Ergo:       29
+  Alt-Ergo:        3
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   find                      7       11       18       100%
diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo1_solved.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo1_solved.res.oracle
index 6fc6f3615765398b4464cfd1bb1c76e601378d88..06ee2377636c52ca390ad6ed61e81275c8185c01 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo1_solved.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo1_solved.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_gallery/frama_c_exo1_solved.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 10 goals scheduled
 [wp] [Alt-Ergo] Goal typed_exo1_ensures : Valid
@@ -23,25 +22,15 @@
 ------------------------------------------------------------
 [wp] Running WP plugin...
 [rte] annotating function exo1
-[wp] 15 goals scheduled
-[wp] [Alt-Ergo] Goal typed_exo1_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_exo1_ensures_2 : Valid
+[wp] 5 goals scheduled
 [wp] [Alt-Ergo] Goal typed_exo1_assert_rte_signed_overflow : Valid
-[wp] [Alt-Ergo] Goal typed_exo1_loop_invariant_preserved : Valid
-[wp] [Qed] Goal typed_exo1_loop_invariant_established : Valid
-[wp] [Alt-Ergo] Goal typed_exo1_loop_invariant_2_preserved : Valid
-[wp] [Qed] Goal typed_exo1_loop_invariant_2_established : Valid
 [wp] [Alt-Ergo] Goal typed_exo1_assert_rte_mem_access : Valid
 [wp] [Alt-Ergo] Goal typed_exo1_assert_rte_mem_access_2 : Valid
 [wp] [Alt-Ergo] Goal typed_exo1_assert_rte_signed_overflow_2 : Valid
 [wp] [Alt-Ergo] Goal typed_exo1_assert_rte_signed_overflow_3 : Valid
-[wp] [Qed] Goal typed_exo1_loop_assigns : Valid
-[wp] [Qed] Goal typed_exo1_assigns : Valid
-[wp] [Qed] Goal typed_exo1_loop_variant_decrease : Valid
-[wp] [Qed] Goal typed_exo1_loop_variant_positive : Valid
-[wp] Proved goals:    9 / 15
+[wp] Proved goals:    5 / 5
   Qed:             0 
-  Alt-Ergo:        9
+  Alt-Ergo:        5
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   exo1                      6        9       15       100%
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 bd27fc933298b8c30d36296a12b78436c804e32e..1780ec5c89a9b45027afa30b5a132043047e4271 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_gallery/frama_c_exo2_solved.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 22 goals scheduled
 [wp] [Alt-Ergo] Goal typed_max_subarray_ensures : Valid
@@ -35,33 +34,11 @@
 ------------------------------------------------------------
 [wp] Running WP plugin...
 [rte] annotating function max_subarray
-[wp] 23 goals scheduled
-[wp] [Alt-Ergo] Goal typed_max_subarray_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_max_subarray_ensures_2 : Valid
-[wp] [Alt-Ergo] Goal typed_max_subarray_loop_invariant_preserved : Valid
-[wp] [Qed] Goal typed_max_subarray_loop_invariant_established : Valid
-[wp] [Alt-Ergo] Goal typed_max_subarray_loop_invariant_2_preserved : Valid
-[wp] [Qed] Goal typed_max_subarray_loop_invariant_2_established : Valid
-[wp] [Alt-Ergo] Goal typed_max_subarray_loop_invariant_3_preserved : Valid
-[wp] [Qed] Goal typed_max_subarray_loop_invariant_3_established : Valid
-[wp] [Qed] Goal typed_max_subarray_loop_invariant_4_preserved : Valid
-[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] [Alt-Ergo] Goal typed_max_subarray_loop_invariant_7_preserved : Valid
-[wp] [Alt-Ergo] 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] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_max_subarray_assert_rte_mem_access : Valid
-[wp] [Qed] Goal typed_max_subarray_loop_assigns : Valid
-[wp] [Qed] Goal typed_max_subarray_assigns : Valid
-[wp] [Qed] Goal typed_max_subarray_loop_variant_decrease : Valid
-[wp] [Qed] Goal typed_max_subarray_loop_variant_positive : Valid
-[wp] Proved goals:   14 / 23
+[wp] Proved goals:    1 / 1
   Qed:             0 
-  Alt-Ergo:       14
+  Alt-Ergo:        1
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   max_subarray              9       14       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 56be9acc1dbb068d766b2e7c67dddfb01ae5a727..e75ffe7ec64e8d454c01d3b2497ea7e10bd7e9c7 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
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_gallery/frama_c_exo3_solved.old.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 34 goals scheduled
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_ensures : Valid
@@ -48,42 +47,19 @@
 [wp] Warning: Memory model hypotheses for function 'equal_elements':
   /*@
      behavior typed_ref:
-     requires \separated(v1,v2,a+(..));
-     requires \valid(v1);
-     requires \valid(v2);
+       requires \separated(v1, v2, a + (..));
+       requires \valid(v1);
+       requires \valid(v2);
      */
   void equal_elements(int *a, int *v1, int *v2);
 [wp] Running WP plugin...
 [rte] annotating function equal_elements
-[wp] 50 goals scheduled
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_ensures_2 : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_ensures_3 : Valid
+[wp] 16 goals scheduled
 [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_mem_access : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_mem_access_2 : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_preserved : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_established : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_2_preserved : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_2_established : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_index_bound : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_index_bound_2 : Valid
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_assert_rte_signed_overflow : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_3_preserved : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_3_established : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_4_preserved : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_4_established : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_5_preserved : Valid
-[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_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
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_9_preserved : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_9_established : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_10_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_10_established : Valid
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_assert_rte_mem_access_3 : Valid
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_assert_rte_index_bound_3 : Valid
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_assert_rte_index_bound_4 : Valid
@@ -92,23 +68,12 @@
 [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_mem_access_6 : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_mem_access_7 : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_mem_access_8 : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_assert : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_index_bound_5 : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_index_bound_6 : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_assert_2 : Valid
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_assert_rte_signed_overflow_2 : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_assigns : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_assigns_2 : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_assigns_part1 : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_assigns_part2 : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_assigns_part3 : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_variant_decrease : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_variant_positive : Valid
-[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:   32 / 50
+[wp] Proved goals:   16 / 16
   Qed:            11 
-  Alt-Ergo:       21
+  Alt-Ergo:        5
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   equal_elements           29       21       50       100%
@@ -116,8 +81,8 @@
 [wp] Warning: Memory model hypotheses for function 'equal_elements':
   /*@
      behavior typed_ref:
-     requires \separated(v1,v2,a+(..));
-     requires \valid(v1);
-     requires \valid(v2);
+       requires \separated(v1, v2, a + (..));
+       requires \valid(v1);
+       requires \valid(v2);
      */
   void equal_elements(int *a, int *v1, int *v2);
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 0d2cb66d920886acaab8d67242ea56cb9bd5b2f9..7672a505bc9fa5d57e9cd506b0e0b2ed7d01591d 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
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_gallery/frama_c_exo3_solved.old.v2.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 35 goals scheduled
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_ensures_v1_good : Valid
@@ -49,45 +48,19 @@
 [wp] Warning: Memory model hypotheses for function 'equal_elements':
   /*@
      behavior typed_ref:
-     requires \separated(v1,v2,a+(..));
-     requires \valid(v1);
-     requires \valid(v2);
+       requires \separated(v1, v2, a + (..));
+       requires \valid(v1);
+       requires \valid(v2);
      */
   void equal_elements(int *a, int *v1, int *v2);
 [wp] Running WP plugin...
 [rte] annotating function equal_elements
-[wp] 51 goals scheduled
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_ensures_v1_good : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_ensures_v2_good : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_ensures_v1_v2_diff : Valid
+[wp] 16 goals scheduled
 [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_mem_access : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_mem_access_2 : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_preserved : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_established : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_set_at_0_preserved : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_set_at_0_established : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_index_bound : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_index_bound_2 : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_assert_set_at_1 : Valid
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_assert_rte_signed_overflow : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_bound_preserved : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_bound_established : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_seen_sound1_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_seen_sound1_established : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_seen_sound2_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_seen_sound2_established : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_v1_first_preserved : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_invariant_v1_first_established : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_v1_sound1_preserved : Valid
-[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_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
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_v2_sound2_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_ref_equal_elements_loop_invariant_v2_sound2_established : Valid
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_assert_rte_mem_access_3 : Valid
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_assert_rte_index_bound_3 : Valid
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_assert_rte_index_bound_4 : Valid
@@ -99,18 +72,9 @@
 [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_index_bound_5 : Valid
 [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_index_bound_6 : Valid
 [wp] [Alt-Ergo] Goal typed_ref_equal_elements_assert_rte_signed_overflow_2 : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_assigns : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_assigns_2 : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_assigns_part1 : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_assigns_part2 : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_assigns_part3 : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_variant_decrease : Valid
-[wp] [Qed] Goal typed_ref_equal_elements_loop_variant_positive : Valid
-[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 / 51
+[wp] Proved goals:   16 / 16
   Qed:            11 
-  Alt-Ergo:       23
+  Alt-Ergo:        5
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   equal_elements           28       23       51       100%
@@ -118,8 +82,8 @@
 [wp] Warning: Memory model hypotheses for function 'equal_elements':
   /*@
      behavior typed_ref:
-     requires \separated(v1,v2,a+(..));
-     requires \valid(v1);
-     requires \valid(v2);
+       requires \separated(v1, v2, a + (..));
+       requires \valid(v1);
+       requires \valid(v2);
      */
   void equal_elements(int *a, int *v1, int *v2);
diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.simplified.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.simplified.res.oracle
index af7f5f6418ea9b26d2ac9e28f26e2506c2a0aaa8..72409b7f36cfd6816e0e20df25e04071390908b1 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.simplified.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.simplified.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_gallery/frama_c_exo3_solved.simplified.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 26 goals scheduled
 [wp] [Qed] Goal typed_pair_complete_has_pair_no_pair : Valid
@@ -28,8 +27,8 @@
 [wp] [Qed] Goal typed_pair_loop_variant_positive : Valid
 [wp] [Qed] Goal typed_pair_loop_variant_2_decrease : Valid
 [wp] [Qed] Goal typed_pair_loop_variant_2_positive : Valid
-[wp] [Alt-Ergo] Goal typed_pair_has_pair_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_pair_no_pair_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_pair_has_pair_ensures : Valid
 [wp] Proved goals:   26 / 26
   Qed:            16 
   Alt-Ergo:       10
@@ -39,45 +38,19 @@
 ------------------------------------------------------------
 [wp] Running WP plugin...
 [rte] annotating function pair
-[wp] 35 goals scheduled
-[wp] [Qed] Goal typed_pair_complete_has_pair_no_pair : Valid
-[wp] [Qed] Goal typed_pair_disjoint_has_pair_no_pair : Valid
-[wp] [Alt-Ergo] Goal typed_pair_loop_invariant_preserved : Valid
-[wp] [Qed] Goal typed_pair_loop_invariant_established : Valid
-[wp] [Alt-Ergo] Goal typed_pair_loop_invariant_2_preserved : Valid
-[wp] [Qed] Goal typed_pair_loop_invariant_2_established : Valid
+[wp] 9 goals scheduled
 [wp] [Qed] Goal typed_pair_assert_rte_index_bound : Valid
 [wp] [Qed] Goal typed_pair_assert_rte_index_bound_2 : Valid
 [wp] [Alt-Ergo] Goal typed_pair_assert_rte_signed_overflow : Valid
-[wp] [Alt-Ergo] Goal typed_pair_loop_invariant_3_preserved : Valid
-[wp] [Qed] Goal typed_pair_loop_invariant_3_established : Valid
-[wp] [Alt-Ergo] Goal typed_pair_loop_invariant_4_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_pair_loop_invariant_4_established : Valid
-[wp] [Alt-Ergo] Goal typed_pair_loop_invariant_5_preserved : Valid
-[wp] [Qed] Goal typed_pair_loop_invariant_5_established : Valid
-[wp] [Alt-Ergo] Goal typed_pair_loop_invariant_6_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_pair_loop_invariant_6_established : Valid
 [wp] [Alt-Ergo] Goal typed_pair_assert_rte_mem_access : Valid
 [wp] [Alt-Ergo] Goal typed_pair_assert_rte_index_bound_3 : Valid
 [wp] [Alt-Ergo] Goal typed_pair_assert_rte_index_bound_4 : Valid
 [wp] [Qed] Goal typed_pair_assert_rte_index_bound_5 : Valid
 [wp] [Qed] Goal typed_pair_assert_rte_index_bound_6 : Valid
 [wp] [Alt-Ergo] Goal typed_pair_assert_rte_signed_overflow_2 : Valid
-[wp] [Qed] Goal typed_pair_loop_assigns : Valid
-[wp] [Qed] Goal typed_pair_loop_assigns_2 : Valid
-[wp] [Qed] Goal typed_pair_assigns_part1 : Valid
-[wp] [Qed] Goal typed_pair_assigns_part2 : Valid
-[wp] [Qed] Goal typed_pair_assigns_part3 : Valid
-[wp] [Qed] Goal typed_pair_assigns_part4 : Valid
-[wp] [Qed] Goal typed_pair_loop_variant_decrease : Valid
-[wp] [Qed] Goal typed_pair_loop_variant_positive : Valid
-[wp] [Qed] Goal typed_pair_loop_variant_2_decrease : Valid
-[wp] [Qed] Goal typed_pair_loop_variant_2_positive : Valid
-[wp] [Alt-Ergo] Goal typed_pair_has_pair_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_pair_no_pair_ensures : Valid
-[wp] Proved goals:   19 / 35
+[wp] Proved goals:    9 / 9
   Qed:             4 
-  Alt-Ergo:       15
+  Alt-Ergo:        5
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   pair                     20       15       35       100%
diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_hashtbl_solved.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_hashtbl_solved.res.oracle
index 8e5320587c9157e2971dc28f9078d3d860dbfd28..b9066d9921a764ee6e240b742d1f8f5c6387d265 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_hashtbl_solved.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_hashtbl_solved.res.oracle
@@ -1,50 +1,10 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_gallery/frama_c_hashtbl_solved.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 102 goals scheduled
-[wp] [Alt-Ergo] Goal typed_add_complete_full_nominal : Valid
-[wp] [Alt-Ergo] Goal typed_add_disjoint_full_nominal : Valid
-[wp] [Qed] Goal typed_add_assigns_exit : Valid
-[wp] [Qed] Goal typed_add_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_add_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_add_assigns_normal_part3 : Valid
-[wp] [Qed] Goal typed_add_assigns_normal_part4 : Valid
-[wp] [Qed] Goal typed_add_assigns_normal_part5 : Valid
-[wp] [Alt-Ergo] Goal typed_add_assigns_normal_part6 : Valid
-[wp] [Alt-Ergo] Goal typed_add_assigns_normal_part7 : Valid
-[wp] [Qed] Goal typed_add_assigns_normal_part8 : Valid
-[wp] [Qed] Goal typed_add_assigns_normal_part9 : Valid
-[wp] [Qed] Goal typed_add_call_hash_requires : Valid
-[wp] [Alt-Ergo] Goal typed_add_full_ensures : Valid
-[wp] [Qed] Goal typed_add_full_assigns_exit : Valid
-[wp] [Qed] Goal typed_add_full_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_add_full_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_add_full_assigns_normal_part3 : Valid
-[wp] [Qed] Goal typed_add_full_assigns_normal_part4 : Valid
-[wp] [Qed] Goal typed_add_full_assigns_normal_part5 : Valid
-[wp] [Alt-Ergo] Goal typed_add_full_assigns_normal_part6 : Valid
-[wp] [Alt-Ergo] Goal typed_add_full_assigns_normal_part7 : Valid
-[wp] [Alt-Ergo] Goal typed_add_full_assigns_normal_part8 : Valid
-[wp] [Qed] Goal typed_add_full_assigns_normal_part9 : Valid
-[wp] [Alt-Ergo] Goal typed_add_nominal_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_add_nominal_ensures_2 : Valid
-[wp] [Alt-Ergo] Goal typed_add_nominal_ensures_3 : Valid
-[wp] [Alt-Ergo] Goal typed_add_nominal_ensures_4 : Valid
-[wp] [Alt-Ergo] Goal typed_add_nominal_ensures_5 : Valid
-[wp] [Qed] Goal typed_add_nominal_assigns_exit : Valid
-[wp] [Qed] Goal typed_add_nominal_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_add_nominal_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_add_nominal_assigns_normal_part3 : Valid
-[wp] [Qed] Goal typed_add_nominal_assigns_normal_part4 : Valid
-[wp] [Qed] Goal typed_add_nominal_assigns_normal_part5 : Valid
-[wp] [Alt-Ergo] Goal typed_add_nominal_assigns_normal_part6 : Valid
-[wp] [Alt-Ergo] Goal typed_add_nominal_assigns_normal_part7 : Valid
-[wp] [Qed] Goal typed_add_nominal_assigns_normal_part8 : Valid
-[wp] [Qed] Goal typed_add_nominal_assigns_normal_part9 : Valid
-[wp] [Qed] Goal typed_eq_string_complete_not_eq_eq : Valid
-[wp] [Qed] Goal typed_eq_string_disjoint_not_eq_eq : Valid
+[wp] [Qed] Goal typed_eq_string_complete_eq_not_eq : Valid
+[wp] [Qed] Goal typed_eq_string_disjoint_eq_not_eq : Valid
 [wp] [Alt-Ergo] Goal typed_eq_string_loop_invariant_preserved : Valid
 [wp] [Qed] Goal typed_eq_string_loop_invariant_established : Valid
 [wp] [Alt-Ergo] Goal typed_eq_string_loop_invariant_2_preserved : Valid
@@ -65,6 +25,8 @@
 [wp] [Qed] Goal typed_hash_assigns_part2 : Valid
 [wp] [Qed] Goal typed_hash_loop_variant_decrease : Valid
 [wp] [Qed] Goal typed_hash_loop_variant_positive : Valid
+[wp] [Qed] Goal typed_size_ensures : Valid
+[wp] [Qed] Goal typed_size_assigns : Valid
 [wp] [Alt-Ergo] Goal typed_init_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_init_ensures_2 : Valid
 [wp] [Alt-Ergo] Goal typed_init_loop_invariant_preserved : Valid
@@ -78,8 +40,47 @@
 [wp] [Script] Goal typed_init_assigns_part3 : Valid
 [wp] [Qed] Goal typed_init_loop_variant_decrease : Valid
 [wp] [Qed] Goal typed_init_loop_variant_positive : Valid
-[wp] [Alt-Ergo] Goal typed_mem_binding_complete_not_found_found : Valid
-[wp] [Alt-Ergo] Goal typed_mem_binding_disjoint_not_found_found : Valid
+[wp] [Alt-Ergo] Goal typed_add_complete_full_nominal : Valid
+[wp] [Alt-Ergo] Goal typed_add_disjoint_full_nominal : Valid
+[wp] [Qed] Goal typed_add_assigns_exit : Valid
+[wp] [Qed] Goal typed_add_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_add_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_add_assigns_normal_part3 : Valid
+[wp] [Qed] Goal typed_add_assigns_normal_part4 : Valid
+[wp] [Qed] Goal typed_add_assigns_normal_part5 : Valid
+[wp] [Alt-Ergo] Goal typed_add_assigns_normal_part6 : Valid
+[wp] [Alt-Ergo] Goal typed_add_assigns_normal_part7 : Valid
+[wp] [Qed] Goal typed_add_assigns_normal_part8 : Valid
+[wp] [Qed] Goal typed_add_assigns_normal_part9 : Valid
+[wp] [Qed] Goal typed_add_call_hash_requires : Valid
+[wp] [Alt-Ergo] Goal typed_add_nominal_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_add_nominal_ensures_2 : Valid
+[wp] [Alt-Ergo] Goal typed_add_nominal_ensures_3 : Valid
+[wp] [Alt-Ergo] Goal typed_add_nominal_ensures_4 : Valid
+[wp] [Alt-Ergo] Goal typed_add_nominal_ensures_5 : Valid
+[wp] [Qed] Goal typed_add_nominal_assigns_exit : Valid
+[wp] [Qed] Goal typed_add_nominal_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_add_nominal_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_add_nominal_assigns_normal_part3 : Valid
+[wp] [Qed] Goal typed_add_nominal_assigns_normal_part4 : Valid
+[wp] [Qed] Goal typed_add_nominal_assigns_normal_part5 : Valid
+[wp] [Alt-Ergo] Goal typed_add_nominal_assigns_normal_part6 : Valid
+[wp] [Alt-Ergo] Goal typed_add_nominal_assigns_normal_part7 : Valid
+[wp] [Qed] Goal typed_add_nominal_assigns_normal_part8 : Valid
+[wp] [Qed] Goal typed_add_nominal_assigns_normal_part9 : Valid
+[wp] [Alt-Ergo] Goal typed_add_full_ensures : Valid
+[wp] [Qed] Goal typed_add_full_assigns_exit : Valid
+[wp] [Qed] Goal typed_add_full_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_add_full_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_add_full_assigns_normal_part3 : Valid
+[wp] [Qed] Goal typed_add_full_assigns_normal_part4 : Valid
+[wp] [Qed] Goal typed_add_full_assigns_normal_part5 : Valid
+[wp] [Alt-Ergo] Goal typed_add_full_assigns_normal_part6 : Valid
+[wp] [Alt-Ergo] Goal typed_add_full_assigns_normal_part7 : Valid
+[wp] [Alt-Ergo] Goal typed_add_full_assigns_normal_part8 : Valid
+[wp] [Qed] Goal typed_add_full_assigns_normal_part9 : Valid
+[wp] [Alt-Ergo] Goal typed_mem_binding_complete_found_not_found : Valid
+[wp] [Alt-Ergo] Goal typed_mem_binding_disjoint_found_not_found : Valid
 [wp] [Alt-Ergo] Goal typed_mem_binding_loop_invariant_preserved : Valid
 [wp] [Alt-Ergo] Goal typed_mem_binding_loop_invariant_established : Valid
 [wp] [Alt-Ergo] Goal typed_mem_binding_loop_invariant_2_preserved : Valid
@@ -104,8 +105,6 @@
 [wp] [Alt-Ergo] Goal typed_mem_binding_call_eq_string_requires_2 : Valid
 [wp] [Alt-Ergo] Goal typed_mem_binding_found_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_mem_binding_not_found_ensures : Valid
-[wp] [Qed] Goal typed_size_ensures : Valid
-[wp] [Qed] Goal typed_size_assigns : Valid
 [wp] Proved goals:  102 / 102
   Qed:            69 
   Script:          1 
@@ -126,9 +125,19 @@
 [rte] annotating function init
 [rte] annotating function mem_binding
 [rte] annotating function size
-[wp] 143 goals scheduled
-[wp] [Alt-Ergo] Goal typed_add_complete_full_nominal : Valid
-[wp] [Alt-Ergo] Goal typed_add_disjoint_full_nominal : Valid
+[wp] 41 goals scheduled
+[wp] [Alt-Ergo] Goal typed_eq_string_assert_rte_mem_access : Valid
+[wp] [Alt-Ergo] Goal typed_eq_string_assert_rte_mem_access_2 : Valid
+[wp] [Alt-Ergo] Goal typed_eq_string_assert_rte_signed_overflow : Valid
+[wp] [Alt-Ergo] Goal typed_hash_assert_rte_mem_access : Valid
+[wp] [Qed] Goal typed_hash_assert_rte_mem_access_2 : Valid
+[wp] [Alt-Ergo] Goal typed_hash_assert_rte_signed_overflow : Valid
+[wp] [Alt-Ergo] Goal typed_size_assert_rte_mem_access : Valid
+[wp] [Alt-Ergo] Goal typed_init_assert_rte_mem_access : Valid
+[wp] [Qed] Goal typed_init_assert_rte_index_bound : Valid
+[wp] [Qed] Goal typed_init_assert_rte_index_bound_2 : Valid
+[wp] [Alt-Ergo] Goal typed_init_assert_rte_mem_access_2 : Valid
+[wp] [Alt-Ergo] Goal typed_init_assert_rte_signed_overflow : Valid
 [wp] [Alt-Ergo] Goal typed_add_assert_rte_index_bound : Valid
 [wp] [Alt-Ergo] Goal typed_add_assert_rte_mem_access : Valid
 [wp] [Qed] Goal typed_add_assert_rte_index_bound_2 : Valid
@@ -144,95 +153,6 @@
 [wp] [Alt-Ergo] Goal typed_add_assert_rte_mem_access_6 : Valid
 [wp] [Alt-Ergo] Goal typed_add_assert_rte_mem_access_7 : Valid
 [wp] [Alt-Ergo] Goal typed_add_assert_rte_signed_overflow_2 : Valid
-[wp] [Qed] Goal typed_add_assigns_exit : Valid
-[wp] [Qed] Goal typed_add_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_add_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_add_assigns_normal_part3 : Valid
-[wp] [Qed] Goal typed_add_assigns_normal_part4 : Valid
-[wp] [Qed] Goal typed_add_assigns_normal_part5 : Valid
-[wp] [Alt-Ergo] Goal typed_add_assigns_normal_part6 : Valid
-[wp] [Alt-Ergo] Goal typed_add_assigns_normal_part7 : Valid
-[wp] [Qed] Goal typed_add_assigns_normal_part8 : Valid
-[wp] [Qed] Goal typed_add_assigns_normal_part9 : Valid
-[wp] [Qed] Goal typed_add_call_hash_requires : Valid
-[wp] [Alt-Ergo] Goal typed_add_full_ensures : Valid
-[wp] [Qed] Goal typed_add_full_assigns_exit : Valid
-[wp] [Qed] Goal typed_add_full_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_add_full_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_add_full_assigns_normal_part3 : Valid
-[wp] [Qed] Goal typed_add_full_assigns_normal_part4 : Valid
-[wp] [Qed] Goal typed_add_full_assigns_normal_part5 : Valid
-[wp] [Alt-Ergo] Goal typed_add_full_assigns_normal_part6 : Valid
-[wp] [Alt-Ergo] Goal typed_add_full_assigns_normal_part7 : Valid
-[wp] [Alt-Ergo] Goal typed_add_full_assigns_normal_part8 : Valid
-[wp] [Qed] Goal typed_add_full_assigns_normal_part9 : Valid
-[wp] [Alt-Ergo] Goal typed_add_nominal_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_add_nominal_ensures_2 : Valid
-[wp] [Alt-Ergo] Goal typed_add_nominal_ensures_3 : Valid
-[wp] [Alt-Ergo] Goal typed_add_nominal_ensures_4 : Valid
-[wp] [Alt-Ergo] Goal typed_add_nominal_ensures_5 : Valid
-[wp] [Qed] Goal typed_add_nominal_assigns_exit : Valid
-[wp] [Qed] Goal typed_add_nominal_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_add_nominal_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_add_nominal_assigns_normal_part3 : Valid
-[wp] [Qed] Goal typed_add_nominal_assigns_normal_part4 : Valid
-[wp] [Qed] Goal typed_add_nominal_assigns_normal_part5 : Valid
-[wp] [Alt-Ergo] Goal typed_add_nominal_assigns_normal_part6 : Valid
-[wp] [Alt-Ergo] Goal typed_add_nominal_assigns_normal_part7 : Valid
-[wp] [Qed] Goal typed_add_nominal_assigns_normal_part8 : Valid
-[wp] [Qed] Goal typed_add_nominal_assigns_normal_part9 : Valid
-[wp] [Qed] Goal typed_eq_string_complete_not_eq_eq : Valid
-[wp] [Qed] Goal typed_eq_string_disjoint_not_eq_eq : Valid
-[wp] [Alt-Ergo] Goal typed_eq_string_loop_invariant_preserved : Valid
-[wp] [Qed] Goal typed_eq_string_loop_invariant_established : Valid
-[wp] [Alt-Ergo] Goal typed_eq_string_loop_invariant_2_preserved : Valid
-[wp] [Qed] Goal typed_eq_string_loop_invariant_2_established : Valid
-[wp] [Alt-Ergo] Goal typed_eq_string_assert_rte_mem_access : Valid
-[wp] [Alt-Ergo] Goal typed_eq_string_assert_rte_mem_access_2 : Valid
-[wp] [Alt-Ergo] Goal typed_eq_string_assert_rte_signed_overflow : Valid
-[wp] [Qed] Goal typed_eq_string_loop_assigns : Valid
-[wp] [Qed] Goal typed_eq_string_assigns_part1 : Valid
-[wp] [Qed] Goal typed_eq_string_assigns_part2 : Valid
-[wp] [Qed] Goal typed_eq_string_assigns_part3 : Valid
-[wp] [Qed] Goal typed_eq_string_assigns_part4 : Valid
-[wp] [Qed] Goal typed_eq_string_loop_variant_decrease : Valid
-[wp] [Qed] Goal typed_eq_string_loop_variant_positive : Valid
-[wp] [Alt-Ergo] Goal typed_eq_string_eq_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_eq_string_not_eq_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_hash_loop_invariant_preserved : Valid
-[wp] [Qed] Goal typed_hash_loop_invariant_established : Valid
-[wp] [Alt-Ergo] Goal typed_hash_assert_rte_mem_access : Valid
-[wp] [Qed] Goal typed_hash_assert_rte_mem_access_2 : Valid
-[wp] [Alt-Ergo] Goal typed_hash_assert_rte_signed_overflow : Valid
-[wp] [Qed] Goal typed_hash_loop_assigns : Valid
-[wp] [Qed] Goal typed_hash_assigns_part1 : Valid
-[wp] [Qed] Goal typed_hash_assigns_part2 : Valid
-[wp] [Qed] Goal typed_hash_loop_variant_decrease : Valid
-[wp] [Qed] Goal typed_hash_loop_variant_positive : Valid
-[wp] [Alt-Ergo] Goal typed_init_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_init_ensures_2 : Valid
-[wp] [Alt-Ergo] Goal typed_init_assert_rte_mem_access : Valid
-[wp] [Alt-Ergo] Goal typed_init_loop_invariant_preserved : Valid
-[wp] [Qed] Goal typed_init_loop_invariant_established : Valid
-[wp] [Alt-Ergo] Goal typed_init_loop_invariant_2_preserved : Valid
-[wp] [Qed] Goal typed_init_loop_invariant_2_established : Valid
-[wp] [Qed] Goal typed_init_assert_rte_index_bound : Valid
-[wp] [Qed] Goal typed_init_assert_rte_index_bound_2 : Valid
-[wp] [Alt-Ergo] Goal typed_init_assert_rte_mem_access_2 : Valid
-[wp] [Alt-Ergo] Goal typed_init_assert_rte_signed_overflow : Valid
-[wp] [Qed] Goal typed_init_loop_assigns_part1 : Valid
-[wp] [Qed] Goal typed_init_loop_assigns_part2 : Valid
-[wp] [Qed] Goal typed_init_assigns_part1 : Valid
-[wp] [Qed] Goal typed_init_assigns_part2 : Valid
-[wp] [Script] Goal typed_init_assigns_part3 : Valid
-[wp] [Qed] Goal typed_init_loop_variant_decrease : Valid
-[wp] [Qed] Goal typed_init_loop_variant_positive : Valid
-[wp] [Alt-Ergo] Goal typed_mem_binding_complete_not_found_found : Valid
-[wp] [Alt-Ergo] Goal typed_mem_binding_disjoint_not_found_found : Valid
-[wp] [Alt-Ergo] Goal typed_mem_binding_loop_invariant_preserved : Valid
-[wp] [Alt-Ergo] Goal typed_mem_binding_loop_invariant_established : Valid
-[wp] [Alt-Ergo] Goal typed_mem_binding_loop_invariant_2_preserved : Valid
-[wp] [Qed] Goal typed_mem_binding_loop_invariant_2_established : Valid
 [wp] [Alt-Ergo] Goal typed_mem_binding_assert_rte_index_bound : Valid
 [wp] [Alt-Ergo] Goal typed_mem_binding_assert_rte_index_bound_2 : Valid
 [wp] [Alt-Ergo] Goal typed_mem_binding_assert_rte_mem_access : Valid
@@ -247,33 +167,9 @@
 [wp] [Qed] Goal typed_mem_binding_assert_rte_index_bound_10 : Valid
 [wp] [Alt-Ergo] Goal typed_mem_binding_assert_rte_mem_access_3 : Valid
 [wp] [Alt-Ergo] Goal typed_mem_binding_assert_rte_signed_overflow : Valid
-[wp] [Qed] Goal typed_mem_binding_loop_assigns_part1 : Valid
-[wp] [Qed] Goal typed_mem_binding_loop_assigns_part2 : Valid
-[wp] [Qed] Goal typed_mem_binding_assigns_exit_part1 : Valid
-[wp] [Qed] Goal typed_mem_binding_assigns_exit_part2 : Valid
-[wp] [Qed] Goal typed_mem_binding_assigns_exit_part3 : Valid
-[wp] [Qed] Goal typed_mem_binding_assigns_exit_part4 : Valid
-[wp] [Qed] Goal typed_mem_binding_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_mem_binding_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_mem_binding_assigns_normal_part3 : Valid
-[wp] [Qed] Goal typed_mem_binding_assigns_normal_part4 : Valid
-[wp] [Qed] Goal typed_mem_binding_assigns_normal_part5 : Valid
-[wp] [Qed] Goal typed_mem_binding_assigns_normal_part6 : Valid
-[wp] [Qed] Goal typed_mem_binding_assigns_normal_part7 : Valid
-[wp] [Qed] Goal typed_mem_binding_loop_variant_decrease : Valid
-[wp] [Qed] Goal typed_mem_binding_loop_variant_positive : Valid
-[wp] [Qed] Goal typed_mem_binding_call_hash_requires : Valid
-[wp] [Qed] Goal typed_mem_binding_call_eq_string_requires : Valid
-[wp] [Alt-Ergo] Goal typed_mem_binding_call_eq_string_requires_2 : Valid
-[wp] [Alt-Ergo] Goal typed_mem_binding_found_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_mem_binding_not_found_ensures : Valid
-[wp] [Qed] Goal typed_size_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_size_assert_rte_mem_access : Valid
-[wp] [Qed] Goal typed_size_assigns : Valid
-[wp] Proved goals:   74 / 143
+[wp] Proved goals:   41 / 41
   Qed:            16 
-  Script:          1 
-  Alt-Ergo:       57
+  Alt-Ergo:       25
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   eq_string                11        7       18       100%
diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/loop-statement.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/loop-statement.res.oracle
index 206278a5b0a23cd6942e67585a952e8c0aaf3c30..8f26f5372756daf4fdba29baeba2f1f8ad2d43eb 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/loop-statement.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/loop-statement.res.oracle
@@ -1,10 +1,13 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_gallery/loop-statement.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 15 goals scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_Lb : Valid
+[wp] [Qed] Goal typed_loop_statement_requires_Scond : Valid
+[wp] [Qed] Goal typed_loop_statement_ensures_Sbody : Valid
+[wp] [Qed] Goal typed_loop_statement_assigns : Valid
+[wp] [Alt-Ergo] Goal typed_loop_statement_requires_Rinv : Valid
 [wp] [Qed] Goal typed_loop_statement_ensures_Scond : Valid
 [wp] [Qed] Goal typed_loop_statement_ensures_Sloop : Valid
 [wp] [Alt-Ergo] Goal typed_loop_statement_loop_invariant_Iloop_preserved : Valid
@@ -15,10 +18,6 @@
 [wp] [Qed] Goal typed_loop_statement_assigns_2_exit_part2 : Valid
 [wp] [Qed] Goal typed_loop_statement_assigns_2_normal_part1 : Valid
 [wp] [Qed] Goal typed_loop_statement_assigns_2_normal_part2 : Valid
-[wp] [Alt-Ergo] Goal typed_loop_statement_requires_Rinv : Valid
-[wp] [Qed] Goal typed_loop_statement_requires_Scond : Valid
-[wp] [Qed] Goal typed_loop_statement_ensures_Sbody : Valid
-[wp] [Qed] Goal typed_loop_statement_assigns : Valid
 [wp] Proved goals:   15 / 15
   Qed:            11 
   Alt-Ergo:        4
diff --git a/src/plugins/wp/tests/wp_hoare/alias_assigns_hypotheses.i b/src/plugins/wp/tests/wp_hoare/alias_assigns_hypotheses.i
new file mode 100644
index 0000000000000000000000000000000000000000..d92187251b3139329c7f1f93a37bd33bc2f19656
--- /dev/null
+++ b/src/plugins/wp/tests/wp_hoare/alias_assigns_hypotheses.i
@@ -0,0 +1,104 @@
+/* run.config
+   OPT:
+   OPT:-wp-no-warn-memory-model -wp-check-model-hypotheses -then -print
+*/
+
+/* run.config_qualif
+	 DONT_RUN:
+*/
+
+int global[1];
+int *g_alias;
+
+/*@ requires \valid(g_alias);
+    assigns *g_alias;
+    ensures *g_alias == 1;
+    ensures \old(global[0]) == global[0]; */
+void global_alias(void) {
+	*g_alias = 1;
+}
+
+/*@ requires \valid(g_alias);
+    assigns *g_alias;
+    ensures *g_alias == 1; */
+void global_no_alias(void) {
+	*g_alias = 1;
+}
+
+/*@ requires \valid(f_alias);
+    assigns *f_alias;
+    ensures *f_alias == 1;
+    ensures \old(global[0]) == global[0]; */
+void formal_alias(int* f_alias) {
+	*f_alias = 1;
+}
+
+/*@ requires \valid(f_alias);
+    assigns *f_alias;
+    ensures *f_alias == 1; */
+void formal_no_alias(int* f_alias) {
+	*f_alias = 1;
+}
+
+/*@ requires \valid(alias_array);
+    assigns (*alias_array)[0 .. 1];
+    ensures (*alias_array)[0] == 1;
+    ensures (*alias_array)[1] == 1;
+    ensures \old(global[0]) == global[0]; */
+void formal_alias_array(int (*alias_array)[2]){
+  (*alias_array)[0] = 1;
+  (*alias_array)[1] = 1;
+}
+
+// With field
+
+struct X { int x; };
+
+/*@ requires \valid(x);
+    assigns x->x ;
+    ensures x->x == 1;
+    ensures \old(global[0]) == global[0]; */
+void field_alias(struct X* x){
+  x->x = 1 ;
+}
+
+// With field, via set
+
+// Through set:
+
+/*@ requires \valid(x);
+    assigns x[0..3].x ;
+    ensures x->x == 1;
+    ensures \old(global[0]) == global[0]; */
+void field_range_alias(struct X* x){
+  x->x = 1 ;
+}
+
+/*@ requires \valid(g_alias);
+    assigns { *g_alias, *f_alias } ;
+    ensures *g_alias == 1;
+    ensures \old(global[0]) == global[0]; */
+void set_alias(int *f_alias) {
+  *g_alias = 1;
+}
+
+
+// Through comprehension:
+
+/*@ requires \valid(g_alias);
+    assigns { *alias | int* alias ; alias == \at(g_alias, Pre) } ;
+    ensures *g_alias == 1;
+    ensures \old(global[0]) == global[0]; */
+void comprehension_alias(void) {
+  *g_alias = 1;
+}
+
+// Through union:
+
+/*@ requires \valid(g_alias);
+    assigns \union(*g_alias, *f_alias) ;
+    ensures *g_alias == 1;
+    ensures \old(global[0]) == global[0]; */
+void union_alias(int *f_alias) {
+  *g_alias = 1;
+}
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/alias_assigns_hypotheses.0.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/alias_assigns_hypotheses.0.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..832baab84eb61db255327ed172594084b92caa0c
--- /dev/null
+++ b/src/plugins/wp/tests/wp_hoare/oracle/alias_assigns_hypotheses.0.res.oracle
@@ -0,0 +1,254 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_hoare/alias_assigns_hypotheses.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function comprehension_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 90) in 'comprehension_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 91) in 'comprehension_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 89) in 'comprehension_alias':
+Effect at line 93
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function field_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 59) in 'field_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 60) in 'field_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 58) in 'field_alias':
+Effect at line 62
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function field_range_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 71) in 'field_range_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 72) in 'field_range_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 70) in 'field_range_alias':
+Effect at line 74
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function formal_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 30) in 'formal_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 31) in 'formal_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 29) in 'formal_alias':
+Effect at line 33
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function formal_alias_array
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 45) in 'formal_alias_array':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 46) in 'formal_alias_array':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 47) in 'formal_alias_array':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 44) in 'formal_alias_array' (1/2):
+Effect at line 49
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 44) in 'formal_alias_array' (2/2):
+Effect at line 50
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function formal_no_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 38) in 'formal_no_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 37) in 'formal_no_alias':
+Effect at line 40
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function global_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 15) in 'global_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 16) in 'global_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 14) in 'global_alias':
+Effect at line 18
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function global_no_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 23) in 'global_no_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 22) in 'global_no_alias':
+Effect at line 25
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function set_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 79) in 'set_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 80) in 'set_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 78) in 'set_alias':
+Effect at line 82
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function union_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 100) in 'union_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 101) in 'union_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 99) in 'union_alias':
+Effect at line 103
+Prove: true.
+
+------------------------------------------------------------
+[wp] Warning: Memory model hypotheses for function 'global_alias':
+  /*@
+     behavior typed:
+       requires \separated(g_alias, (int *)global + (..), &g_alias);
+     */
+  void global_alias(void);
+[wp] Warning: Memory model hypotheses for function 'global_no_alias':
+  /*@ behavior typed:
+        requires \separated(g_alias, &g_alias); */
+  void global_no_alias(void);
+[wp] Warning: Memory model hypotheses for function 'formal_alias':
+  /*@ behavior typed:
+        requires \separated(f_alias, (int *)global + (..)); */
+  void formal_alias(int *f_alias);
+[wp] Warning: Memory model hypotheses for function 'formal_alias_array':
+  /*@
+     behavior typed:
+       requires \separated((int *)global + (..), &(*alias_array)[0 .. 1]);
+       requires \separated(alias_array + (..), (int *)global + (..));
+     */
+  void formal_alias_array(int (*alias_array)[2]);
+[wp] Warning: Memory model hypotheses for function 'field_alias':
+  /*@
+     behavior typed:
+       requires \separated((int *)global + (..), &x->x);
+       requires \separated(x, (int *)global + (..));
+     */
+  void field_alias(struct X *x);
+[wp] Warning: Memory model hypotheses for function 'field_range_alias':
+  /*@
+     behavior typed:
+       requires \separated((int *)global + (..), &(x + (0 .. 3))->x);
+       requires \separated(x + (..), (int *)global + (..));
+     */
+  void field_range_alias(struct X *x);
+[wp] Warning: Memory model hypotheses for function 'set_alias':
+  /*@
+     behavior typed:
+       requires \separated((int *)global + (..), &g_alias, {g_alias, f_alias});
+       requires \separated(f_alias, (int *)global + (..), &g_alias);
+     */
+  void set_alias(int *f_alias);
+[wp] Warning: Memory model hypotheses for function 'comprehension_alias':
+  /*@
+     behavior typed:
+       requires
+         \separated(
+           (int *)global + (..), &g_alias,
+           {alias | int *alias; alias ≡ \at(g_alias,Pre)}
+           );
+     */
+  void comprehension_alias(void);
+[wp] Warning: Memory model hypotheses for function 'union_alias':
+  /*@
+     behavior typed:
+       requires \separated((int *)global + (..), &g_alias, {g_alias, f_alias});
+       requires \separated(f_alias, (int *)global + (..), &g_alias);
+     */
+  void union_alias(int *f_alias);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/alias_assigns_hypotheses.1.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/alias_assigns_hypotheses.1.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..3da623e24931019ca8f1a8fbdc64132f1611c015
--- /dev/null
+++ b/src/plugins/wp/tests/wp_hoare/oracle/alias_assigns_hypotheses.1.res.oracle
@@ -0,0 +1,350 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_hoare/alias_assigns_hypotheses.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function comprehension_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 90) in 'comprehension_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 91) in 'comprehension_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 89) in 'comprehension_alias':
+Effect at line 93
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function field_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 59) in 'field_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 60) in 'field_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 58) in 'field_alias':
+Effect at line 62
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function field_range_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 71) in 'field_range_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 72) in 'field_range_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 70) in 'field_range_alias':
+Effect at line 74
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function formal_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 30) in 'formal_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 31) in 'formal_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 29) in 'formal_alias':
+Effect at line 33
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function formal_alias_array
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 45) in 'formal_alias_array':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 46) in 'formal_alias_array':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 47) in 'formal_alias_array':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 44) in 'formal_alias_array' (1/2):
+Effect at line 49
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 44) in 'formal_alias_array' (2/2):
+Effect at line 50
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function formal_no_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 38) in 'formal_no_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 37) in 'formal_no_alias':
+Effect at line 40
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function global_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 15) in 'global_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 16) in 'global_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 14) in 'global_alias':
+Effect at line 18
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function global_no_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 23) in 'global_no_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 22) in 'global_no_alias':
+Effect at line 25
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function set_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 79) in 'set_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 80) in 'set_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 78) in 'set_alias':
+Effect at line 82
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function union_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 100) in 'union_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 101) in 'union_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 99) in 'union_alias':
+Effect at line 103
+Prove: true.
+
+------------------------------------------------------------
+/* Generated by Frama-C */
+struct X {
+   int x ;
+};
+int global[1];
+int *g_alias;
+/*@ requires \valid(g_alias);
+    ensures *g_alias ≡ 1;
+    ensures \old(global[0]) ≡ global[0];
+    assigns *g_alias;
+    
+    behavior typed:
+      requires \separated(g_alias, (int *)global + (..), &g_alias);
+ */
+void global_alias(void)
+{
+  *g_alias = 1;
+  return;
+}
+
+/*@ requires \valid(g_alias);
+    ensures *g_alias ≡ 1;
+    assigns *g_alias;
+    
+    behavior typed:
+      requires \separated(g_alias, &g_alias);
+ */
+void global_no_alias(void)
+{
+  *g_alias = 1;
+  return;
+}
+
+/*@ requires \valid(f_alias);
+    ensures *\old(f_alias) ≡ 1;
+    ensures \old(global[0]) ≡ global[0];
+    assigns *f_alias;
+    
+    behavior typed:
+      requires \separated(f_alias, (int *)global + (..));
+ */
+void formal_alias(int *f_alias)
+{
+  *f_alias = 1;
+  return;
+}
+
+/*@ requires \valid(f_alias);
+    ensures *\old(f_alias) ≡ 1;
+    assigns *f_alias;
+ */
+void formal_no_alias(int *f_alias)
+{
+  *f_alias = 1;
+  return;
+}
+
+/*@ requires \valid(alias_array);
+    ensures (*\old(alias_array))[0] ≡ 1;
+    ensures (*\old(alias_array))[1] ≡ 1;
+    ensures \old(global[0]) ≡ global[0];
+    assigns (*alias_array)[0 .. 1];
+    
+    behavior typed:
+      requires \separated((int *)global + (..), &(*alias_array)[0 .. 1]);
+      requires \separated(alias_array + (..), (int *)global + (..));
+ */
+void formal_alias_array(int (*alias_array)[2])
+{
+  (*alias_array)[0] = 1;
+  (*alias_array)[1] = 1;
+  return;
+}
+
+/*@ requires \valid(x);
+    ensures \old(x)->x ≡ 1;
+    ensures \old(global[0]) ≡ global[0];
+    assigns x->x;
+    
+    behavior typed:
+      requires \separated((int *)global + (..), &x->x);
+      requires \separated(x, (int *)global + (..));
+ */
+void field_alias(struct X *x)
+{
+  x->x = 1;
+  return;
+}
+
+/*@ requires \valid(x);
+    ensures \old(x)->x ≡ 1;
+    ensures \old(global[0]) ≡ global[0];
+    assigns (x + (0 .. 3))->x;
+    
+    behavior typed:
+      requires \separated((int *)global + (..), &(x + (0 .. 3))->x);
+      requires \separated(x + (..), (int *)global + (..));
+ */
+void field_range_alias(struct X *x)
+{
+  x->x = 1;
+  return;
+}
+
+/*@ requires \valid(g_alias);
+    ensures *g_alias ≡ 1;
+    ensures \old(global[0]) ≡ global[0];
+    assigns {*g_alias, *f_alias};
+    
+    behavior typed:
+      requires
+        \separated((int *)global + (..), &g_alias, {g_alias, f_alias});
+      requires \separated(f_alias, (int *)global + (..), &g_alias);
+ */
+void set_alias(int *f_alias)
+{
+  *g_alias = 1;
+  return;
+}
+
+/*@ requires \valid(g_alias);
+    ensures *g_alias ≡ 1;
+    ensures \old(global[0]) ≡ global[0];
+    assigns {*alias | int *alias; alias ≡ \at(g_alias,Pre)};
+    
+    behavior typed:
+      requires
+        \separated(
+          (int *)global + (..), &g_alias,
+          {alias | int *alias; alias ≡ \at(g_alias,Pre)}
+          );
+ */
+void comprehension_alias(void)
+{
+  *g_alias = 1;
+  return;
+}
+
+/*@ requires \valid(g_alias);
+    ensures *g_alias ≡ 1;
+    ensures \old(global[0]) ≡ global[0];
+    assigns {*g_alias, *f_alias};
+    
+    behavior typed:
+      requires
+        \separated((int *)global + (..), &g_alias, {g_alias, f_alias});
+      requires \separated(f_alias, (int *)global + (..), &g_alias);
+ */
+void union_alias(int *f_alias)
+{
+  *g_alias = 1;
+  return;
+}
+
+
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/alias_assigns_hypotheses.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/alias_assigns_hypotheses.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..c9a461392e7cb29343481e9e0560a5021bf0beb2
--- /dev/null
+++ b/src/plugins/wp/tests/wp_hoare/oracle/alias_assigns_hypotheses.res.oracle
@@ -0,0 +1,254 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_hoare/alias_assigns_hypotheses.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Loading driver 'share/wp.driver'
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function comprehension_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 85) in 'comprehension_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 86) in 'comprehension_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 84) in 'comprehension_alias':
+Effect at line 88
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function field_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 54) in 'field_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 55) in 'field_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 53) in 'field_alias':
+Effect at line 57
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function field_range_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 66) in 'field_range_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 67) in 'field_range_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 65) in 'field_range_alias':
+Effect at line 69
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function formal_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 25) in 'formal_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 26) in 'formal_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 24) in 'formal_alias':
+Effect at line 28
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function formal_alias_array
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 40) in 'formal_alias_array':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 41) in 'formal_alias_array':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 42) in 'formal_alias_array':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 39) in 'formal_alias_array' (1/2):
+Effect at line 44
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 39) in 'formal_alias_array' (2/2):
+Effect at line 45
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function formal_no_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 33) in 'formal_no_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 32) in 'formal_no_alias':
+Effect at line 35
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function global_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 10) in 'global_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 11) in 'global_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 9) in 'global_alias':
+Effect at line 13
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function global_no_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 18) in 'global_no_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 17) in 'global_no_alias':
+Effect at line 20
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function set_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 74) in 'set_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 75) in 'set_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 73) in 'set_alias':
+Effect at line 77
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function union_alias
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 95) in 'union_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/alias_assigns_hypotheses.i, line 96) in 'union_alias':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_assigns_hypotheses.i, line 94) in 'union_alias':
+Effect at line 98
+Prove: true.
+
+------------------------------------------------------------
+[wp] Warning: Memory model hypotheses for function 'global_alias':
+  /*@
+     behavior typed:
+     requires \separated(g_alias,\union(&g_alias,global+(..)));
+     */
+  void global_alias(void);
+[wp] Warning: Memory model hypotheses for function 'global_no_alias':
+  /*@ behavior typed: requires \separated(g_alias,&g_alias); */
+  void global_no_alias(void);
+[wp] Warning: Memory model hypotheses for function 'formal_alias':
+  /*@
+     behavior typed:
+     requires \separated(global+(..),f_alias);
+     requires \separated(f_alias,global+(..));
+     */
+  void formal_alias(int *f_alias);
+[wp] Warning: Memory model hypotheses for function 'formal_alias_array':
+  /*@
+     behavior typed:
+     requires \separated(global+(..),alias_array+(..));
+     requires \separated(&(*alias_array)[0 .. 1],global+(..));
+     */
+  void formal_alias_array(int (*alias_array)[2]);
+[wp] Warning: Memory model hypotheses for function 'field_alias':
+  /*@
+     behavior typed:
+     requires \separated(global+(..),x);
+     requires \separated(&x->x,global+(..));
+     */
+  void field_alias(struct X *x);
+[wp] Warning: Memory model hypotheses for function 'field_range_alias':
+  /*@
+     behavior typed:
+     requires \separated(global+(..),x+(..));
+     requires \separated(&(x + (0 .. 3))->x,global+(..));
+     */
+  void field_range_alias(struct X *x);
+[wp] Warning: Memory model hypotheses for function 'set_alias':
+  /*@
+     behavior typed:
+     requires \separated(\union(global+(..),&g_alias),f_alias);
+     requires \separated({g_alias, f_alias},\union(&g_alias,global+(..)));
+     */
+  void set_alias(int *f_alias);
+[wp] Warning: Memory model hypotheses for function 'comprehension_alias':
+  /*@
+     behavior typed:
+     requires \separated({alias | int *alias; alias ≡ \at(g_alias,Pre)},
+                \union(&g_alias,global+(..)));
+     */
+  void comprehension_alias(void);
+[wp] Warning: Memory model hypotheses for function 'union_alias':
+  /*@
+     behavior typed:
+     requires \separated(\union(global+(..),&g_alias),f_alias);
+     requires \separated({g_alias, f_alias},\union(&g_alias,global+(..)));
+     */
+  void union_alias(int *f_alias);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/byref.0.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/byref.0.res.oracle
index 9ec8bc14a7f9fe4e4ede6808f53fa99a9aa0731d..f9c6a96edce7dd37271023e690bf5433412604b6 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/byref.0.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/byref.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_hoare/byref.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/byref.1.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/byref.1.res.oracle
index 4720ded827794cf0a147a1cf332f7122fbcdda2f..54ad8489278e68186e342fc1157d755cd613d62f 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/byref.1.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/byref.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/byref.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
@@ -87,11 +86,14 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'f':
-  /*@ behavior typed_ref: requires \valid(r); */
+  /*@ behavior typed_ref:
+        requires \valid(r); */
   void f(int *r);
 [wp] Warning: Memory model hypotheses for function 'wrong_without_ref':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int wrong_without_ref(int *q);
 [wp] Warning: Memory model hypotheses for function 'pointer':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int pointer(int *q);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var.res.oracle
index f9c9e2a5b35ffdd6194a574cde42c5a3620f522d..d2646994c22e0a1dbada00d2f6169e04da38ab0e 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var.res.oracle
@@ -23,7 +23,6 @@ Function call_two_ref: { r0 tmp tmp_0 __retres }
 Function g: { *pg tmp }
 Function array_in_struct_param: { sf }
 .................................................
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function array_in_struct_param
@@ -498,8 +497,10 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'ref_bd':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int ref_bd(int *q);
 [wp] Warning: Memory model hypotheses for function 'g':
-  /*@ behavior typed_ref: requires \valid(pg); */
+  /*@ behavior typed_ref:
+        requires \valid(pg); */
   int g(int *pg);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var2.0.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var2.0.res.oracle
index b128329870f278390c61503d8e3f1715cbc7695e..61bf6b67367b214b40e53f5d9d9e9fff16e4a0fe 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var2.0.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var2.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' -wp-no-let [...]
 [kernel] Parsing tests/wp_hoare/dispatch_var2.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function call_global
@@ -14,15 +13,20 @@ Assume {
   (* Heap *)
   Type: is_sint32(x_1).
   (* Block In *)
-  Have: (Init_tmp_0=false) /\ (ta_tmp_0=false).
+  Have: (Init_tmp_0=false) /\ (ta_tmp_0=true) /\ (ta_tmp_1=false).
+  Have: ((Init_tmp_0=true) <-> (Init_tmp_1=true)) /\
+      ((ta_tmp_0=true) <-> (ta_tmp_2=true)).
   (* Call 'reset' *)
   Have: x = 0.
+  Have: (ta_tmp_2=true) <-> (ta_tmp_3=true).
   (* Call 'load' *)
   Have: (tmp_0 = load_0) /\ (x = load_0).
   (* Return Effects *)
-  Have: ((Init_tmp_0=true) -> (Init_tmp_1=true)).
+  Have: ((Init_tmp_1=true) -> (Init_tmp_2=true)).
   (* Return *)
   Have: tmp_0 = call_global_0.
+  (* Block Out *)
+  Have: (ta_tmp_3=true).
 }
 Prove: call_global_0 = 0.
 
@@ -47,12 +51,13 @@ Assume {
   Have: (ta_tmp_1=true) <-> (ta_tmp_0=true).
   (* Block In *)
   Have: (Init_tmp_0=false) /\ (ta_tmp_1=false).
+  Have: (Init_tmp_0=true) <-> (Init_tmp_1=true).
   (* Call 'reset' *)
   Have: x = 0.
   (* Call 'load' *)
   Have: x = load_0.
   (* Return Effects *)
-  Have: ((Init_tmp_0=true) -> (Init_tmp_1=true)).
+  Have: ((Init_tmp_1=true) -> (Init_tmp_2=true)).
 }
 Prove: (ta_tmp_0=false).
 
@@ -78,19 +83,26 @@ Assume {
   Type: is_sint32(call_local_0) /\ is_sint32(load_0) /\ is_sint32(tmp_0) /\
       is_sint32(z).
   (* Block In *)
-  Have: (Init_tmp_0=false) /\ (Init_z_0=false) /\ (ta_tmp_0=false) /\
-      (ta_z_0=false).
-  Have: (Init_z_0=true) <-> (Init_z_1=true).
+  Have: (Init_tmp_0=false) /\ (Init_z_0=false) /\ (ta_tmp_0=true) /\
+      (ta_tmp_1=false) /\ (ta_z_0=true) /\ (ta_z_1=false).
+  Have: ((Init_tmp_0=true) <-> (Init_tmp_1=true)) /\
+      ((Init_z_0=true) <-> (Init_z_1=true)) /\
+      ((ta_tmp_0=true) <-> (ta_tmp_2=true)) /\
+      ((ta_z_0=true) <-> (ta_z_2=true)).
   (* Call 'reset' *)
-  Have: z = 0.
+  Have: (ta_z_0=true) /\ (z = 0).
   (* Call Effects *)
   Have: ((Init_z_1=true) -> (Init_z_2=true)).
+  Have: ((ta_tmp_2=true) <-> (ta_tmp_3=true)) /\
+      ((ta_z_2=true) <-> (ta_z_3=true)).
   (* Call 'load' *)
-  Have: (tmp_0 = load_0) /\ (z = load_0).
+  Have: (ta_z_2=true) /\ (tmp_0 = load_0) /\ (z = load_0).
   (* Return Effects *)
-  Have: ((Init_tmp_0=true) -> (Init_tmp_1=true)).
+  Have: ((Init_tmp_1=true) -> (Init_tmp_2=true)).
   (* Return *)
   Have: tmp_0 = call_local_0.
+  (* Block Out *)
+  Have: (ta_tmp_3=true) /\ (ta_z_3=true).
 }
 Prove: call_local_0 = 0.
 
@@ -107,17 +119,20 @@ Assume {
   Type: is_sint32(status_0) /\ is_sint32(status_1) /\ is_sint32(z).
   Have: (ta_z_1=true) <-> (ta_z_0=true).
   (* Block In *)
-  Have: (Init_z_0=false) /\ (ta_tmp_0=false) /\ (ta_z_1=false).
+  Have: (Init_z_0=false) /\ (ta_tmp_0=false) /\ (ta_z_2=true) /\
+      (ta_z_1=false).
   (* Merge *)
   Either {
     Case:
       Have: (Init_z_0=true) <-> (Init_z_1=true).
       (* Call 'reset' *)
-      Have: z = 0.
+      Have: (ta_z_2=true) /\ (z = 0).
       (* Call Effects *)
       Have: ((Init_z_1=true) -> (Init_z_2=true)).
     Case:
       Have: (Init_z_0=true) <-> (Init_z_3=true).
+      (* Exit 'reset' *)
+      Have: (ta_z_2=true).
       (* Exit Effects *)
       Have: ((Init_z_3=true) -> (Init_z_4=true)).
   }
@@ -137,10 +152,11 @@ Assume {
   Type: is_sint32(z).
   Have: (ta_z_1=true) <-> (ta_z_0=true).
   (* Block In *)
-  Have: (Init_z_0=false) /\ (ta_tmp_0=false) /\ (ta_z_1=false).
+  Have: (Init_z_0=false) /\ (ta_tmp_0=false) /\ (ta_z_2=true) /\
+      (ta_z_1=false).
   Have: (Init_z_0=true) <-> (Init_z_1=true).
   (* Call 'reset' *)
-  Have: z = 0.
+  Have: (ta_z_2=true) /\ (z = 0).
   (* Call Effects *)
   Have: ((Init_z_1=true) -> (Init_z_2=true)).
 }
@@ -155,16 +171,18 @@ Assume {
   Have: (ta_tmp_1=true) <-> (ta_tmp_0=true).
   (* Block In *)
   Have: (Init_tmp_0=false) /\ (Init_z_0=false) /\ (ta_tmp_1=false) /\
-      (ta_z_0=false).
-  Have: (Init_z_0=true) <-> (Init_z_1=true).
+      (ta_z_0=true) /\ (ta_z_1=false).
+  Have: ((Init_tmp_0=true) <-> (Init_tmp_1=true)) /\
+      ((Init_z_0=true) <-> (Init_z_1=true)) /\
+      ((ta_z_0=true) <-> (ta_z_2=true)).
   (* Call 'reset' *)
-  Have: z = 0.
+  Have: (ta_z_0=true) /\ (z = 0).
   (* Call Effects *)
   Have: ((Init_z_1=true) -> (Init_z_2=true)).
   (* Call 'load' *)
-  Have: z = load_0.
+  Have: (ta_z_2=true) /\ (z = load_0).
   (* Return Effects *)
-  Have: ((Init_tmp_0=true) -> (Init_tmp_1=true)).
+  Have: ((Init_tmp_1=true) -> (Init_tmp_2=true)).
 }
 Prove: (ta_tmp_0=false).
 
@@ -185,11 +203,12 @@ Goal Instance of 'Pre-condition (file tests/wp_hoare/dispatch_var2.i, line 27) i
 Assume {
   Type: is_sint32(z).
   (* Block In *)
-  Have: (Init_z_0=false) /\ (ta_tmp_0=false) /\ (ta_z_0=true) /\
-      (ta_z_1=false).
-  Have: (Init_z_0=true) <-> (Init_z_1=true).
+  Have: (Init_z_0=false) /\ (ta_tmp_0=false) /\ (ta_z_1=true) /\
+      (ta_z_2=false).
+  Have: ((Init_z_0=true) <-> (Init_z_1=true)) /\
+      ((ta_z_1=true) <-> (ta_z_0=true)).
   (* Call 'reset' *)
-  Have: (ta_z_0=true) /\ (z = 0).
+  Have: (ta_z_1=true) /\ (z = 0).
   (* Call Effects *)
   Have: ((Init_z_1=true) -> (Init_z_2=true)).
 }
@@ -208,22 +227,23 @@ Assume {
   Have: (ta_y_0=true).
   (* Pre-condition *)
   Have: (ta_y_0=true).
-  (* Function Frame *)
-  Have: (ta_y_1=true) /\ (ta_y_0=false).
+  (* Frame In *)
+  Have: (ta_y_0=false).
   (* Block In *)
-  Have: (Init_tmp_0=false) /\ (ta_tmp_0=false).
-  Have: (ta_y_1=true) <-> (ta_y_2=true).
+  Have: (Init_tmp_0=false) /\ (ta_tmp_0=true) /\ (ta_tmp_1=false).
+  Have: ((Init_tmp_0=true) <-> (Init_tmp_1=true)) /\
+      ((ta_tmp_0=true) <-> (ta_tmp_2=true)).
   (* Call 'reset' *)
-  Have: (ta_y_1=true) /\ (y = 0).
-  Have: (ta_y_2=true) <-> (ta_y_3=true).
+  Have: y = 0.
+  Have: (ta_tmp_2=true) <-> (ta_tmp_3=true).
   (* Call 'load' *)
-  Have: (ta_y_2=true) /\ (tmp_0 = load_0) /\ (y = load_0).
+  Have: (tmp_0 = load_0) /\ (y = load_0).
   (* Return Effects *)
-  Have: ((Init_tmp_0=true) -> (Init_tmp_1=true)).
+  Have: ((Init_tmp_1=true) -> (Init_tmp_2=true)).
   (* Return *)
   Have: tmp_0 = call_param_0.
-  (* Function Exit *)
-  Have: (ta_y_3=true).
+  (* Block Out *)
+  Have: (ta_tmp_3=true).
 }
 Prove: call_param_0 = 0.
 
@@ -243,15 +263,12 @@ Assume {
   Have: (ta_y_1=true).
   (* Pre-condition *)
   Have: (ta_y_1=true).
-  (* Function Frame *)
-  Have: (ta_y_2=true) /\ (ta_y_1=false).
+  (* Frame In *)
+  Have: (ta_y_1=false).
   (* Block In *)
   Have: (ta_tmp_0=false).
   (* Merge *)
-  Either {
-    Case: (* Call 'reset' *) Have: (ta_y_2=true) /\ (y = 0).
-    Case: (* Exit 'reset' *) Have: (ta_y_2=true).
-  }
+  Either { Case: (* Call 'reset' *) Have: y = 0. Case: }
 }
 Prove: (ta_y_0=false).
 
@@ -271,12 +288,12 @@ Assume {
   Have: (ta_y_1=true).
   (* Pre-condition *)
   Have: (ta_y_1=true).
-  (* Function Frame *)
-  Have: (ta_y_2=true) /\ (ta_y_1=false).
+  (* Frame In *)
+  Have: (ta_y_1=false).
   (* Block In *)
   Have: (ta_tmp_0=false).
   (* Call 'reset' *)
-  Have: (ta_y_2=true) /\ (y = 0).
+  Have: y = 0.
 }
 Prove: (ta_y_0=false).
 
@@ -291,17 +308,17 @@ Assume {
   Have: (ta_y_0=true).
   (* Pre-condition *)
   Have: (ta_y_0=true).
-  (* Function Frame *)
-  Have: (ta_y_1=true) /\ (ta_y_0=false).
+  (* Frame In *)
+  Have: (ta_y_0=false).
   (* Block In *)
   Have: (Init_tmp_0=false) /\ (ta_tmp_1=false).
-  Have: (ta_y_1=true) <-> (ta_y_2=true).
+  Have: (Init_tmp_0=true) <-> (Init_tmp_1=true).
   (* Call 'reset' *)
-  Have: (ta_y_1=true) /\ (y = 0).
+  Have: y = 0.
   (* Call 'load' *)
-  Have: (ta_y_2=true) /\ (y = load_0).
+  Have: y = load_0.
   (* Return Effects *)
-  Have: ((Init_tmp_0=true) -> (Init_tmp_1=true)).
+  Have: ((Init_tmp_1=true) -> (Init_tmp_2=true)).
 }
 Prove: (ta_tmp_0=false).
 
@@ -314,7 +331,7 @@ Assume {
   Have: (ta_y_1=true).
   (* Pre-condition *)
   Have: (ta_y_1=true).
-  (* Function Frame *)
+  (* Frame In *)
   Have: (ta_y_0=true) /\ (ta_y_1=false).
   (* Block In *)
   Have: (ta_tmp_0=false).
@@ -331,13 +348,12 @@ Assume {
   Have: (ta_y_1=true).
   (* Pre-condition *)
   Have: (ta_y_1=true).
-  (* Function Frame *)
-  Have: (ta_y_2=true) /\ (ta_y_1=false).
+  (* Frame In *)
+  Have: (ta_y_0=true) /\ (ta_y_1=false).
   (* Block In *)
   Have: (ta_tmp_0=false).
-  Have: (ta_y_2=true) <-> (ta_y_0=true).
   (* Call 'reset' *)
-  Have: (ta_y_2=true) /\ (y = 0).
+  Have: (ta_y_0=true) /\ (y = 0).
 }
 Prove: (ta_y_0=true).
 
@@ -351,15 +367,20 @@ Assume {
   Type: is_sint32(call_param_ref_0) /\ is_sint32(load_0) /\ is_sint32(q) /\
       is_sint32(tmp_0).
   (* Block In *)
-  Have: (Init_tmp_0=false) /\ (ta_tmp_0=false).
+  Have: (Init_tmp_0=false) /\ (ta_tmp_0=true) /\ (ta_tmp_1=false).
+  Have: ((Init_tmp_0=true) <-> (Init_tmp_1=true)) /\
+      ((ta_tmp_0=true) <-> (ta_tmp_2=true)).
   (* Call 'reset' *)
   Have: q = 0.
+  Have: (ta_tmp_2=true) <-> (ta_tmp_3=true).
   (* Call 'load' *)
   Have: (q = load_0) /\ (tmp_0 = load_0).
   (* Return Effects *)
-  Have: ((Init_tmp_0=true) -> (Init_tmp_1=true)).
+  Have: ((Init_tmp_1=true) -> (Init_tmp_2=true)).
   (* Return *)
   Have: tmp_0 = call_param_ref_0.
+  (* Block Out *)
+  Have: (ta_tmp_3=true).
 }
 Prove: call_param_ref_0 = 0.
 
@@ -382,12 +403,13 @@ Assume {
   Have: (ta_tmp_1=true) <-> (ta_tmp_0=true).
   (* Block In *)
   Have: (Init_tmp_0=false) /\ (ta_tmp_1=false).
+  Have: (Init_tmp_0=true) <-> (Init_tmp_1=true).
   (* Call 'reset' *)
   Have: q = 0.
   (* Call 'load' *)
   Have: q = load_0.
   (* Return Effects *)
-  Have: ((Init_tmp_0=true) -> (Init_tmp_1=true)).
+  Have: ((Init_tmp_1=true) -> (Init_tmp_2=true)).
 }
 Prove: (ta_tmp_0=false).
 
@@ -464,14 +486,18 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref: requires \valid(rp); */
+  /*@ behavior typed_ref:
+        requires \valid(rp); */
   void reset(int *rp);
 [wp] Warning: Memory model hypotheses for function 'incr':
-  /*@ behavior typed_ref: requires \valid(ip); */
+  /*@ behavior typed_ref:
+        requires \valid(ip); */
   void incr(int *ip);
 [wp] Warning: Memory model hypotheses for function 'load':
-  /*@ behavior typed_ref: requires \valid(lp); */
+  /*@ behavior typed_ref:
+        requires \valid(lp); */
   int load(int *lp);
 [wp] Warning: Memory model hypotheses for function 'call_param_ref':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int call_param_ref(int *q);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var2.1.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var2.1.res.oracle
index 9845add669affa7de094d3deaa2df6b99eb3bdd4..44ae58e7b74ba0fb1e7c7ef27a28f0155be239f7 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var2.1.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var2.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/dispatch_var2.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function call_global
@@ -212,14 +211,18 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref: requires \valid(rp); */
+  /*@ behavior typed_ref:
+        requires \valid(rp); */
   void reset(int *rp);
 [wp] Warning: Memory model hypotheses for function 'incr':
-  /*@ behavior typed_ref: requires \valid(ip); */
+  /*@ behavior typed_ref:
+        requires \valid(ip); */
   void incr(int *ip);
 [wp] Warning: Memory model hypotheses for function 'load':
-  /*@ behavior typed_ref: requires \valid(lp); */
+  /*@ behavior typed_ref:
+        requires \valid(lp); */
   int load(int *lp);
 [wp] Warning: Memory model hypotheses for function 'call_param_ref':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int call_param_ref(int *q);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/isHoare.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/isHoare.res.oracle
index bfbd22dfea9ede3a172f60b032f320deffe4ed9d..31b64ff33371aa2341a89848adec14774f4cec9d 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/isHoare.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/isHoare.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/isHoare.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function cmp_invalid_addr_as_int
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/logicarr.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/logicarr.res.oracle
index bfb7581b49d7b30852c5599e9368a5d64eb0a6e1..9875c8c8f6706fc59099d8de937fd5c9e2a0d06a 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/logicarr.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/logicarr.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_hoare/logicarr.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function job
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/logicref.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/logicref.res.oracle
index 093b63521e624272f9819a2f9ce9b86db0052f59..0eb822224664ad3e2e81465f27005edaadb02a90 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/logicref.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/logicref.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/logicref.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function fvrange_n
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/logicref_simple.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/logicref_simple.res.oracle
index e789d39c37d259a3fc4e6803904857355ab6ce39..3d20b3ef6be8edcf0fae09ea401482f89d8faa9f 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/logicref_simple.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/logicref_simple.res.oracle
@@ -10,7 +10,6 @@ Function fsimple_array: { &t __retres }
 Function ftwo_star: { d __retres }
 Function fvpositive: { b }
 .................................................
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function fsimple
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/reference.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/reference.res.oracle
index f5c773ac7bd37ad8bbda40a9e46292e843806e23..c6bec6fef0728d4b3598e5ec6ae9d881cbec4150 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/reference.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/reference.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/reference.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function call_f2
@@ -143,11 +142,14 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'call_f2':
-  /*@ behavior typed_ref: requires \valid(ptr); */
+  /*@ behavior typed_ref:
+        requires \valid(ptr); */
   int call_f2(int *ptr, int y);
 [wp] Warning: Memory model hypotheses for function 'call_global':
-  /*@ behavior typed_ref: requires \valid(gl); */
+  /*@ behavior typed_ref:
+        requires \valid(gl); */
   int call_global(void);
 [wp] Warning: Memory model hypotheses for function 'write':
-  /*@ behavior typed_ref: requires \valid(pa); */
+  /*@ behavior typed_ref:
+        requires \valid(pa); */
   void write(int kb, int *pa);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle
index 90f5112a9d1d727ec18d81c9d049d3930b2489ad..6be3aa72874003dc78af525fd268a665aad32185 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/reference_and_struct.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function call_array_in_struct_param
@@ -253,5 +252,12 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref: requires \valid(p); */
+  /*@ behavior typed_ref:
+        requires \valid(p); */
   void reset(struct T *p);
+[wp] Warning: Memory model hypotheses for function 'call_reset_5_tps':
+  /*@
+     behavior typed_ref:
+       requires \separated((struct T **)tps + (..), tps[9] + (0 .. 4));
+     */
+  void call_reset_5_tps(void);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/reference_array.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/reference_array.res.oracle
index 8cdc9f4d9d23e67d381f6cfc6d7affffcb8ad1c2..2801c12e3a4d356ed5996b851196fd7ed9a0015f 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/reference_array.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/reference_array.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/reference_array.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function add_1_5
@@ -403,11 +402,15 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'load_1_5':
-  /*@ behavior typed_ref: requires \separated(reg_load+(..),lp+(..)); */
+  /*@
+     behavior typed_ref:
+       requires \separated(lp + (..), (int *)reg_load + (..));
+     */
   void load_1_5(int (*lp)[5]);
 [wp] Warning: Memory model hypotheses for function 'add_1_5':
   /*@
      behavior typed_ref:
-     requires \separated(\union(reg_load+(..),reg_add+(..)),ap+(..));
+       requires
+         \separated(ap + (..), (int *)reg_load + (..), (int *)reg_add + (..));
      */
   void add_1_5(int (*ap)[5]);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/reference_array_simple.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/reference_array_simple.res.oracle
index e71891e1ea8c3057377014b7b78a5fb09e1cff69..2c5447e5d1d9013e345c34ecb12cebb4310f5712 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/reference_array_simple.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/reference_array_simple.res.oracle
@@ -12,7 +12,6 @@ Function call_f2: { tt tmp __retres }
 Function f3: { p3[] k }
 Function call_f3: { tp tmp }
 .................................................
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function call_f1
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/refguards.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/refguards.res.oracle
index 25649f1ac968befd3f1858a7d2ba9d75962cf1fb..59c0568ee15ab1f2f1a4475f688e303403a07b4b 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/refguards.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/refguards.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/refguards.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
@@ -72,24 +71,24 @@ Prove: d != c.
 [wp] Warning: Memory model hypotheses for function 'f':
   /*@
      behavior typed_ref:
-     requires \separated(c,d,\union(a+(..),b+(..)));
-     requires \valid(c);
-     requires \valid(d);
+       requires \separated(c, d, {a + (..), b + (..)});
+       requires \valid(c);
+       requires \valid(d);
      */
   void f(int *a, int *b, int *c, int *d, int k);
 [wp] Warning: Memory model hypotheses for function 'h':
   /*@
      behavior typed_ref:
-     requires \separated(c,d);
-     requires \valid(c);
-     requires \valid(d);
+       requires \separated(c, d);
+       requires \valid(c);
+       requires \valid(d);
      */
   void h(int *c, int *d, int k);
 [wp] Warning: Memory model hypotheses for function 's':
   /*@
      behavior typed_ref:
-     requires \separated(c,d);
-     requires \valid(c);
-     requires \valid(d);
+       requires \separated(c, d);
+       requires \valid(c);
+       requires \valid(d);
      */
   void s(int **c, int **d, int k);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/alias_assigns_hypotheses.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/alias_assigns_hypotheses.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..33a25d793ff22746cb810bbf039b5d65e0bc4bf5
--- /dev/null
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/alias_assigns_hypotheses.res.oracle
@@ -0,0 +1,109 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_hoare/alias_assigns_hypotheses.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 30 goals scheduled
+[wp] [Qed] Goal typed_global_alias_ensures : Valid
+[wp] [Qed] Goal typed_global_alias_ensures_2 : Valid
+[wp] [Qed] Goal typed_global_alias_assigns : Valid
+[wp] [Qed] Goal typed_global_no_alias_ensures : Valid
+[wp] [Qed] Goal typed_global_no_alias_assigns : Valid
+[wp] [Qed] Goal typed_formal_alias_ensures : Valid
+[wp] [Qed] Goal typed_formal_alias_ensures_2 : Valid
+[wp] [Qed] Goal typed_formal_alias_assigns : Valid
+[wp] [Qed] Goal typed_formal_no_alias_ensures : Valid
+[wp] [Qed] Goal typed_formal_no_alias_assigns : Valid
+[wp] [Qed] Goal typed_formal_alias_array_ensures : Valid
+[wp] [Qed] Goal typed_formal_alias_array_ensures_2 : Valid
+[wp] [Qed] Goal typed_formal_alias_array_ensures_3 : Valid
+[wp] [Qed] Goal typed_formal_alias_array_assigns_part1 : Valid
+[wp] [Qed] Goal typed_formal_alias_array_assigns_part2 : Valid
+[wp] [Qed] Goal typed_field_alias_ensures : Valid
+[wp] [Qed] Goal typed_field_alias_ensures_2 : Valid
+[wp] [Qed] Goal typed_field_alias_assigns : Valid
+[wp] [Qed] Goal typed_field_range_alias_ensures : Valid
+[wp] [Qed] Goal typed_field_range_alias_ensures_2 : Valid
+[wp] [Qed] Goal typed_field_range_alias_assigns : Valid
+[wp] [Qed] Goal typed_set_alias_ensures : Valid
+[wp] [Qed] Goal typed_set_alias_ensures_2 : Valid
+[wp] [Qed] Goal typed_set_alias_assigns : Valid
+[wp] [Qed] Goal typed_comprehension_alias_ensures : Valid
+[wp] [Qed] Goal typed_comprehension_alias_ensures_2 : Valid
+[wp] [Qed] Goal typed_comprehension_alias_assigns : Valid
+[wp] [Qed] Goal typed_union_alias_ensures : Valid
+[wp] [Qed] Goal typed_union_alias_ensures_2 : Valid
+[wp] [Qed] Goal typed_union_alias_assigns : Valid
+[wp] Proved goals:   30 / 30
+  Qed:            30
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  global_alias              3        -        3       100%
+  global_no_alias           2        -        2       100%
+  formal_alias              3        -        3       100%
+  formal_no_alias           2        -        2       100%
+  formal_alias_array        5        -        5       100%
+  field_alias               3        -        3       100%
+  field_range_alias         3        -        3       100%
+  set_alias                 3        -        3       100%
+  comprehension_alias       3        -        3       100%
+  union_alias               3        -        3       100%
+------------------------------------------------------------
+[wp] Warning: Memory model hypotheses for function 'global_alias':
+  /*@
+     behavior typed:
+       requires \separated(g_alias, (int *)global + (..), &g_alias);
+     */
+  void global_alias(void);
+[wp] Warning: Memory model hypotheses for function 'global_no_alias':
+  /*@ behavior typed:
+        requires \separated(g_alias, &g_alias); */
+  void global_no_alias(void);
+[wp] Warning: Memory model hypotheses for function 'formal_alias':
+  /*@ behavior typed:
+        requires \separated(f_alias, (int *)global + (..)); */
+  void formal_alias(int *f_alias);
+[wp] Warning: Memory model hypotheses for function 'formal_alias_array':
+  /*@
+     behavior typed:
+       requires \separated((int *)global + (..), &(*alias_array)[0 .. 1]);
+       requires \separated(alias_array + (..), (int *)global + (..));
+     */
+  void formal_alias_array(int (*alias_array)[2]);
+[wp] Warning: Memory model hypotheses for function 'field_alias':
+  /*@
+     behavior typed:
+       requires \separated((int *)global + (..), &x->x);
+       requires \separated(x, (int *)global + (..));
+     */
+  void field_alias(struct X *x);
+[wp] Warning: Memory model hypotheses for function 'field_range_alias':
+  /*@
+     behavior typed:
+       requires \separated((int *)global + (..), &(x + (0 .. 3))->x);
+       requires \separated(x + (..), (int *)global + (..));
+     */
+  void field_range_alias(struct X *x);
+[wp] Warning: Memory model hypotheses for function 'set_alias':
+  /*@
+     behavior typed:
+       requires \separated((int *)global + (..), &g_alias, {g_alias, f_alias});
+       requires \separated(f_alias, (int *)global + (..), &g_alias);
+     */
+  void set_alias(int *f_alias);
+[wp] Warning: Memory model hypotheses for function 'comprehension_alias':
+  /*@
+     behavior typed:
+       requires
+         \separated(
+           (int *)global + (..), &g_alias,
+           {alias | int *alias; alias ≡ \at(g_alias,Pre)}
+           );
+     */
+  void comprehension_alias(void);
+[wp] Warning: Memory model hypotheses for function 'union_alias':
+  /*@
+     behavior typed:
+       requires \separated((int *)global + (..), &g_alias, {g_alias, f_alias});
+       requires \separated(f_alias, (int *)global + (..), &g_alias);
+     */
+  void union_alias(int *f_alias);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/byref.0.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/byref.0.res.oracle
index 056f3917be7886b84ea979f282a51f6e457c3a76..0b6ce2d0287b4891e9671afb5c1289c56e821b62 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/byref.0.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/byref.0.res.oracle
@@ -1,21 +1,20 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_hoare/byref.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 12 goals scheduled
 [wp] [Qed] Goal typed_f_ensures : Valid
 [wp] [Qed] Goal typed_f_assigns : Valid
+[wp] [Qed] Goal typed_wrong_without_ref_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_wrong_without_ref_call_f_requires : Unsuccess
+[wp] [Qed] Goal typed_pointer_ensures : Valid
+[wp] [Qed] Goal typed_pointer_call_f_requires : Valid
+[wp] [Qed] Goal typed_local_ensures : Valid
+[wp] [Qed] Goal typed_local_call_f_requires : Valid
 [wp] [Qed] Goal typed_formal_ensures : Valid
 [wp] [Qed] Goal typed_formal_call_f_requires : Valid
 [wp] [Qed] Goal typed_global_ensures : Valid
 [wp] [Qed] Goal typed_global_call_f_requires : Valid
-[wp] [Qed] Goal typed_local_ensures : Valid
-[wp] [Qed] Goal typed_local_call_f_requires : Valid
-[wp] [Qed] Goal typed_pointer_ensures : Valid
-[wp] [Qed] Goal typed_pointer_call_f_requires : Valid
-[wp] [Qed] Goal typed_wrong_without_ref_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_wrong_without_ref_call_f_requires : Unsuccess
 [wp] Proved goals:   11 / 12
   Qed:            11 
   Alt-Ergo:        0  (unsuccess: 1)
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/byref.1.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/byref.1.res.oracle
index fabfc588e61698f7b7f50002bf66e59b6cde1fad..48e1936e19564287ad810f53ddca2ccc7767dc19 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/byref.1.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/byref.1.res.oracle
@@ -1,21 +1,20 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/byref.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 12 goals scheduled
 [wp] [Qed] Goal typed_ref_f_ensures : Valid
 [wp] [Qed] Goal typed_ref_f_assigns : Valid
+[wp] [Qed] Goal typed_ref_wrong_without_ref_ensures : Valid
+[wp] [Qed] Goal typed_ref_wrong_without_ref_call_f_requires : Valid
+[wp] [Qed] Goal typed_ref_pointer_ensures : Valid
+[wp] [Qed] Goal typed_ref_pointer_call_f_requires : Valid
+[wp] [Qed] Goal typed_ref_local_ensures : Valid
+[wp] [Qed] Goal typed_ref_local_call_f_requires : Valid
 [wp] [Qed] Goal typed_ref_formal_ensures : Valid
 [wp] [Qed] Goal typed_ref_formal_call_f_requires : Valid
 [wp] [Qed] Goal typed_ref_global_ensures : Valid
 [wp] [Qed] Goal typed_ref_global_call_f_requires : Valid
-[wp] [Qed] Goal typed_ref_local_ensures : Valid
-[wp] [Qed] Goal typed_ref_local_call_f_requires : Valid
-[wp] [Qed] Goal typed_ref_pointer_ensures : Valid
-[wp] [Qed] Goal typed_ref_pointer_call_f_requires : Valid
-[wp] [Qed] Goal typed_ref_wrong_without_ref_ensures : Valid
-[wp] [Qed] Goal typed_ref_wrong_without_ref_call_f_requires : Valid
 [wp] Proved goals:   12 / 12
   Qed:            12
 ------------------------------------------------------------
@@ -28,11 +27,14 @@
   global                    2        -        2       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'f':
-  /*@ behavior typed_ref: requires \valid(r); */
+  /*@ behavior typed_ref:
+        requires \valid(r); */
   void f(int *r);
 [wp] Warning: Memory model hypotheses for function 'wrong_without_ref':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int wrong_without_ref(int *q);
 [wp] Warning: Memory model hypotheses for function 'pointer':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int pointer(int *q);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var.res.oracle
index 0824c5c95dd32122016dcc53c980a5f21e6f38fe..d97c3812bd67b8c5da17e69e66ce4c1cbed3317e 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var.res.oracle
@@ -1,32 +1,8 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/dispatch_var.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 78 goals scheduled
-[wp] [Qed] Goal typed_ref_array_in_struct_param_ensures_Pload2 : Valid
-[wp] [Qed] Goal typed_ref_array_in_struct_param_assigns : Valid
-[wp] [Qed] Goal typed_ref_call_no_ref_bd_ensures_Mem_n5_nr6 : Valid
-[wp] [Qed] Goal typed_ref_call_no_ref_bd_assigns_exit_part1 : Valid
-[wp] [Qed] Goal typed_ref_call_no_ref_bd_assigns_exit_part2 : Valid
-[wp] [Qed] Goal typed_ref_call_no_ref_bd_assigns_exit_part3 : Valid
-[wp] [Qed] Goal typed_ref_call_no_ref_bd_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_ref_call_no_ref_bd_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_ref_call_no_ref_bd_assigns_normal_part3 : Valid
-[wp] [Qed] Goal typed_ref_call_no_ref_bd_assigns_normal_part4 : Valid
-[wp] [Qed] Goal typed_ref_call_no_ref_bd_assigns_normal_part5 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_bd_ensures_Ref_r2 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_bd_assigns_exit : Valid
-[wp] [Qed] Goal typed_ref_call_ref_bd_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_bd_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_bd2_ensures_Mem_n2 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_bd2_assigns_exit_part1 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_bd2_assigns_exit_part2 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_bd2_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_bd2_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_bd2_assigns_normal_part3 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_bd2_assigns_normal_part4 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_bd2_assigns_normal_part5 : Valid
 [wp] [Qed] Goal typed_ref_call_ref_ctr_ensures_Ref_r1 : Valid
 [wp] [Qed] Goal typed_ref_call_ref_ctr_assigns_exit : Valid
 [wp] [Qed] Goal typed_ref_call_ref_ctr_assigns_normal_part1 : Valid
@@ -39,6 +15,43 @@
 [wp] [Qed] Goal typed_ref_call_ref_ctr2_assigns_normal_part3 : Valid
 [wp] [Qed] Goal typed_ref_call_ref_ctr2_assigns_normal_part4 : Valid
 [wp] [Qed] Goal typed_ref_call_ref_ctr2_assigns_normal_part5 : Valid
+[wp] [Qed] Goal typed_ref_ref_bd_ensures : Valid
+[wp] [Qed] Goal typed_ref_ref_bd_assigns : Valid
+[wp] [Qed] Goal typed_ref_call_ref_bd_ensures_Ref_r2 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_bd_assigns_exit : Valid
+[wp] [Qed] Goal typed_ref_call_ref_bd_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_bd_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_bd2_ensures_Mem_n2 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_bd2_assigns_exit_part1 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_bd2_assigns_exit_part2 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_bd2_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_bd2_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_bd2_assigns_normal_part3 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_bd2_assigns_normal_part4 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_bd2_assigns_normal_part5 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_valid_ensures_R7_N4 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_valid_assigns_exit_part1 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_valid_assigns_exit_part2 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_valid_assigns_exit_part3 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_valid_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_valid_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_valid_assigns_normal_part3 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_valid_assigns_normal_part4 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_valid_assigns_normal_part5 : Valid
+[wp] [Qed] Goal typed_ref_call_ref_valid_call_ref_valid_requires : Valid
+[wp] [Qed] Goal typed_ref_call_ref_valid_call_ref_valid_2_requires : Valid
+[wp] [Qed] Goal typed_ref_no_ref_bd_ensures : Valid
+[wp] [Qed] Goal typed_ref_no_ref_bd_assigns_part1 : Valid
+[wp] [Qed] Goal typed_ref_no_ref_bd_assigns_part2 : Valid
+[wp] [Qed] Goal typed_ref_call_no_ref_bd_ensures_Mem_n5_nr6 : Valid
+[wp] [Qed] Goal typed_ref_call_no_ref_bd_assigns_exit_part1 : Valid
+[wp] [Qed] Goal typed_ref_call_no_ref_bd_assigns_exit_part2 : Valid
+[wp] [Qed] Goal typed_ref_call_no_ref_bd_assigns_exit_part3 : Valid
+[wp] [Qed] Goal typed_ref_call_no_ref_bd_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_ref_call_no_ref_bd_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_ref_call_no_ref_bd_assigns_normal_part3 : Valid
+[wp] [Qed] Goal typed_ref_call_no_ref_bd_assigns_normal_part4 : Valid
+[wp] [Qed] Goal typed_ref_call_no_ref_bd_assigns_normal_part5 : Valid
 [wp] [Qed] Goal typed_ref_call_ref_ctr_nr_ensures_R_R_R : Valid
 [wp] [Qed] Goal typed_ref_call_ref_ctr_nr_ensures_R_R_R_2 : Valid
 [wp] [Qed] Goal typed_ref_call_ref_ctr_nr_assigns_exit_part1 : Valid
@@ -55,17 +68,6 @@
 [wp] [Qed] Goal typed_ref_call_ref_ctr_nstars_assigns_normal_part1 : Valid
 [wp] [Qed] Goal typed_ref_call_ref_ctr_nstars_assigns_normal_part2 : Valid
 [wp] [Qed] Goal typed_ref_call_ref_ctr_nstars_assigns_normal_part3 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_valid_ensures_R7_N4 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_valid_assigns_exit_part1 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_valid_assigns_exit_part2 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_valid_assigns_exit_part3 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_valid_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_valid_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_valid_assigns_normal_part3 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_valid_assigns_normal_part4 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_valid_assigns_normal_part5 : Valid
-[wp] [Qed] Goal typed_ref_call_ref_valid_call_ref_valid_requires : Valid
-[wp] [Qed] Goal typed_ref_call_ref_valid_call_ref_valid_2_requires : Valid
 [wp] [Qed] Goal typed_ref_call_two_ref_ensures : Valid
 [wp] [Qed] Goal typed_ref_call_two_ref_assigns_exit_part1 : Valid
 [wp] [Qed] Goal typed_ref_call_two_ref_assigns_exit_part2 : Valid
@@ -77,11 +79,8 @@
 [wp] [Qed] Goal typed_ref_g_assigns_exit : Valid
 [wp] [Qed] Goal typed_ref_g_assigns_normal_part1 : Valid
 [wp] [Qed] Goal typed_ref_g_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_ref_no_ref_bd_ensures : Valid
-[wp] [Qed] Goal typed_ref_no_ref_bd_assigns_part1 : Valid
-[wp] [Qed] Goal typed_ref_no_ref_bd_assigns_part2 : Valid
-[wp] [Qed] Goal typed_ref_ref_bd_ensures : Valid
-[wp] [Qed] Goal typed_ref_ref_bd_assigns : Valid
+[wp] [Qed] Goal typed_ref_array_in_struct_param_ensures_Pload2 : Valid
+[wp] [Qed] Goal typed_ref_array_in_struct_param_assigns : Valid
 [wp] Proved goals:   78 / 78
   Qed:            78
 ------------------------------------------------------------
@@ -101,8 +100,10 @@
   array_in_struct_param     2        -        2       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'ref_bd':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int ref_bd(int *q);
 [wp] Warning: Memory model hypotheses for function 'g':
-  /*@ behavior typed_ref: requires \valid(pg); */
+  /*@ behavior typed_ref:
+        requires \valid(pg); */
   int g(int *pg);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.0.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.0.res.oracle
index c472b2c06f3347455cd43b7941e613ac1558a80e..b5878139820eb2eed4ceb79df18a6690a4635426 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.0.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.0.res.oracle
@@ -1,23 +1,20 @@
 # frama-c -wp -wp-model 'Typed (Ref)' -wp-no-let [...]
 [kernel] Parsing tests/wp_hoare/dispatch_var2.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 34 goals scheduled
+[wp] [Qed] Goal typed_ref_reset_ensures : Valid
+[wp] [Qed] Goal typed_ref_reset_assigns : Valid
+[wp] [Qed] Goal typed_ref_incr_ensures : Valid
+[wp] [Qed] Goal typed_ref_incr_assigns : Valid
+[wp] [Qed] Goal typed_ref_load_ensures : Valid
+[wp] [Qed] Goal typed_ref_load_assigns : Valid
 [wp] [Qed] Goal typed_ref_call_global_ensures : Valid
 [wp] [Qed] Goal typed_ref_call_global_assigns_exit : Valid
 [wp] [Qed] Goal typed_ref_call_global_assigns_normal_part1 : Valid
 [wp] [Qed] Goal typed_ref_call_global_assigns_normal_part2 : Valid
 [wp] [Qed] Goal typed_ref_call_global_call_reset_requires : Valid
 [wp] [Qed] Goal typed_ref_call_global_call_load_requires : Valid
-[wp] [Qed] Goal typed_ref_call_local_ensures : Valid
-[wp] [Qed] Goal typed_ref_call_local_assigns_exit_part1 : Valid
-[wp] [Qed] Goal typed_ref_call_local_assigns_exit_part2 : Valid
-[wp] [Qed] Goal typed_ref_call_local_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_ref_call_local_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_ref_call_local_assigns_normal_part3 : Valid
-[wp] [Qed] Goal typed_ref_call_local_call_reset_requires : Valid
-[wp] [Qed] Goal typed_ref_call_local_call_load_requires : Valid
 [wp] [Qed] Goal typed_ref_call_param_ensures : Valid
 [wp] [Qed] Goal typed_ref_call_param_assigns_exit_part1 : Valid
 [wp] [Qed] Goal typed_ref_call_param_assigns_exit_part2 : Valid
@@ -26,18 +23,20 @@
 [wp] [Qed] Goal typed_ref_call_param_assigns_normal_part3 : Valid
 [wp] [Qed] Goal typed_ref_call_param_call_reset_requires : Valid
 [wp] [Qed] Goal typed_ref_call_param_call_load_requires : Valid
+[wp] [Qed] Goal typed_ref_call_local_ensures : Valid
+[wp] [Qed] Goal typed_ref_call_local_assigns_exit_part1 : Valid
+[wp] [Qed] Goal typed_ref_call_local_assigns_exit_part2 : Valid
+[wp] [Qed] Goal typed_ref_call_local_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_ref_call_local_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_ref_call_local_assigns_normal_part3 : Valid
+[wp] [Qed] Goal typed_ref_call_local_call_reset_requires : Valid
+[wp] [Qed] Goal typed_ref_call_local_call_load_requires : Valid
 [wp] [Qed] Goal typed_ref_call_param_ref_ensures : Valid
 [wp] [Qed] Goal typed_ref_call_param_ref_assigns_exit : Valid
 [wp] [Qed] Goal typed_ref_call_param_ref_assigns_normal_part1 : Valid
 [wp] [Qed] Goal typed_ref_call_param_ref_assigns_normal_part2 : Valid
 [wp] [Qed] Goal typed_ref_call_param_ref_call_reset_requires : Valid
 [wp] [Qed] Goal typed_ref_call_param_ref_call_load_requires : Valid
-[wp] [Qed] Goal typed_ref_incr_ensures : Valid
-[wp] [Qed] Goal typed_ref_incr_assigns : Valid
-[wp] [Qed] Goal typed_ref_load_ensures : Valid
-[wp] [Qed] Goal typed_ref_load_assigns : Valid
-[wp] [Qed] Goal typed_ref_reset_ensures : Valid
-[wp] [Qed] Goal typed_ref_reset_assigns : Valid
 [wp] Proved goals:   34 / 34
   Qed:            34
 ------------------------------------------------------------
@@ -51,14 +50,18 @@
   call_param_ref            6        -        6       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref: requires \valid(rp); */
+  /*@ behavior typed_ref:
+        requires \valid(rp); */
   void reset(int *rp);
 [wp] Warning: Memory model hypotheses for function 'incr':
-  /*@ behavior typed_ref: requires \valid(ip); */
+  /*@ behavior typed_ref:
+        requires \valid(ip); */
   void incr(int *ip);
 [wp] Warning: Memory model hypotheses for function 'load':
-  /*@ behavior typed_ref: requires \valid(lp); */
+  /*@ behavior typed_ref:
+        requires \valid(lp); */
   int load(int *lp);
 [wp] Warning: Memory model hypotheses for function 'call_param_ref':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int call_param_ref(int *q);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.1.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.1.res.oracle
index 3996bedbab0c49a1ef56b6ee221173adfd897428..7a50ede52eb9de48083e80185e8fbe5291b9697e 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.1.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.1.res.oracle
@@ -1,23 +1,20 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/dispatch_var2.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 34 goals scheduled
+[wp] [Qed] Goal typed_ref_reset_ensures : Valid
+[wp] [Qed] Goal typed_ref_reset_assigns : Valid
+[wp] [Qed] Goal typed_ref_incr_ensures : Valid
+[wp] [Qed] Goal typed_ref_incr_assigns : Valid
+[wp] [Qed] Goal typed_ref_load_ensures : Valid
+[wp] [Qed] Goal typed_ref_load_assigns : Valid
 [wp] [Qed] Goal typed_ref_call_global_ensures : Valid
 [wp] [Qed] Goal typed_ref_call_global_assigns_exit : Valid
 [wp] [Qed] Goal typed_ref_call_global_assigns_normal_part1 : Valid
 [wp] [Qed] Goal typed_ref_call_global_assigns_normal_part2 : Valid
 [wp] [Qed] Goal typed_ref_call_global_call_reset_requires : Valid
 [wp] [Qed] Goal typed_ref_call_global_call_load_requires : Valid
-[wp] [Qed] Goal typed_ref_call_local_ensures : Valid
-[wp] [Qed] Goal typed_ref_call_local_assigns_exit_part1 : Valid
-[wp] [Qed] Goal typed_ref_call_local_assigns_exit_part2 : Valid
-[wp] [Qed] Goal typed_ref_call_local_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_ref_call_local_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_ref_call_local_assigns_normal_part3 : Valid
-[wp] [Qed] Goal typed_ref_call_local_call_reset_requires : Valid
-[wp] [Qed] Goal typed_ref_call_local_call_load_requires : Valid
 [wp] [Qed] Goal typed_ref_call_param_ensures : Valid
 [wp] [Qed] Goal typed_ref_call_param_assigns_exit_part1 : Valid
 [wp] [Qed] Goal typed_ref_call_param_assigns_exit_part2 : Valid
@@ -26,18 +23,20 @@
 [wp] [Qed] Goal typed_ref_call_param_assigns_normal_part3 : Valid
 [wp] [Qed] Goal typed_ref_call_param_call_reset_requires : Valid
 [wp] [Qed] Goal typed_ref_call_param_call_load_requires : Valid
+[wp] [Qed] Goal typed_ref_call_local_ensures : Valid
+[wp] [Qed] Goal typed_ref_call_local_assigns_exit_part1 : Valid
+[wp] [Qed] Goal typed_ref_call_local_assigns_exit_part2 : Valid
+[wp] [Qed] Goal typed_ref_call_local_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_ref_call_local_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_ref_call_local_assigns_normal_part3 : Valid
+[wp] [Qed] Goal typed_ref_call_local_call_reset_requires : Valid
+[wp] [Qed] Goal typed_ref_call_local_call_load_requires : Valid
 [wp] [Qed] Goal typed_ref_call_param_ref_ensures : Valid
 [wp] [Qed] Goal typed_ref_call_param_ref_assigns_exit : Valid
 [wp] [Qed] Goal typed_ref_call_param_ref_assigns_normal_part1 : Valid
 [wp] [Qed] Goal typed_ref_call_param_ref_assigns_normal_part2 : Valid
 [wp] [Qed] Goal typed_ref_call_param_ref_call_reset_requires : Valid
 [wp] [Qed] Goal typed_ref_call_param_ref_call_load_requires : Valid
-[wp] [Qed] Goal typed_ref_incr_ensures : Valid
-[wp] [Qed] Goal typed_ref_incr_assigns : Valid
-[wp] [Qed] Goal typed_ref_load_ensures : Valid
-[wp] [Qed] Goal typed_ref_load_assigns : Valid
-[wp] [Qed] Goal typed_ref_reset_ensures : Valid
-[wp] [Qed] Goal typed_ref_reset_assigns : Valid
 [wp] Proved goals:   34 / 34
   Qed:            34
 ------------------------------------------------------------
@@ -51,14 +50,18 @@
   call_param_ref            6        -        6       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref: requires \valid(rp); */
+  /*@ behavior typed_ref:
+        requires \valid(rp); */
   void reset(int *rp);
 [wp] Warning: Memory model hypotheses for function 'incr':
-  /*@ behavior typed_ref: requires \valid(ip); */
+  /*@ behavior typed_ref:
+        requires \valid(ip); */
   void incr(int *ip);
 [wp] Warning: Memory model hypotheses for function 'load':
-  /*@ behavior typed_ref: requires \valid(lp); */
+  /*@ behavior typed_ref:
+        requires \valid(lp); */
   int load(int *lp);
 [wp] Warning: Memory model hypotheses for function 'call_param_ref':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int call_param_ref(int *q);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/isHoare.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/isHoare.res.oracle
index dcf9b471da8aeb29ffed257e2a9288a50048c45c..04d5a4f2629e07014d67d846237693ab7173469d 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/isHoare.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/isHoare.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/isHoare.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Qed] Goal typed_ref_cmp_invalid_addr_as_int_ensures_ok : Valid
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/logicarr.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/logicarr.res.oracle
index cd7e781214bef23a9c3d082a914160a6d2aa1999..efe1f7fdd1764a4ad45bbfb19fcdcd8323071f27 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/logicarr.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/logicarr.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_hoare/logicarr.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
 [wp] [Alt-Ergo] Goal typed_job_ensures_PTR : Valid
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/logicref.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/logicref.res.oracle
index d2264fc7e594395b5aaf858d4dc2c24fb18c410f..1c127a17545a9535c8a1e6cecf08379654f649e9 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/logicref.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/logicref.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/logicref.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 5 goals scheduled
 [wp] [Qed] Goal typed_ref_fvrange_n_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/logicref_simple.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/logicref_simple.res.oracle
index 44f733dcecfead44d7ced192fa7dd8d0f7e8460d..061f51954cab858b515c5e3320d909ba303ed652 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/logicref_simple.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/logicref_simple.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/logicref_simple.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 9 goals scheduled
 [wp] [Alt-Ergo] Goal typed_ref_fsimple_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference.res.oracle
index 4ff3c1673ecaaf07a95846a27e9b3c0e78eab007..81897c8db12744ff443786b8e730f7f1adcccc89 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference.res.oracle
@@ -1,9 +1,15 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/reference.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 23 goals scheduled
+[wp] [Qed] Goal typed_ref_g_ensures : Valid
+[wp] [Qed] Goal typed_ref_g_assigns_exit_part1 : Valid
+[wp] [Qed] Goal typed_ref_g_assigns_exit_part2 : Valid
+[wp] [Qed] Goal typed_ref_g_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_ref_g_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_ref_g_assigns_normal_part3 : Valid
+[wp] [Qed] Goal typed_ref_g_call_f_requires : Valid
 [wp] [Qed] Goal typed_ref_call_f2_ensures : Valid
 [wp] [Qed] Goal typed_ref_call_f2_assigns_exit_part1 : Valid
 [wp] [Qed] Goal typed_ref_call_f2_assigns_exit_part2 : Valid
@@ -18,13 +24,6 @@
 [wp] [Qed] Goal typed_ref_call_global_assigns_normal_part1 : Valid
 [wp] [Qed] Goal typed_ref_call_global_assigns_normal_part2 : Valid
 [wp] [Qed] Goal typed_ref_call_global_call_f_requires : Valid
-[wp] [Qed] Goal typed_ref_g_ensures : Valid
-[wp] [Qed] Goal typed_ref_g_assigns_exit_part1 : Valid
-[wp] [Qed] Goal typed_ref_g_assigns_exit_part2 : Valid
-[wp] [Qed] Goal typed_ref_g_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_ref_g_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_ref_g_assigns_normal_part3 : Valid
-[wp] [Qed] Goal typed_ref_g_call_f_requires : Valid
 [wp] [Qed] Goal typed_ref_write_ensures : Valid
 [wp] [Qed] Goal typed_ref_write_assigns : Valid
 [wp] Proved goals:   21 / 23
@@ -38,11 +37,14 @@
   write                     2        -        2       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'call_f2':
-  /*@ behavior typed_ref: requires \valid(ptr); */
+  /*@ behavior typed_ref:
+        requires \valid(ptr); */
   int call_f2(int *ptr, int y);
 [wp] Warning: Memory model hypotheses for function 'call_global':
-  /*@ behavior typed_ref: requires \valid(gl); */
+  /*@ behavior typed_ref:
+        requires \valid(gl); */
   int call_global(void);
 [wp] Warning: Memory model hypotheses for function 'write':
-  /*@ behavior typed_ref: requires \valid(pa); */
+  /*@ behavior typed_ref:
+        requires \valid(pa); */
   void write(int kb, int *pa);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_and_struct.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_and_struct.res.oracle
index ba67c0b6dab92d444a10fe22484cbf0e24dee552..9da7484d4d2dbe1ef5e6c0d68b4f796d572e69ac 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_and_struct.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_and_struct.res.oracle
@@ -1,41 +1,40 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/reference_and_struct.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 32 goals scheduled
-[wp] [Qed] Goal typed_ref_call_array_in_struct_param_ensures_Pload2 : Valid
-[wp] [Qed] Goal typed_ref_call_array_in_struct_param_ensures_Pload3 : Valid
-[wp] [Qed] Goal typed_ref_call_array_in_struct_param_assigns_exit : Valid
-[wp] [Qed] Goal typed_ref_call_array_in_struct_param_assigns_normal : Valid
-[wp] [Qed] Goal typed_ref_call_array_in_struct_param_call_load_5_requires : Valid
-[wp] [Alt-Ergo] Goal typed_ref_call_on_array_in_struct_global_ensures_Pload : Valid
-[wp] [Qed] Goal typed_ref_call_on_array_in_struct_global_assigns_exit : Valid
-[wp] [Qed] Goal typed_ref_call_on_array_in_struct_global_assigns_normal : Valid
-[wp] [Qed] Goal typed_ref_call_on_array_in_struct_global_call_load_5_requires : Valid
+[wp] [Qed] Goal typed_ref_reset_ensures : Valid
+[wp] [Qed] Goal typed_ref_reset_assigns : Valid
 [wp] [Qed] Goal typed_ref_call_reset_ensures : Valid
 [wp] [Qed] Goal typed_ref_call_reset_assigns_exit : Valid
 [wp] [Qed] Goal typed_ref_call_reset_assigns_normal_part1 : Valid
 [wp] [Qed] Goal typed_ref_call_reset_assigns_normal_part2 : Valid
 [wp] [Qed] Goal typed_ref_call_reset_call_reset_requires : Valid
-[wp] [Alt-Ergo] Goal typed_ref_call_reset_1_5_ensures_Presset_mat : Valid
-[wp] [Qed] Goal typed_ref_call_reset_1_5_assigns_exit : Valid
-[wp] [Qed] Goal typed_ref_call_reset_1_5_assigns_normal : Valid
-[wp] [Qed] Goal typed_ref_call_reset_1_5_call_reset_1_5_requires : Valid
 [wp] [Alt-Ergo] Goal typed_ref_call_reset_5_ensures_Preset_5 : Valid
 [wp] [Qed] Goal typed_ref_call_reset_5_assigns_exit : Valid
 [wp] [Qed] Goal typed_ref_call_reset_5_assigns_normal : Valid
 [wp] [Qed] Goal typed_ref_call_reset_5_call_reset_5_requires : Valid
-[wp] [Alt-Ergo] Goal typed_ref_call_reset_5_dim2_ensures_Presset_mat : Valid
-[wp] [Qed] Goal typed_ref_call_reset_5_dim2_assigns_exit : Valid
-[wp] [Qed] Goal typed_ref_call_reset_5_dim2_assigns_normal : Valid
-[wp] [Qed] Goal typed_ref_call_reset_5_dim2_call_reset_5_requires : Valid
 [wp] [Alt-Ergo] Goal typed_ref_call_reset_5_tps_ensures_Preset_5_tps : Valid
 [wp] [Qed] Goal typed_ref_call_reset_5_tps_assigns_exit : Valid
 [wp] [Qed] Goal typed_ref_call_reset_5_tps_assigns_normal : Valid
 [wp] [Qed] Goal typed_ref_call_reset_5_tps_call_reset_5_requires : Valid
-[wp] [Qed] Goal typed_ref_reset_ensures : Valid
-[wp] [Qed] Goal typed_ref_reset_assigns : Valid
+[wp] [Alt-Ergo] Goal typed_ref_call_reset_1_5_ensures_Presset_mat : Valid
+[wp] [Qed] Goal typed_ref_call_reset_1_5_assigns_exit : Valid
+[wp] [Qed] Goal typed_ref_call_reset_1_5_assigns_normal : Valid
+[wp] [Qed] Goal typed_ref_call_reset_1_5_call_reset_1_5_requires : Valid
+[wp] [Alt-Ergo] Goal typed_ref_call_reset_5_dim2_ensures_Presset_mat : Valid
+[wp] [Qed] Goal typed_ref_call_reset_5_dim2_assigns_exit : Valid
+[wp] [Qed] Goal typed_ref_call_reset_5_dim2_assigns_normal : Valid
+[wp] [Qed] Goal typed_ref_call_reset_5_dim2_call_reset_5_requires : Valid
+[wp] [Alt-Ergo] Goal typed_ref_call_on_array_in_struct_global_ensures_Pload : Valid
+[wp] [Qed] Goal typed_ref_call_on_array_in_struct_global_assigns_exit : Valid
+[wp] [Qed] Goal typed_ref_call_on_array_in_struct_global_assigns_normal : Valid
+[wp] [Qed] Goal typed_ref_call_on_array_in_struct_global_call_load_5_requires : Valid
+[wp] [Qed] Goal typed_ref_call_array_in_struct_param_ensures_Pload2 : Valid
+[wp] [Qed] Goal typed_ref_call_array_in_struct_param_ensures_Pload3 : Valid
+[wp] [Qed] Goal typed_ref_call_array_in_struct_param_assigns_exit : Valid
+[wp] [Qed] Goal typed_ref_call_array_in_struct_param_assigns_normal : Valid
+[wp] [Qed] Goal typed_ref_call_array_in_struct_param_call_load_5_requires : Valid
 [wp] Proved goals:   32 / 32
   Qed:            27 
   Alt-Ergo:        5
@@ -51,5 +50,12 @@
   call_array_in_struct_param   5     -        5       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref: requires \valid(p); */
+  /*@ behavior typed_ref:
+        requires \valid(p); */
   void reset(struct T *p);
+[wp] Warning: Memory model hypotheses for function 'call_reset_5_tps':
+  /*@
+     behavior typed_ref:
+       requires \separated((struct T **)tps + (..), tps[9] + (0 .. 4));
+     */
+  void call_reset_5_tps(void);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_array.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_array.res.oracle
index 72ab30d0d2f37fddb5c97a37a325cc0e5d441a49..5fa325b91701864750b7557fa6443415d74dbdb9 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_array.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_array.res.oracle
@@ -1,9 +1,16 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/reference_array.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 36 goals scheduled
+[wp] [Alt-Ergo] Goal typed_ref_reset_1_5_ensures : Valid
+[wp] [Qed] Goal typed_ref_reset_1_5_assigns_exit : Valid
+[wp] [Qed] Goal typed_ref_reset_1_5_assigns_normal : Valid
+[wp] [Qed] Goal typed_ref_reset_1_5_call_reset_5_requires : Valid
+[wp] [Alt-Ergo] Goal typed_ref_load_1_5_ensures : Valid
+[wp] [Qed] Goal typed_ref_load_1_5_assigns_exit : Valid
+[wp] [Qed] Goal typed_ref_load_1_5_assigns_normal : Valid
+[wp] [Qed] Goal typed_ref_load_1_5_call_load_5_requires : Valid
 [wp] [Alt-Ergo] Goal typed_ref_add_1_5_ensures : Valid
 [wp] [Qed] Goal typed_ref_add_1_5_assigns_exit : Valid
 [wp] [Qed] Goal typed_ref_add_1_5_assigns_normal : Valid
@@ -16,14 +23,6 @@
 [wp] [Qed] Goal typed_ref_calls_on_array_dim_1_call_load_5_requires : Valid
 [wp] [Qed] Goal typed_ref_calls_on_array_dim_1_call_reset_5_requires : Valid
 [wp] [Qed] Goal typed_ref_calls_on_array_dim_1_call_add_5_requires : Valid
-[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_ensures_Pload : Valid
-[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_ensures_Preset : Valid
-[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_ensures_Padd : Valid
-[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_assigns_exit : Valid
-[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_assigns_normal : Valid
-[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_call_load_1_5_requires : Valid
-[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_call_reset_1_5_requires : Valid
-[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_call_add_1_5_requires : Valid
 [wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_to_1_ensures_Pload : Valid
 [wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_to_1_ensures_Preset : Valid
 [wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_to_1_ensures_Padd : Valid
@@ -32,14 +31,14 @@
 [wp] [Qed] Goal typed_ref_calls_on_array_dim_2_to_1_call_load_5_requires : Valid
 [wp] [Qed] Goal typed_ref_calls_on_array_dim_2_to_1_call_reset_5_requires : Valid
 [wp] [Qed] Goal typed_ref_calls_on_array_dim_2_to_1_call_add_5_requires : Valid
-[wp] [Alt-Ergo] Goal typed_ref_load_1_5_ensures : Valid
-[wp] [Qed] Goal typed_ref_load_1_5_assigns_exit : Valid
-[wp] [Qed] Goal typed_ref_load_1_5_assigns_normal : Valid
-[wp] [Qed] Goal typed_ref_load_1_5_call_load_5_requires : Valid
-[wp] [Alt-Ergo] Goal typed_ref_reset_1_5_ensures : Valid
-[wp] [Qed] Goal typed_ref_reset_1_5_assigns_exit : Valid
-[wp] [Qed] Goal typed_ref_reset_1_5_assigns_normal : Valid
-[wp] [Qed] Goal typed_ref_reset_1_5_call_reset_5_requires : Valid
+[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_ensures_Pload : Valid
+[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_ensures_Preset : Valid
+[wp] [Alt-Ergo] Goal typed_ref_calls_on_array_dim_2_ensures_Padd : Valid
+[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_assigns_exit : Valid
+[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_assigns_normal : Valid
+[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_call_load_1_5_requires : Valid
+[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_call_reset_1_5_requires : Valid
+[wp] [Qed] Goal typed_ref_calls_on_array_dim_2_call_add_1_5_requires : Valid
 [wp] Proved goals:   36 / 36
   Qed:            24 
   Alt-Ergo:       12
@@ -53,11 +52,15 @@
   calls_on_array_dim_2      5        3        8       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'load_1_5':
-  /*@ behavior typed_ref: requires \separated(reg_load+(..),lp+(..)); */
+  /*@
+     behavior typed_ref:
+       requires \separated(lp + (..), (int *)reg_load + (..));
+     */
   void load_1_5(int (*lp)[5]);
 [wp] Warning: Memory model hypotheses for function 'add_1_5':
   /*@
      behavior typed_ref:
-     requires \separated(\union(reg_load+(..),reg_add+(..)),ap+(..));
+       requires
+         \separated(ap + (..), (int *)reg_load + (..), (int *)reg_add + (..));
      */
   void add_1_5(int (*ap)[5]);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_array_simple.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_array_simple.res.oracle
index a53989661a59d05f01cb02906e4df9b7f55de9e3..b5390221da4d396ad6e3c0fdb1de95711c8dad3d 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_array_simple.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_array_simple.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/reference_array_simple.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
 [wp] [Qed] Goal typed_ref_call_f1_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/refguards.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/refguards.res.oracle
index b61a8f43c6af24e470d75344f190a40f41b4e534..02a4bffe2c4d64132a21a44142ddcf9bf1b3f99f 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/refguards.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/refguards.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_hoare/refguards.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 9 goals scheduled
 [wp] [Qed] Goal typed_ref_f_ensures : Valid
@@ -26,24 +25,24 @@
 [wp] Warning: Memory model hypotheses for function 'f':
   /*@
      behavior typed_ref:
-     requires \separated(c,d,\union(a+(..),b+(..)));
-     requires \valid(c);
-     requires \valid(d);
+       requires \separated(c, d, {a + (..), b + (..)});
+       requires \valid(c);
+       requires \valid(d);
      */
   void f(int *a, int *b, int *c, int *d, int k);
 [wp] Warning: Memory model hypotheses for function 'h':
   /*@
      behavior typed_ref:
-     requires \separated(c,d);
-     requires \valid(c);
-     requires \valid(d);
+       requires \separated(c, d);
+       requires \valid(c);
+       requires \valid(d);
      */
   void h(int *c, int *d, int k);
 [wp] Warning: Memory model hypotheses for function 's':
   /*@
      behavior typed_ref:
-     requires \separated(c,d);
-     requires \valid(c);
-     requires \valid(d);
+       requires \separated(c, d);
+       requires \valid(c);
+       requires \valid(d);
      */
   void s(int **c, int **d, int k);
diff --git a/src/plugins/wp/tests/wp_manual/oracle_qualif/manual.0.res.oracle b/src/plugins/wp/tests/wp_manual/oracle_qualif/manual.0.res.oracle
index 676668f5c0a548d7a5163c8192bd30734112bb34..213ee06d29f83d84f773c31e96b4e084d01aa723 100644
--- a/src/plugins/wp/tests/wp_manual/oracle_qualif/manual.0.res.oracle
+++ b/src/plugins/wp/tests/wp_manual/oracle_qualif/manual.0.res.oracle
@@ -3,7 +3,6 @@
 [kernel] Parsing tests/wp_manual/working_dir/swap.c (with preprocessing)
 [kernel] Parsing tests/wp_manual/working_dir/swap1.h (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Alt-Ergo] Goal typed_swap_ensures_A : Valid
diff --git a/src/plugins/wp/tests/wp_manual/oracle_qualif/manual.1.res.oracle b/src/plugins/wp/tests/wp_manual/oracle_qualif/manual.1.res.oracle
index 7eeef9271651414998f73b1f345cec06219521f3..4f1030ab27018000d462c3def8e475fbbfc77d40 100644
--- a/src/plugins/wp/tests/wp_manual/oracle_qualif/manual.1.res.oracle
+++ b/src/plugins/wp/tests/wp_manual/oracle_qualif/manual.1.res.oracle
@@ -3,7 +3,6 @@
 [kernel] Parsing tests/wp_manual/working_dir/swap.c (with preprocessing)
 [kernel] Parsing tests/wp_manual/working_dir/swap2.h (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function swap
 [wp] 8 goals scheduled
 [wp] [Alt-Ergo] Goal typed_swap_ensures_A : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/no_step_limit.conf b/src/plugins/wp/tests/wp_plugin/no_step_limit.conf
new file mode 100644
index 0000000000000000000000000000000000000000..8431029cc72c4dc267bef9b413c03d74406ae297
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/no_step_limit.conf
@@ -0,0 +1,13 @@
+[main]
+default_editor = "editor %f"
+magic = 14
+memlimit = 1000
+running_provers_max = 2
+timelimit = 5
+
+[prover]
+command = "alt-ergo -timelimit %t %f"
+driver = "alt_ergo_2_2_0"
+in_place = false
+interactive = false
+name = "no-steps"
diff --git a/src/plugins/wp/tests/wp_plugin/no_step_limit.i b/src/plugins/wp/tests/wp_plugin/no_step_limit.i
new file mode 100644
index 0000000000000000000000000000000000000000..2d5745aa584f56360e7e8ae129266313c25b514c
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/no_step_limit.i
@@ -0,0 +1,10 @@
+/* run.config
+  DONTRUN:
+*/
+/* run.config_qualif
+  CMD: WHY3CONFIG=@PTEST_DIR@/@PTEST_NAME@.conf @frama-c@
+  OPT: -wp -wp-prover no-steps -wp-steps 10 -wp-msg-key shell
+*/
+/*@
+  lemma truc: \false ;
+*/
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/abs.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/abs.res.oracle
index 64ce1c0a27564d7e608fa737f9a2a34baaf37eae..9a4cc9410828748161c0e18f9d4f8515b1f360ea 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/abs.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/abs.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/abs.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function abs
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/asm.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/asm.res.oracle
index 250316f99ababe8ff0682c771fc78d39006f344b..0f8a43912a0cc578bfd602dbfe6432b3a3911553 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/asm.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/asm.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/asm.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/bit_test.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/bit_test.res.oracle
index e56158295b1cdb7d71133f15a396221cf4c508d0..1296b169a5ddc881354e6e23094e3e9b0164a1e5 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/bit_test.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/bit_test.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/bit_test.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function check1
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/bool.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/bool.res.oracle
index c80bbdfdc621cb262f494654e932dfd5f413cd53..fd6a26d1a47e1e500fb53783e6de294dceaf19ab 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/bool.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/bool.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-no-let [...]
 [kernel] Parsing tests/wp_plugin/bool.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function band_bool with behavior false
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/call.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/call.res.oracle
index 62179a864c565fca093d10951859a2d2f2bb25e8..5199a49d5ed126e04c5d30fa6fbdf2726c4fab72 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/call.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/call.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/call.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/cint.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/cint.0.res.oracle
index 887dec881576e06ecd6e8da28ebdabba3c076345..6f58be4f1af5a946f6687e5a557255da6b6eb5bd 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/cint.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/cint.0.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp_plugin/cint.i:22: Warning: 
   parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead.
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function signed_bitwise
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/cint.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/cint.1.res.oracle
index 55a848888ce7a3063bdf829a2956194c3de03aa2..59b50c4132f5a58a210f4d72d5caef95df6a6b96 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/cint.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/cint.1.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp_plugin/cint.i:22: Warning: 
   parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead.
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function signed_bitwise
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/cint.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/cint.2.res.oracle
index c0c5ae7b8c0ce9ec3e83b4a6f2b0c680d12376f2..514e872a60043bdf0a7938905fa9fbbdebfa030b 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/cint.2.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/cint.2.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp_plugin/cint.i:22: Warning: 
   parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead.
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function signed_bitwise
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/cint.3.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/cint.3.res.oracle
index b169564f3f3df677b24cf3f5e545dae534503a67..3aaad8d66c9b1eeefb620fb7bb9f568538e6afba 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/cint.3.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/cint.3.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp_plugin/cint.i:22: Warning: 
   parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead.
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function signed_bitwise
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/cint.4.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/cint.4.res.oracle
index f8b8993817804ee19d6b412d7a610e34bb951503..6530278cbb976598154e0d8dc198ca868fbb12e1 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/cint.4.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/cint.4.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp_plugin/cint.i:22: Warning: 
   parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead.
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function signed_bitwise
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/cint.5.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/cint.5.res.oracle
index bb09f85e02cb893f5d9ebadfada28384266bd488..064a3b6849118946b732e22b0bd412a0e07b5ee6 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/cint.5.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/cint.5.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp_plugin/cint.i:22: Warning: 
   parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead.
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function signed_bitwise
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 67dda1bd3fcfe40e62b094e3d07c9cda20424268..232d0259c30a3aec71ca0610cdc0af2b68750042 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/combined.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/combined.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/combined.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function job
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/convert.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/convert.res.oracle
index e322ec1a1e8f4d57752de4bf47dc42db7d917aa4..a05054d57a9a98b37b8307d412ef6ae99757ca51 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/convert.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/convert.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/convert.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 ------------------------------------------------------------
   Global
 ------------------------------------------------------------
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 ec243b296dbcdeaa02b776c5d185c6972a309bc4..2df09a43e2a673bf3e6e8921b8fd05865126d17a 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/copy.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/copy.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/copy.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function copy
@@ -151,12 +150,18 @@ Prove: a_3[a_4] = a_2[a_4].
 
 ------------------------------------------------------------
 
-Goal Loop assigns (file tests/wp_plugin/copy.i, line 12) (1/2):
+Goal Loop assigns (file tests/wp_plugin/copy.i, line 12) (1/3):
 Prove: true.
 
 ------------------------------------------------------------
 
-Goal Loop assigns (file tests/wp_plugin/copy.i, line 12) (2/2):
+Goal Loop assigns (file tests/wp_plugin/copy.i, line 12) (2/3):
+Effect at line 14
+Prove: true.
+
+------------------------------------------------------------
+
+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).
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/doomed.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/doomed.0.res.oracle
index 4f81eda9072a018dd87cb2a73fc93e3c93f55773..0e195c8fcd205635db50093d6a98b9e2cda3d842 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/doomed.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/doomed.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/doomed.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function bar
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/doomed.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/doomed.1.res.oracle
index 96ea7f28a84972eb67c04bc99bf2ed7e3ceb34c4..07bf46ceb48fa2196aac1041d66a314f86781b30 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/doomed.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/doomed.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/doomed.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function bar
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 66b4587a6b7f562ec25be5fd70a303a9af3a5cfb..da669bd36ebf0b30082de682bb0d52b17a6faec3 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/doomed_axioms.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function foo
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 665deb24842bdf01369c31d978870e1f34cbfdf4..97103136af1d61d0f9dc62a842e18b5184bc026c 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/doomed_loop.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function foo
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/doomed_unroll.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/doomed_unroll.res.oracle
index 169321402876d20386d7dd09216dd79310308dda..53bfdc8c969e99993428bf4e063da2a0978394bd 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/doomed_unroll.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/doomed_unroll.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/doomed_unroll.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_plugin/doomed_unroll.i:15: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/dynamic.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/dynamic.res.oracle
index f61e601b4d210a4a8afbea9a51402de2d1d963f1..e71c6e9ae9aea0d46a37b93de7f0bd295d0e1fb5 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/dynamic.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/dynamic.res.oracle
@@ -10,7 +10,6 @@
 [wp] tests/wp_plugin/dynamic.i:87: Calls h1
 [wp] tests/wp_plugin/dynamic.i:100: Calls unreachable_g
 [wp:calls] Dynamic call(s): 6.
-[wp] Loading driver 'share/wp.driver'
 [wp] tests/wp_plugin/dynamic.i:78: Warning: Missing 'calls' for default behavior
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
@@ -374,14 +373,18 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'guarded_call':
-  /*@ behavior typed: requires \separated(&X,p); */
+  /*@ behavior typed:
+        requires \separated(p, &X); */
   void guarded_call(struct S *p);
 [wp] Warning: Memory model hypotheses for function 'behavior':
-  /*@ behavior typed: requires \separated(&X1,p+(..)); */
+  /*@ behavior typed:
+        requires \separated(p + (..), &X1); */
   int behavior(int (*p)(void));
 [wp] Warning: Memory model hypotheses for function 'some_behaviors':
-  /*@ behavior typed: requires \separated(&X1,p+(..)); */
+  /*@ behavior typed:
+        requires \separated(p + (..), &X1); */
   int some_behaviors(int (*p)(void));
 [wp] Warning: Memory model hypotheses for function 'missing_context':
-  /*@ behavior typed: requires \separated(&X1,p); */
+  /*@ behavior typed:
+        requires \separated(p, &X1); */
   int missing_context(int (*p)(void));
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/fallback.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/fallback.res.oracle
index 61fd74dd9d815d5a2a045af77e1385a8a47dfeaf..c3ed1e741d463a42a6f13570e273586242789306 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/fallback.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/fallback.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/fallback.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function job
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/flash.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/flash.0.res.oracle
index 818a355e2d15663d3e04db5fc8769c4944a19d84..d987807fecd4c5359e3a5c1fecdcf86b1f1df7f9 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/flash.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/flash.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/flash.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function job
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/flash.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/flash.1.res.oracle
index 312f0897fc58e194cdbbefd4148c717786b6cf1c..31d6bb17966eb81c3efddb017b847781a52d9709 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/flash.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/flash.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/flash.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] tests/wp_plugin/flash-ergo.driver:2: Warning: 
   Redefinition of logic INDEX_init
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/flash.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/flash.2.res.oracle
index 4e5d804718ecf4e93795cd35284e41a6b37edc2e..c1cd5c4035a144f84d1d282586471b9664aa036b 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/flash.2.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/flash.2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/flash.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function job
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/float_driver.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/float_driver.res.oracle
index f193a1188d9c4316d1ed482ea3b61d2409b14336..d7358dce80b3d94ff5c052884965adccd6c8d92b 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/float_driver.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/float_driver.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/float_driver.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 20 goals scheduled
 [wp:print-generated] 
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/float_format.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/float_format.res.oracle
index 85e995df2796c0b54545c3d7c1c66198eb899050..4a8215d591e6f88e181b04cb50a6518f789fad8e 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/float_format.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/float_format.res.oracle
@@ -4,7 +4,6 @@
   Floating-point constant 0.2 is not represented exactly. Will use 0x1.999999999999ap-3.
   (warn-once: no further messages from category 'parser:decimal-float' will be emitted)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function output
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/float_model.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/float_model.0.res.oracle
index a711e372d35c558c31793e43e593b585c74d4731..00f3e8dab4c76c330a7c167e974e51d8c8078a9f 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/float_model.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/float_model.0.res.oracle
@@ -6,7 +6,6 @@
   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)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function job
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/float_model.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/float_model.1.res.oracle
index 55eefc41f89dc07ca8ef43882bed889ce252e363..7fbd6b3ca7bdb5449c6a81d4457b4acc712d3681 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/float_model.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/float_model.1.res.oracle
@@ -6,7 +6,6 @@
   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)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function job
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/float_real.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/float_real.0.res.oracle
index 7e9d87ee00d3dd9b55bebc69d8dca822bcc85c19..39e9f3d83596b5d28e157b5556f5c0450b7badb0 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/float_real.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/float_real.0.res.oracle
@@ -4,7 +4,6 @@
   Floating-point constant 1e-5 is not represented exactly. Will use 0x1.4f8b588e368f1p-17.
   (warn-once: no further messages from category 'parser:decimal-float' will be emitted)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function dequal
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/float_real.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/float_real.1.res.oracle
index 4249f034461a465c794b76fe03bd9cf26e1fa735..acae1296cda548c49122e49e55befe3e44cd1d16 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/float_real.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/float_real.1.res.oracle
@@ -4,7 +4,6 @@
   Floating-point constant 1e-5 is not represented exactly. Will use 0x1.4f8b588e368f1p-17.
   (warn-once: no further messages from category 'parser:decimal-float' will be emitted)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function dequal
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/frame.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/frame.res.oracle
index 3ef9251b463a17273f447723b675e76ea8aaf660..b48c65edf9e1ad6aa5e63ca9ca24a01d79f5bece 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/frame.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/frame.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/frame.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function alias
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/ground_real.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/ground_real.res.oracle
index ca03a014002a019fe3f06c6d7df1784c9312230d..1777e7e419823d03a7333505f6b74efa093807fc 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/ground_real.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/ground_real.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/ground_real.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 ------------------------------------------------------------
   Global
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/inductive.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/inductive.res.oracle
index e9c5272c0cdca9ab2197a3eedc111a93dd229da1..56fce1fae014c63f99ea466d2d9e3981f3f7ea77 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/inductive.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/inductive.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/inductive.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: native support for coq is deprecated, use tip instead
 [wp] 2 goals scheduled
 [wp:print-generated] 
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/init_const.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/init_const.res.oracle
index dcdf495be1735ff0bb52b336f437ad08c3bf7eba..46f3cde2efb264d10baff2ace945c9c5420c50ec 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/init_const.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/init_const.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/init_const.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function fA
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/init_const_guard.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/init_const_guard.res.oracle
index 3fcaa7780cb793ba02ac972a510be04169f3473f..1b028ec86bae7521af2821488cc935e87f17bae6 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/init_const_guard.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/init_const_guard.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/init_const_guard.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/init_extern.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/init_extern.res.oracle
index 25a6346f68a786c06d4f2519dea4a3783118bd0e..4fb7c09c0aa6b08007c34a255858fbfd3b5ca5a9 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/init_extern.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/init_extern.res.oracle
@@ -2,7 +2,6 @@
 [kernel] Parsing tests/wp_plugin/init_extern.i (no preprocessing)
 [kernel] Parsing tests/wp_plugin/init_linker.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/init_valid.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/init_valid.res.oracle
index c816306f8dfa030a9b13ecb7b3f75924b3ff959b..c630d5f5437f03e7d42293b302cdca2568cb3bee 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/init_valid.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/init_valid.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/init_valid.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function validA
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/initarr.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/initarr.res.oracle
index 402be8d8ac5c7095d9994c3ce980543ce67da025..296121a1db1ff800e6f48a6fc03fce1cba2d5620 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/initarr.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/initarr.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/initarr.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function job
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/injector.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/injector.res.oracle
index 9f80dffaa4d14bf53dbc7dcf512eb9a6331d9cb8..1ac8bbc1f3f459984a7a6b40e72e777fbc165f77 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/injector.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/injector.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/injector.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/invertible.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/invertible.res.oracle
index 7b4df2e87f0cc1ffd85fabb51bab664caa53999a..fb1d1f3185b5bf46c75c4b4fe15662149d1b093c 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/invertible.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/invertible.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/invertible.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_plugin/invertible.i:17: Warning: 
   No code nor implicit assigns clause for function main, generating default assigns from the prototype
 ------------------------------------------------------------
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 9dd899de5f15ff0d23edd240f05b69e72668c3f6..42f63d8aedbeb628172cc98d3ac216fdde2e2b4e 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/loop.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/loop.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/loop.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function init
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/loopcurrent.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/loopcurrent.res.oracle
index b477c37199d8f28da5dc2efc674670cde8b5d82f..a562cec21c990ee024f6d5a25157be8e176e53e9 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/loopcurrent.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/loopcurrent.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/loopcurrent.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_plugin/loopcurrent.i:12: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/loopentry.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/loopentry.res.oracle
index 991c9e2a2de44403278260c77aaa0ea3bcf0b432..fad72a0a7693a1a1d22c79a43cfe2858e82d774a 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/loopentry.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/loopentry.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/loopentry.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_plugin/loopentry.i:12: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/loopextra.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/loopextra.res.oracle
index a01b081f52511f2932f410f40aedec9dec52731a..ba2abdd43f81268c465ed20737613b5b7eb69c3f 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/loopextra.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/loopextra.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/loopextra.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_plugin/loopextra.i:6: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/mask.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/mask.res.oracle
index 93ca42d9b44d684819608d755f462af193455015..ee4cd2e5dd9e372305e6ff4acc2a01582e583bb8 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/mask.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/mask.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/mask.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function compute
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/math.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/math.res.oracle
index 8faae9123de65263f8a1c05d7223a290584d9654..738cdb2ffba8c36d383642c39e2778c8bd518fd3 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/math.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/math.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/math.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Global
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/model.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/model.res.oracle
index b0884297aa8fac4251acf6f6080b971962d49504..82ecbd70541d86c7a419e37e600542f381f6f451 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/model.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/model.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp_plugin/model.i:10: Warning: 
   parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead.
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 ---------------------------------------------
@@ -93,7 +92,7 @@ Prove: P_P(x).
 
 ------------------------------------------------------------
 [wp] Running WP plugin...
-[wp] 2 goals scheduled
+[wp] 1 goal scheduled
 ---------------------------------------------
 --- Context 'typed_ref_f' Cluster 'Compound' 
 ---------------------------------------------
@@ -165,36 +164,7 @@ end
        let x = get1 t (shift_sint321 a i) in
        region1 (base1 a) <=' 0 -> is_sint321 i -> is_sint321 x -> P_P1 x
   end
-[wp:print-generated] 
-  theory WP2
-    (* use why3.BuiltIn.BuiltIn *)
-    
-    (* use bool.Bool *)
-    
-    (* use int.Int *)
-    
-    (* use int.ComputerDivision *)
-    
-    (* use real.RealInfix *)
-    
-    (* use frama_c_wp.qed.Qed *)
-    
-    (* use map.Map *)
-    
-    (* use frama_c_wp.memory.Memory *)
-    
-    (* use frama_c_wp.cint.Cint *)
-    
-    (* use Compound *)
-    
-    (* use Axiomatic *)
-    
-    goal wp_goal :
-      forall t:addr -> int, i:int, a:addr.
-       let x = get t (shift_sint32 a i) in
-       region (base a) <= 0 -> is_sint32 i -> is_sint32 x -> P_P x
-  end
-[wp] 2 goals generated
+[wp] 1 goal generated
 ------------------------------------------------------------
   Function f
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/nowp.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/nowp.res.oracle
index 134cf5cfbb8c57d81ee16894ba4537b84276e946..78a2178dc9531c58407c5c11cde605ea4fbcfd5e 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/nowp.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/nowp.res.oracle
@@ -1,6 +1,5 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/nowp.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] No proof obligations
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/nth.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/nth.res.oracle
index 13e8d343c16cb3559600976958b8ec8014719ead..565ac6b571e7eea4ba8381807c1b66aa60b66c55 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/nth.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/nth.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/nth.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 ------------------------------------------------------------
   Axiomatic 'Nth'
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/overarray.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/overarray.res.oracle
index d314b7d06ef44618e72c98a0e90b6eb50d2f31b2..5392e0e5e2bbbebc8a843d784fa3e16fb565cbda 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/overarray.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/overarray.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/overarray.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f1_ok
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/overassign.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/overassign.res.oracle
index 53a71fb06d789fc89eead348b6d1ede7a9979791..a3bcc315fdac6c66cfa7881ddf59d613adc25e89 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/overassign.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/overassign.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/overassign.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f1_ok
@@ -101,3 +100,11 @@ Assume { (* Heap *) Type: linked(Malloc_0). }
 Prove: invalid(Malloc_0, shift_sint32(global(G_A_32), -5), 10).
 
 ------------------------------------------------------------
+[wp] Warning: Memory model hypotheses for function 'f1_ok':
+  /*@ behavior typed:
+        requires \separated(p + (0 .. 9), &p); */
+  void f1_ok(void);
+[wp] Warning: Memory model hypotheses for function 'f2_ok':
+  /*@ behavior typed:
+        requires \separated(p + (10 .. 19), &p); */
+  void f2_ok(void);
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/params.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/params.res.oracle
index 06390f953027618fcb5e31859d50f89d565d1ffd..b61273a928c127ddb95c816feb979e425f967971 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/params.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/params.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/params.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 ------------------------------------------------------------
   Global
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/plet.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/plet.res.oracle
index 8b4eb23ef7f431f7d47dd07aadaa8bf3f9631f5b..6dafe4cc77a16fbc972deabce8e93a237da882f5 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/plet.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/plet.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/plet.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 ------------------------------------------------------------
   Axiomatic 'Test'
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/post_assigns.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/post_assigns.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..fc8605283009333c1cc2ed29037b8ce30203b737
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/oracle/post_assigns.res.oracle
@@ -0,0 +1,41 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_plugin/post_assigns.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function receive
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_plugin/post_assigns.i, line 9) in 'receive':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/post_assigns.i, line 10) in 'receive' (1/2):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/post_assigns.i, line 10) in 'receive' (2/2):
+Call Effect at line 14
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/post_assigns.i, line 10) in 'receive' (1/2):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/post_assigns.i, line 10) in 'receive' (2/2):
+Call Effect at line 14
+Prove: true.
+
+------------------------------------------------------------
+[wp] Warning: Memory model hypotheses for function 'receive':
+  /*@
+     behavior typed:
+       requires \separated(message + (..), &size);
+       requires \separated(message + (0 .. \at(size,Post)), &size);
+     */
+  void receive(int n, char *message);
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/post_valid.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/post_valid.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..9848d7b4c8d5789b1bd7bc6dc08efa16612c0b68
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/oracle/post_valid.res.oracle
@@ -0,0 +1,28 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_plugin/post_valid.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function job
+------------------------------------------------------------
+
+Goal Post-condition 'LOCAL' in 'job':
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: !valid_rw(Malloc_0[P_formal_26 <- 1][L_local_28 <- 0][P_formal_26
+                   <- 0], global(L_local_28), 1).
+
+------------------------------------------------------------
+
+Goal Post-condition 'FORMAL' in 'job':
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: valid_rw(Malloc_0[P_formal_26 <- 1][L_local_28 <- 0][P_formal_26 <- 0],
+         global(P_formal_26), 1).
+
+------------------------------------------------------------
+
+Goal Post-condition 'GLOBAL' in 'job':
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: valid_rw(Malloc_0[P_formal_26 <- 1][L_local_28 <- 0][P_formal_26 <- 0],
+         global(G_global_20), 1).
+
+------------------------------------------------------------
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 ec3540368c3c5c7d195fb1ee82d527553e30fc70..0697c55a730d66e76ef9f11d90bfc7c1664240ff 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/prenex.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/prenex.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/prenex.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function diag
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 1ece42d9dc380401bdc2379bcb8760d9f2397786..02280de6dca96be0cbd3c7204c43b7f3599919be 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/repeat.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/repeat.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/repeat.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_plugin/repeat.c:47: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/rte.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/rte.0.res.oracle
index 7eb7d1df64d15f0802d3c205dd74814362f05313..979f8d1dcd4039fe328b62722013317352985167 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/rte.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/rte.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp_plugin/rte.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp:rte] function job: generate rte for memory access
 [wp:rte] function job: generate rte for division by zero
 [wp:rte] function job: generate rte for signed overflow
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/rte.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/rte.1.res.oracle
index 3136da68bb235fb56970a9d05c9f02b05d682be7..14242727aae2d7a8ca563f10313a0ad855189af5 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/rte.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/rte.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte -no-warn-signed-overflow [...]
 [kernel] Parsing tests/wp_plugin/rte.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp:rte] function job: generate rte for memory access
 [wp:rte] function job: generate rte for division by zero
 [wp:rte] function job: generate rte for invalid bool value
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/rte.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/rte.2.res.oracle
index ec0f537db15872e38aaeca0f1dee10c1a13c2932..a19a1e491e60eb7ebdfb54fedfaddfd717ad9623 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/rte.2.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/rte.2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte -warn-unsigned-overflow [...]
 [kernel] Parsing tests/wp_plugin/rte.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp:rte] function job: generate rte for memory access
 [wp:rte] function job: generate rte for division by zero
 [wp:rte] function job: generate rte for signed overflow
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/rte.3.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/rte.3.res.oracle
index d5189e5215a283b655aa75b3a1ae42fa67f16bcb..0e988b3631124ef9c85bdb13ad170abe2e1b3461 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/rte.3.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/rte.3.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte -wp-model 'Typed (Nat)' [...]
 [kernel] Parsing tests/wp_plugin/rte.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp:rte] function job: generate rte for memory access
 [wp:rte] function job: generate rte for division by zero
 [wp:rte] function job: generate rte for signed overflow
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/rte.4.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/rte.4.res.oracle
index 7a1f8d5436279e560433b649dcea25b9b81b151c..e9d3ee4047ace47e692ce22e6e5aec6980a4b7c1 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/rte.4.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/rte.4.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte -wp-model 'Typed (Nat)' -warn-unsigned-overflow [...]
 [kernel] Parsing tests/wp_plugin/rte.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp:rte] function job: generate rte for memory access
 [wp:rte] function job: generate rte for division by zero
 [wp:rte] function job: generate rte for signed overflow
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/rte.5.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/rte.5.res.oracle
index b8d50097f75d58ded23f025ff8962702cc2147a4..6d174fd9f0f15990c40b726e345b56112384a719 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/rte.5.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/rte.5.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Nat)' [...]
 [kernel] Parsing tests/wp_plugin/rte.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp:rte] function job: missing rte for memory access
 [wp:rte] function job: missing rte for division by zero
 [wp:rte] function job: missing rte for signed overflow
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/rte.6.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/rte.6.res.oracle
index b4f10b265197441ab9ed7eba8f949324d76cf0a5..0a3228cc97c8794d2bbea41005d478b4e47111ca 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/rte.6.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/rte.6.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte -wp-model 'Typed (Nat)' [...]
 [kernel] Parsing tests/wp_plugin/rte.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: -wp-rte can annotate memory access because -rte-mem is not set
 [wp:rte] function job: generate rte for division by zero
 [wp:rte] function job: generate rte for signed overflow
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/sep.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/sep.res.oracle
index 9d7b81db6f6d44f2464af7aa0fc0575ebf7eea30..fdfb80b6c398acb479a2221181fa65057e0b48bf 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/sep.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/sep.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Caveat)' [...]
 [kernel] Parsing tests/wp_plugin/sep.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f1_none
@@ -68,51 +67,51 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'f2_p_a':
-  /*@ behavior typed_caveat: requires \separated(p,&a); requires \valid(p); */
+  /*@ behavior typed_caveat:
+        requires \separated(p, &a);
+        requires \valid(p); */
   void f2_p_a(int *p);
 [wp] Warning: Memory model hypotheses for function 'f3_p_ab':
-  /*@
-     behavior typed_caveat:
-     requires \separated(p,\union(&a,&b));
-     requires \valid(p);
-     */
+  /*@ behavior typed_caveat:
+        requires \separated(p, &a, &b);
+        requires \valid(p); */
   void f3_p_ab(int *p);
 [wp] Warning: Memory model hypotheses for function 'f4_pq_ab':
   /*@
      behavior typed_caveat:
-     requires \separated(p,q,\union(&a,&b));
-     requires \valid(p);
-     requires \valid(q);
+       requires \separated(p, q, &a, &b);
+       requires \valid(p);
+       requires \valid(q);
      */
   void f4_pq_ab(int *p, int *q);
 [wp] Warning: Memory model hypotheses for function 'f5_pq':
   /*@
      behavior typed_caveat:
-     requires \separated(p,q);
-     requires \valid(p);
-     requires \valid(q);
+       requires \separated(p, q);
+       requires \valid(p);
+       requires \valid(q);
      */
   void f5_pq(int *p, int *q);
 [wp] Warning: Memory model hypotheses for function 'f6_Pa':
   /*@
      behavior typed_caveat:
-     requires \separated(p+(..),&a);
-     requires \valid(p+(..));
+       requires \separated(p + (..), &a);
+       requires \valid(p + (..));
      */
   void f6_Pa(int *p, int k);
 [wp] Warning: Memory model hypotheses for function 'f7_pq_ad':
   /*@
      behavior typed_caveat:
-     requires \separated(p,q,\union(&a,&d));
-     requires \valid(p);
-     requires \valid(q);
+       requires \separated(p, q, &a, &d);
+       requires \valid(p);
+       requires \valid(q);
      */
   void f7_pq_ad(int *p, int *q);
 [wp] Warning: Memory model hypotheses for function 'f8_pq_a':
   /*@
      behavior typed_caveat:
-     requires \separated(p,q,&a);
-     requires \valid(p);
-     requires \valid(q);
+       requires \separated(p, q, &a);
+       requires \valid(p);
+       requires \valid(q);
      */
   void f8_pq_a(int *p, int *q);
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 897f3be73baecb92a0425a1729eb6b8671598dfb..62b9c9001fa65dc0a6ae6d537f6b888a6043b3b8 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/sequence.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/sequence.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Caveat)' [...]
 [kernel] Parsing tests/wp_plugin/sequence.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function loops
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/stmt.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/stmt.res.oracle
index 9b3f58137ab19c66fa595e002fc86b4c5e998843..124de2a508dcfec3122dac00f791189e6a0e4d25 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/stmt.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/stmt.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/stmt.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] [CFG] Goal f_exits : Valid (Unreachable)
 [wp] [CFG] Goal g_exits : Valid (Unreachable)
 [wp] [CFG] Goal g_assigns : Valid (Unreachable)
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 42a767b4657d31d0c2611266d24a15f4b230a1b1..aa233aaddc79ff44a7e2d47e4989bc411e4ac984 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/string_c.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 
 Goal Post-condition 'copied_contents' in 'memcpy':
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/struct.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/struct.res.oracle
index bd7e4d2e01d5c9d3d0a7d5334b50cfc886d483fa..b0a83c5583c91e74870bd714cbed93b9b98d107a 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/struct.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/struct.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/struct.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/subset.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/subset.res.oracle
index 29cc3bb629733ce01d9585801f991c7d1035b558..31e97c1709501c89d62e193d7ca7071c1b030434 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/subset.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/subset.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/subset.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function mem
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/subset_fopen.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/subset_fopen.res.oracle
index d18122a712f8e78a6502ae1f5bcb0f239208985d..fde06aafdfce56ba5edb411f57ea36f78d4cec28 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/subset_fopen.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/subset_fopen.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/subset_fopen.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/trig.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/trig.res.oracle
index beb2d13df622002818e1d3fd6020647182c3160f..6cad2d7458db74974f8f50369941a9117d488574 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/trig.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/trig.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/trig.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function foo
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.0.res.oracle
index 45858c34dea99fd999b7895364f420838278f42c..60291308af6ae635ff1c00dd98d81a973bf7cae4 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/unfold_assigns.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function ASSIGN_NO_UNFOLD_KO
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.1.res.oracle
index ab37e2fb1b55d3d83eb32d7489ddfed5c22c2ef7..f681ec0f92309c15f8c0dc760963fec77f356d88 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/unfold_assigns.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function ASSIGN_NO_UNFOLD_KO
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/unroll.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/unroll.res.oracle
index 05fc31fd1c18b2deac8ba6a94f1586ae0218dd75..6dc9e4477f0be20ab5a90cccc8fdb9b063f53698 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/unroll.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/unroll.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/unroll.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_plugin/unroll.i:20: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/unsafe-arrays.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/unsafe-arrays.0.res.oracle
index 77915655ed3f715c679a25dded7de594d39c9008..0d6d70086ee9080222b0f1646488290e39cbfea4 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/unsafe-arrays.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/unsafe-arrays.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/unsafe-arrays.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/unsafe-arrays.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/unsafe-arrays.1.res.oracle
index 24ef4545877e56ab19cc0aefcc5469f7506c5886..d68704a19a61005ff259a3e364ed8c797c75a84c 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/unsafe-arrays.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/unsafe-arrays.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/unsafe-arrays.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_plugin/unsafe-arrays.i:13: User Error: 
   Invalid infinite range (shiftfield_F1_f p_0)+(..)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/volatile.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/volatile.0.res.oracle
index 0c06a8becec85b905f2f501ec5d78ba93f9bd10c..8f0c8d4ce8a3ca974c104502d4572ad66bf635a6 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/volatile.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/volatile.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/volatile.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function job_assigns
@@ -37,5 +36,6 @@ Prove: EqS1_st_v(w, w_1).
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'job_struct_assigns':
-  /*@ behavior typed: requires \separated(&sv,p); */
+  /*@ behavior typed:
+        requires \separated(p, &sv); */
   void job_struct_assigns(struct st_v *p);
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/volatile.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/volatile.1.res.oracle
index 64cb1c399406456ed9e2ae41d46887120ed47026..8f7b2282f202b7a6ab2c4fb7f9faa450a8594c32 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/volatile.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/volatile.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-no-volatile [...]
 [kernel] Parsing tests/wp_plugin/volatile.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_plugin/volatile.i:15: Warning: 
   unsafe volatile access to (term) l-value
@@ -71,5 +70,6 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'job_struct_assigns':
-  /*@ behavior typed: requires \separated(&sv,p); */
+  /*@ behavior typed:
+        requires \separated(p, &sv); */
   void job_struct_assigns(struct st_v *p);
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.0.res.oracle
index 29ad79718d7c1dd66f2a8b8d1d436d85f1bf86ba..16adfa4946a202a912a9f1e69902616b1b347e1b 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/abs.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_abs_abs_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.1.res.oracle
index 1065fc610ec6eae268e375b386487486ba1f1aea..3c71816dbbf88a9d7a7ab0c8471e5af0d0cc782f 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/abs.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: native support for coq is deprecated, use tip instead
 [wp] 1 goal scheduled
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.2.res.oracle
index 3a68e2ef5e192d127f43ecb6095b8fe05ed7426b..d5a8298ccca7d9cfe5363da017189ff878149463 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.2.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/abs.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: native support for alt-ergo is deprecated, use why3 instead
 [wp] 1 goal scheduled
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/asm.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/asm.res.oracle
index 9548820aa57c3418c739327fe3d4bb8af36260c5..344e6b078479a4d7fdc25ab603de7bec24424f63 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/asm.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/asm.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/asm.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
 [wp] [Qed] Goal typed_main_assert_OK : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/bit_test.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/bit_test.res.oracle
index f6a082b42cc33bbd5b6ac2c421762b4aea213966..fef95834e2e117d45fffb152ca684dc76202a36b 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/bit_test.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/bit_test.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/bit_test.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
 [wp] [Alt-Ergo] Goal typed_bit_test_check1_ensures_ko : Unsuccess
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/bool.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/bool.res.oracle
index 3d4c24ffb4a1281d54bbf887af8f711de7b79796..dac2be58e75ca61486ac7ca1bf782c6ba092b8b7 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/bool.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/bool.res.oracle
@@ -1,16 +1,15 @@
 # frama-c -wp -wp-no-let [...]
 [kernel] Parsing tests/wp_plugin/bool.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 7 goals scheduled
-[wp] [Alt-Ergo] Goal typed_band_bool_false_ensures : Valid
-[wp] [Qed] Goal typed_band_bool_true_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_bor_bool_false_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_job_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_bor_bool_true_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_bxor_bool_false_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_bor_bool_false_ensures : Valid
+[wp] [Qed] Goal typed_band_bool_true_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_band_bool_false_ensures : Valid
 [wp] [Qed] Goal typed_bxor_bool_true_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_job_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_bxor_bool_false_ensures : Valid
 [wp] Proved goals:    7 / 7
   Qed:             2 
   Alt-Ergo:        5
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/convert.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/convert.0.res.oracle
index 0f454d8c9dc6153468057651322ce1b0a6ea1469..c58a574b23eb0ec75c989e921af89d71396dd902 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/convert.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/convert.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/convert.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 2 goals scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_ceil : Valid
 [wp] [Alt-Ergo] Goal typed_lemma_floor : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/convert.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/convert.1.res.oracle
index 451f9a657698b78e17984621caeef40ab1c6c1ce..e920dbe12565b8c038bde60962d817e0c4b4a18f 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/convert.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/convert.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/convert.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: native support for alt-ergo is deprecated, use why3 instead
 [wp] 2 goals scheduled
 [wp] [Alt-Ergo (native)] Goal typed_lemma_ceil : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/copy.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/copy.res.oracle
index 93afd0e2d84663c6da9dfa76815a203c9b1bdc4a..097475c27feafea1e41d76ecac880a822f1df06e 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/copy.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/copy.res.oracle
@@ -1,9 +1,8 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/copy.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
-[wp] 10 goals scheduled
+[wp] 11 goals scheduled
 [wp] [Alt-Ergo] Goal typed_copy_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_copy_loop_invariant_Copy_preserved : Valid
 [wp] [Qed] Goal typed_copy_loop_invariant_Copy_established : Valid
@@ -12,12 +11,13 @@
 [wp] [Alt-Ergo] Goal typed_copy_assert_A : Valid
 [wp] [Alt-Ergo] Goal typed_copy_assert_B : Valid
 [wp] [Qed] Goal typed_copy_loop_assigns_part1 : Valid
-[wp] [Alt-Ergo] Goal typed_copy_loop_assigns_part2 : Valid
+[wp] [Qed] Goal typed_copy_loop_assigns_part2 : Valid
+[wp] [Alt-Ergo] Goal typed_copy_loop_assigns_part3 : Valid
 [wp] [Qed] Goal typed_copy_assigns : Valid
-[wp] Proved goals:   10 / 10
-  Qed:             4 
+[wp] Proved goals:   11 / 11
+  Qed:             5 
   Alt-Ergo:        6
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
-  copy                      4        6       10       100%
+  copy                      5        6       11       100%
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed.res.oracle
index a3d176c2b04ee980b4bf2cd926d98d1028fec38a..06068093e7ee75e3358fe8d141511712ef6c71b0 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed.res.oracle
@@ -1,20 +1,19 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/doomed.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 7 goals scheduled
+[wp] [Passed] Smoke-test typed_foo_wp_smoke_default_requires
+[wp] [Failed] Smoke-test typed_foo_wp_smoke_A_requires
+       Qed: Valid
+[wp] tests/wp_plugin/doomed.i:27: Warning: Failed smoke-test
+[wp] [Passed] Smoke-test typed_foo_wp_smoke_B_requires
 [wp] [Passed] Smoke-test typed_bar_wp_smoke_default_requires
 [wp] [Qed] Goal typed_bar_ensures : Valid
 [wp] [Failed] Smoke-test typed_buzz_wp_smoke_default_requires
        Qed: Valid
 [wp] tests/wp_plugin/doomed.i:41: Warning: Failed smoke-test
 [wp] [Qed] Goal typed_buzz_ensures : Valid
-[wp] [Passed] Smoke-test typed_foo_wp_smoke_default_requires
-[wp] [Failed] Smoke-test typed_foo_wp_smoke_A_requires
-       Qed: Valid
-[wp] tests/wp_plugin/doomed.i:27: Warning: Failed smoke-test
-[wp] [Passed] Smoke-test typed_foo_wp_smoke_B_requires
 [wp] Proved goals:    5 / 7
   Qed:             2  (failed: 2)
   Alt-Ergo:        3
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_axioms.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_axioms.res.oracle
index f11a3888e1dc6f587beb931fa8677fb11eb4758d..dfc863b89cdfe6e7648fedbe5d393fb95c5b2704 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_axioms.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_axioms.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/doomed_axioms.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 10 goals scheduled
 [wp] [Failed] Smoke-test typed_foo_wp_smoke_dead_loop_s2
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_call.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_call.0.res.oracle
index 31663282840a94f1fb070f1b7ab275f6390fd1cd..b1a5c4a4fbc09fcce1b714599901ea1f0c29643e 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_call.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_call.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/doomed_call.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 10 goals scheduled
 [wp] [Qed] Goal typed_f1_ok_ensures : Valid
@@ -10,10 +9,10 @@
 [wp] [Qed] Goal typed_f2_ok_exits : Valid
 [wp] [Qed] Goal typed_f3_ko_ensures : Valid
 [wp] [Qed] Goal typed_f3_ok_ensures : Valid
-[wp] [Qed] Goal typed_f4_ko_ensures : Valid
 [wp] [Qed] Goal typed_f4_ok_ensures : Valid
-[wp] [Qed] Goal typed_f5_ko_ensures : Valid
+[wp] [Qed] Goal typed_f4_ko_ensures : Valid
 [wp] [Qed] Goal typed_f5_ok_ensures : Valid
+[wp] [Qed] Goal typed_f5_ko_ensures : Valid
 [wp] Proved goals:   10 / 10
   Qed:            10
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_call.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_call.1.res.oracle
index 3d349ae889761bc345e1e830e832772d04c61ccd..130e2f527e0c702d8d61de7871768a960821ad7e 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_call.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_call.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/doomed_call.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 33 goals scheduled
 [wp] [Passed] Smoke-test typed_call_exit_ok_wp_smoke_dead_call_s2
@@ -25,12 +24,18 @@
 [wp] [Qed] Goal typed_f3_ko_ensures : Valid
 [wp] [Passed] Smoke-test typed_call_exit_ok_wp_smoke_dead_call_s18
 [wp] [Qed] Goal typed_f3_ok_ensures : Valid
+[wp] [Passed] Smoke-test typed_call_ko_global_wp_smoke_dead_call_s22
+[wp] [Qed] Goal typed_f4_ok_ensures : Valid
 [wp] [Failed] Smoke-test typed_call_ko_global_wp_smoke_dead_call_s26
        Qed: Valid
 [wp] tests/wp_plugin/doomed_call.i:89: Warning: Failed smoke-test
 [wp] [Qed] Goal typed_f4_ko_ensures : Valid
-[wp] [Passed] Smoke-test typed_call_ko_global_wp_smoke_dead_call_s22
-[wp] [Qed] Goal typed_f4_ok_ensures : Valid
+[wp] [Passed] Smoke-test typed_call_effect_wp_smoke_dead_call_s29
+[wp] [Passed] Smoke-test typed_call_effect_wp_smoke_dead_call_s30
+[wp] [Passed] Smoke-test typed_call_effect_wp_smoke_dead_call_s31
+[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s30
+[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s31
+[wp] [Qed] Goal typed_f5_ok_ensures : Valid
 [wp] [Passed] Smoke-test typed_call_wrong_wp_smoke_dead_call_s35
 [wp] [Passed] Smoke-test typed_call_effect_wp_smoke_dead_call_s34
 [wp] [Failed] Smoke-test typed_call_effect_wp_smoke_dead_call_s36
@@ -41,12 +46,6 @@
        Qed: Valid
 [wp] tests/wp_plugin/doomed_call.i:121: Warning: Failed smoke-test
 [wp] [Qed] Goal typed_f5_ko_ensures : Valid
-[wp] [Passed] Smoke-test typed_call_effect_wp_smoke_dead_call_s29
-[wp] [Passed] Smoke-test typed_call_effect_wp_smoke_dead_call_s30
-[wp] [Passed] Smoke-test typed_call_effect_wp_smoke_dead_call_s31
-[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s30
-[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s31
-[wp] [Qed] Goal typed_f5_ok_ensures : Valid
 [wp] Proved goals:   28 / 33
   Qed:            10  (failed: 5)
   Alt-Ergo:       18
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_call.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_call.2.res.oracle
index 51c6311db51f101a18e4018c350aa16d9998e2de..cfbb11197d446202f248457926496f212dfb6492 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_call.2.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_call.2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-split [...]
 [kernel] Parsing tests/wp_plugin/doomed_call.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 36 goals scheduled
 [wp] [Passed] Smoke-test typed_call_exit_ok_wp_smoke_dead_call_s2
@@ -28,12 +27,18 @@
 [wp] [Qed] Goal typed_f3_ko_ensures : Valid
 [wp] [Passed] Smoke-test typed_call_exit_ok_wp_smoke_dead_call_s18
 [wp] [Qed] Goal typed_f3_ok_ensures : Valid
+[wp] [Passed] Smoke-test typed_call_ko_global_wp_smoke_dead_call_s22
+[wp] [Qed] Goal typed_f4_ok_ensures : Valid
 [wp] [Failed] Smoke-test typed_call_ko_global_wp_smoke_dead_call_s26
        Qed: Valid
 [wp] tests/wp_plugin/doomed_call.i:89: Warning: Failed smoke-test
 [wp] [Qed] Goal typed_f4_ko_ensures : Valid
-[wp] [Passed] Smoke-test typed_call_ko_global_wp_smoke_dead_call_s22
-[wp] [Qed] Goal typed_f4_ok_ensures : Valid
+[wp] [Passed] Smoke-test typed_call_effect_wp_smoke_dead_call_s29
+[wp] [Passed] Smoke-test typed_call_effect_wp_smoke_dead_call_s30
+[wp] [Passed] Smoke-test typed_call_effect_wp_smoke_dead_call_s31
+[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s30
+[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s31
+[wp] [Qed] Goal typed_f5_ok_ensures : Valid
 [wp] [Passed] Smoke-test typed_call_wrong_wp_smoke_dead_call_s35
 [wp] [Passed] Smoke-test typed_call_effect_wp_smoke_dead_call_s34
 [wp] [Failed] Smoke-test typed_call_effect_wp_smoke_dead_call_s36
@@ -44,12 +49,6 @@
        Qed: Valid
 [wp] tests/wp_plugin/doomed_call.i:121: Warning: Failed smoke-test
 [wp] [Qed] Goal typed_f5_ko_ensures : Valid
-[wp] [Passed] Smoke-test typed_call_effect_wp_smoke_dead_call_s29
-[wp] [Passed] Smoke-test typed_call_effect_wp_smoke_dead_call_s30
-[wp] [Passed] Smoke-test typed_call_effect_wp_smoke_dead_call_s31
-[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s30
-[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s31
-[wp] [Qed] Goal typed_f5_ok_ensures : Valid
 [wp] Proved goals:   31 / 36
   Qed:            13  (failed: 5)
   Alt-Ergo:       18
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_dead.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_dead.0.res.oracle
index 0b7ac571bbb5104117da2b1a5abd17b46c31fc15..0b349526c40d14e9bc6ee38bd5e6574999977b81 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_dead.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_dead.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/doomed_dead.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 46 goals scheduled
 [wp] [Passed] Smoke-test typed_f1_ok_wp_smoke_dead_code_s3
@@ -9,6 +8,12 @@
 [wp] [Passed] Smoke-test typed_f1_ok_wp_smoke_dead_code_s10
 [wp] [Qed] Goal typed_f1_ok_assigns_part1 : Valid
 [wp] [Qed] Goal typed_f1_ok_assigns_part2 : Valid
+[wp] [Passed] Smoke-test typed_exit_wp_smoke_dead_call_s14
+[wp] [Passed] Smoke-test typed_f2_ok_wp_smoke_dead_code_s14
+[wp] [Passed] Smoke-test typed_f2_ok_wp_smoke_dead_code_s16
+[wp] [Qed] Goal typed_f2_ok_assigns_exit : Valid
+[wp] [Qed] Goal typed_f2_ok_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_f2_ok_assigns_normal_part2 : Valid
 [wp] [Passed] Smoke-test typed_exit_wp_smoke_dead_call_s22
 [wp] [Passed] Smoke-test typed_f2_ko_wp_smoke_dead_code_s22
 [wp] [Failed] Smoke-test typed_f2_ko_wp_smoke_dead_code_s23
@@ -18,12 +23,6 @@
 [wp] [Qed] Goal typed_f2_ko_assigns_exit : Valid
 [wp] [Qed] Goal typed_f2_ko_assigns_normal_part1 : Valid
 [wp] [Qed] Goal typed_f2_ko_assigns_normal_part2 : Valid
-[wp] [Passed] Smoke-test typed_exit_wp_smoke_dead_call_s14
-[wp] [Passed] Smoke-test typed_f2_ok_wp_smoke_dead_code_s14
-[wp] [Passed] Smoke-test typed_f2_ok_wp_smoke_dead_code_s16
-[wp] [Qed] Goal typed_f2_ok_assigns_exit : Valid
-[wp] [Qed] Goal typed_f2_ok_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_f2_ok_assigns_normal_part2 : Valid
 [wp] [Passed] Smoke-test typed_call_wp_smoke_dead_call_s30
 [wp] [Passed] Smoke-test typed_f3_ok_wp_smoke_dead_code_s30
 [wp] [Passed] Smoke-test typed_f3_ok_wp_smoke_dead_code_s31
@@ -38,6 +37,12 @@
 [wp] [Qed] Goal typed_f4_ok_assigns_normal_part1 : Valid
 [wp] [Qed] Goal typed_f4_ok_assigns_normal_part2 : Valid
 [wp] [Qed] Goal typed_f4_ok_assigns_normal_part3 : Valid
+[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s48
+[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s50
+[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s52
+[wp] [Qed] Goal typed_f5_ok_assigns_part1 : Valid
+[wp] [Qed] Goal typed_f5_ok_assigns_part2 : Valid
+[wp] [Qed] Goal typed_f5_ok_assigns_part3 : Valid
 [wp] [Passed] Smoke-test typed_f5_ko_wp_smoke_dead_code_s56
 [wp] [Failed] Smoke-test typed_f5_ko_wp_smoke_dead_code_s61
        Qed: Valid
@@ -48,12 +53,6 @@
 [wp] [Qed] Goal typed_f5_ko_assigns_part2 : Valid
 [wp] [Qed] Goal typed_f5_ko_assigns_part3 : Valid
 [wp] [Qed] Goal typed_f5_ko_assigns_part4 : Valid
-[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s48
-[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s50
-[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s52
-[wp] [Qed] Goal typed_f5_ok_assigns_part1 : Valid
-[wp] [Qed] Goal typed_f5_ok_assigns_part2 : Valid
-[wp] [Qed] Goal typed_f5_ok_assigns_part3 : Valid
 [wp] Proved goals:   44 / 46
   Qed:            23  (failed: 2)
   Alt-Ergo:       21
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_dead.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_dead.1.res.oracle
index b5c0258a177a6fd3979a13a3bd589bf4671bb599..fd8fae824785bcd829b66d0b40756567adba02b3 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_dead.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_dead.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-split [...]
 [kernel] Parsing tests/wp_plugin/doomed_dead.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 48 goals scheduled
 [wp] [Passed] Smoke-test typed_f1_ok_wp_smoke_dead_code_s3
@@ -10,6 +9,13 @@
 [wp] [Qed] Goal typed_f1_ok_assigns_part1 : Valid
 [wp] [Qed] Goal typed_f1_ok_assigns_part2 : Valid
 [wp] [Qed] Goal typed_f1_ok_assigns_part3 : Valid
+[wp] [Passed] Smoke-test typed_exit_wp_smoke_dead_call_s14
+[wp] [Passed] Smoke-test typed_f2_ok_wp_smoke_dead_code_s14
+[wp] [Passed] Smoke-test typed_f2_ok_wp_smoke_dead_code_s16
+[wp] [Qed] Goal typed_f2_ok_assigns_exit : Valid
+[wp] [Qed] Goal typed_f2_ok_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_f2_ok_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_f2_ok_assigns_normal_part3 : Valid
 [wp] [Passed] Smoke-test typed_exit_wp_smoke_dead_call_s22
 [wp] [Passed] Smoke-test typed_f2_ko_wp_smoke_dead_code_s22
 [wp] [Failed] Smoke-test typed_f2_ko_wp_smoke_dead_code_s23
@@ -19,13 +25,6 @@
 [wp] [Qed] Goal typed_f2_ko_assigns_exit : Valid
 [wp] [Qed] Goal typed_f2_ko_assigns_normal_part1 : Valid
 [wp] [Qed] Goal typed_f2_ko_assigns_normal_part2 : Valid
-[wp] [Passed] Smoke-test typed_exit_wp_smoke_dead_call_s14
-[wp] [Passed] Smoke-test typed_f2_ok_wp_smoke_dead_code_s14
-[wp] [Passed] Smoke-test typed_f2_ok_wp_smoke_dead_code_s16
-[wp] [Qed] Goal typed_f2_ok_assigns_exit : Valid
-[wp] [Qed] Goal typed_f2_ok_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_f2_ok_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_f2_ok_assigns_normal_part3 : Valid
 [wp] [Passed] Smoke-test typed_call_wp_smoke_dead_call_s30
 [wp] [Passed] Smoke-test typed_f3_ok_wp_smoke_dead_code_s30
 [wp] [Passed] Smoke-test typed_f3_ok_wp_smoke_dead_code_s31
@@ -40,6 +39,12 @@
 [wp] [Qed] Goal typed_f4_ok_assigns_normal_part1 : Valid
 [wp] [Qed] Goal typed_f4_ok_assigns_normal_part2 : Valid
 [wp] [Qed] Goal typed_f4_ok_assigns_normal_part3 : Valid
+[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s48
+[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s50
+[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s52
+[wp] [Qed] Goal typed_f5_ok_assigns_part1 : Valid
+[wp] [Qed] Goal typed_f5_ok_assigns_part2 : Valid
+[wp] [Qed] Goal typed_f5_ok_assigns_part3 : Valid
 [wp] [Passed] Smoke-test typed_f5_ko_wp_smoke_dead_code_s56
 [wp] [Failed] Smoke-test typed_f5_ko_wp_smoke_dead_code_s61
        Qed: Valid
@@ -50,12 +55,6 @@
 [wp] [Qed] Goal typed_f5_ko_assigns_part2 : Valid
 [wp] [Qed] Goal typed_f5_ko_assigns_part3 : Valid
 [wp] [Qed] Goal typed_f5_ko_assigns_part4 : Valid
-[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s48
-[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s50
-[wp] [Passed] Smoke-test typed_f5_ok_wp_smoke_dead_code_s52
-[wp] [Qed] Goal typed_f5_ok_assigns_part1 : Valid
-[wp] [Qed] Goal typed_f5_ok_assigns_part2 : Valid
-[wp] [Qed] Goal typed_f5_ok_assigns_part3 : Valid
 [wp] Proved goals:   46 / 48
   Qed:            25  (failed: 2)
   Alt-Ergo:       21
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_loop.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_loop.res.oracle
index c1ea877c9baf297a06bc5012eb462963ac2e0561..6cbe64cf0f16c20eda7b2d0d71a9d00e58286748 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_loop.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_loop.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/doomed_loop.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 8 goals scheduled
 [wp] [Failed] Smoke-test typed_foo_wp_smoke_dead_loop_s2
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_report_ko.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_report_ko.res.oracle
index 9daa85dfb61bef09c36d23fdc45a15e24df9dfb8..4a65820f41cec1a70848725c4ebd2f33b3c24581 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_report_ko.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_report_ko.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/doomed_report_ko.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 10 goals scheduled
 [wp] [Failed] Smoke-test typed_foo_wp_smoke_dead_loop_s2
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_report_ok.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_report_ok.res.oracle
index 2b80ca79ba3e82219a7e914e785dea7f3c5e3610..c578928320d9953ffa47747f9d26dfaa40927d9f 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_report_ok.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_report_ok.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/doomed_report_ok.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 10 goals scheduled
 [wp] [Passed] Smoke-test typed_foo_wp_smoke_dead_loop_s2
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_unroll.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_unroll.res.oracle
index bcd42d15cb2eeff852f0551d2c583c32f4569787..9f20f169f87366f5aa10f1dd022d84d9c87629fe 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_unroll.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/doomed_unroll.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/doomed_unroll.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_plugin/doomed_unroll.i:15: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/dynamic.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/dynamic.res.oracle
index c38d5c4f2132bec412e28f4880848457b2f7b423..9144906c8da84fbc097b34efdbe590b66f253b4a 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/dynamic.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/dynamic.res.oracle
@@ -1,19 +1,9 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/dynamic.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] tests/wp_plugin/dynamic.i:78: Warning: Missing 'calls' for default behavior
 [wp] Warning: Missing RTE guards
 [wp] 51 goals scheduled
-[wp] [Qed] Goal typed_behavior_call_point_h1_h2_s15 : Valid
-[wp] [Qed] Goal typed_behavior_bhv1_ensures_part1 : Valid
-[wp] [Qed] Goal typed_behavior_bhv1_ensures_part2 : Valid
-[wp] [Qed] Goal typed_behavior_bhv1_assigns_exit_part1 : Valid
-[wp] [Qed] Goal typed_behavior_bhv1_assigns_exit_part2 : Valid
-[wp] [Qed] Goal typed_behavior_bhv1_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_behavior_bhv1_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_behavior_bhv1_assigns_normal_part3 : Valid
-[wp] [Qed] Goal typed_behavior_bhv1_assigns_normal_part4 : Valid
 [wp] [Alt-Ergo] Goal typed_call_call_point_f1_f2_s3 : Valid
 [wp] [Qed] Goal typed_call_ensures_part1 : Valid
 [wp] [Qed] Goal typed_call_ensures_part2 : Valid
@@ -23,15 +13,26 @@
 [wp] [Qed] Goal typed_guarded_call_ensures_part2 : Valid
 [wp] [Qed] Goal typed_guarded_call_ensures_2_part1 : Valid
 [wp] [Qed] Goal typed_guarded_call_ensures_2_part2 : Valid
-[wp] [Alt-Ergo] Goal typed_missing_context_call_point_h1_s25 : Unsuccess
-[wp] [Qed] Goal typed_missing_context_ensures : Valid
-[wp] [Qed] Goal typed_missing_context_assigns_exit : Valid
-[wp] [Qed] Goal typed_missing_context_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_missing_context_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_no_call_call_point_unreachable_g_s32 : Valid
-[wp] [Qed] Goal typed_no_call_ensures_part1 : Valid
-[wp] [Qed] Goal typed_no_call_ensures_part2 : Valid
-[wp] [Qed] Goal typed_no_call_call_unreachable_g_requires : Valid
+[wp] [Qed] Goal typed_behavior_call_point_h1_h2_s15 : Valid
+[wp] [Qed] Goal typed_behavior_bhv1_ensures_part1 : Valid
+[wp] [Qed] Goal typed_behavior_bhv1_ensures_part2 : Valid
+[wp] [Qed] Goal typed_behavior_bhv1_assigns_exit_part1 : Valid
+[wp] [Qed] Goal typed_behavior_bhv1_assigns_exit_part2 : Valid
+[wp] [Qed] Goal typed_behavior_bhv1_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_behavior_bhv1_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_behavior_bhv1_assigns_normal_part3 : Valid
+[wp] [Qed] Goal typed_behavior_bhv1_assigns_normal_part4 : Valid
+[wp] [Qed] Goal typed_some_behaviors_call_point_h1_h2_h0_for_bhv1_s20 : Valid
+[wp] [Qed] Goal typed_some_behaviors_bhv1_ensures_part1 : Valid
+[wp] [Qed] Goal typed_some_behaviors_bhv1_ensures_part2 : Valid
+[wp] [Qed] Goal typed_some_behaviors_bhv1_ensures_part3 : Valid
+[wp] [Qed] Goal typed_some_behaviors_bhv1_assigns_exit_part1 : Valid
+[wp] [Qed] Goal typed_some_behaviors_bhv1_assigns_exit_part2 : Valid
+[wp] [Qed] Goal typed_some_behaviors_bhv1_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_some_behaviors_bhv1_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_some_behaviors_bhv1_assigns_normal_part3 : Valid
+[wp] [Qed] Goal typed_some_behaviors_bhv1_assigns_normal_part4 : Valid
+[wp] [Qed] Goal typed_some_behaviors_bhv1_assigns_normal_part5 : Valid
 [wp] [Qed] Goal typed_some_behaviors_call_point_h1_h2_h0_for_bhv0_s20 : Valid
 [wp] [Qed] Goal typed_some_behaviors_bhv0_ensures_part1 : Valid
 [wp] [Qed] Goal typed_some_behaviors_bhv0_ensures_part2 : Valid
@@ -45,17 +46,15 @@
 [wp] [Qed] Goal typed_some_behaviors_bhv0_assigns_normal_part4 : Valid
 [wp] [Qed] Goal typed_some_behaviors_bhv0_assigns_normal_part5 : Valid
 [wp] [Qed] Goal typed_some_behaviors_bhv0_assigns_normal_part6 : Valid
-[wp] [Qed] Goal typed_some_behaviors_call_point_h1_h2_h0_for_bhv1_s20 : Valid
-[wp] [Qed] Goal typed_some_behaviors_bhv1_ensures_part1 : Valid
-[wp] [Qed] Goal typed_some_behaviors_bhv1_ensures_part2 : Valid
-[wp] [Qed] Goal typed_some_behaviors_bhv1_ensures_part3 : Valid
-[wp] [Qed] Goal typed_some_behaviors_bhv1_assigns_exit_part1 : Valid
-[wp] [Qed] Goal typed_some_behaviors_bhv1_assigns_exit_part2 : Valid
-[wp] [Qed] Goal typed_some_behaviors_bhv1_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_some_behaviors_bhv1_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_some_behaviors_bhv1_assigns_normal_part3 : Valid
-[wp] [Qed] Goal typed_some_behaviors_bhv1_assigns_normal_part4 : Valid
-[wp] [Qed] Goal typed_some_behaviors_bhv1_assigns_normal_part5 : Valid
+[wp] [Alt-Ergo] Goal typed_missing_context_call_point_h1_s25 : Unsuccess
+[wp] [Qed] Goal typed_missing_context_ensures : Valid
+[wp] [Qed] Goal typed_missing_context_assigns_exit : Valid
+[wp] [Qed] Goal typed_missing_context_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_missing_context_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_no_call_call_point_unreachable_g_s32 : Valid
+[wp] [Qed] Goal typed_no_call_ensures_part1 : Valid
+[wp] [Qed] Goal typed_no_call_ensures_part2 : Valid
+[wp] [Qed] Goal typed_no_call_call_unreachable_g_requires : Valid
 [wp] Proved goals:   50 / 51
   Qed:            47 
   Alt-Ergo:        3  (unsuccess: 1)
@@ -69,14 +68,18 @@
   no_call                   4        -        4       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'guarded_call':
-  /*@ behavior typed: requires \separated(&X,p); */
+  /*@ behavior typed:
+        requires \separated(p, &X); */
   void guarded_call(struct S *p);
 [wp] Warning: Memory model hypotheses for function 'behavior':
-  /*@ behavior typed: requires \separated(&X1,p+(..)); */
+  /*@ behavior typed:
+        requires \separated(p + (..), &X1); */
   int behavior(int (*p)(void));
 [wp] Warning: Memory model hypotheses for function 'some_behaviors':
-  /*@ behavior typed: requires \separated(&X1,p+(..)); */
+  /*@ behavior typed:
+        requires \separated(p + (..), &X1); */
   int some_behaviors(int (*p)(void));
 [wp] Warning: Memory model hypotheses for function 'missing_context':
-  /*@ behavior typed: requires \separated(&X1,p); */
+  /*@ behavior typed:
+        requires \separated(p, &X1); */
   int missing_context(int (*p)(void));
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/f.dot b/src/plugins/wp/tests/wp_plugin/oracle_qualif/f.dot
index 077cfed3a2e1434664df16c14606fadf8d9e4e0c..c480b21b82a420b250b7d4038e3d096670e938ee 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/f.dot
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/f.dot
@@ -2,73 +2,71 @@ digraph f {
   rankdir = TB ;
   node [ style = filled, shape = box ] ;
   N000 [ color = red, shape = circle, label = "*" ] ;
-  N056 [ color=red , label="Prove f_ensures" ] ;
-  N056 -> N000 [ style=dotted ] ;
-  N057 [ color=red , label="Prove f_ensures_2" ] ;
-  N057 -> N056 [ style=dotted ] ;
-  N058 [ label="" , shape=circle ] ;
+  N054 [ color=red , label="Prove f_ensures" ] ;
+  N054 -> N000 [ style=dotted ] ;
+  N055 [ color=red , label="Prove f_ensures_2" ] ;
+  N055 -> N054 [ style=dotted ] ;
+  N056 [ label="" , shape=circle ] ;
+ N056 -> N055 ;
+ N056 -> N054 ;
+  N057 [ color=lightblue , label="F-out { a b }" ] ;
+ N057 -> N056 ;
+  N058 [ label="Label wp:post" ] ;
  N058 -> N057 ;
- N058 -> N056 ;
-  N059 [ color=lightblue , label="F-out { a b }" ] ;
+  N059 [ color=lightblue , label="B-out { __retres }" ] ;
  N059 -> N058 ;
-  N060 [ label="Label wp:post" ] ;
+  N060 [ color=orange , label="Return __retres" ] ;
  N060 -> N059 ;
-  N061 [ color=lightblue , label="B-out { __retres }" ] ;
+  N061 [ label="Label wp:sid27 (Stmt s27)" ] ;
  N061 -> N060 ;
-  N062 [ color=orange , label="Return __retres" ] ;
+  N062 [ label="Label wp:sid26 (Stmt s26)" ] ;
  N062 -> N061 ;
-  N063 [ label="Label wp:sid27 (Stmt s27)" ] ;
+  N063 [ color=green , label="Assume f_assert" ] ;
  N063 -> N062 ;
-  N064 [ label="Label wp:sid26 (Stmt s26)" ] ;
- N064 -> N063 ;
-  N065 [ color=green , label="Assume f_assert" ] ;
+  N064 [ color=red , label="Prove f_assert" ] ;
+  N064 -> N063 [ style=dotted ] ;
+  N065 [ label="" , shape=circle ] ;
  N065 -> N064 ;
-  N066 [ color=red , label="Prove f_assert" ] ;
-  N066 -> N065 [ style=dotted ] ;
-  N067 [ label="" , shape=circle ] ;
+ N065 -> N063 ;
+  N066 [ label="Label wp:sid25 (Stmt s25)" ] ;
+ N066 -> N065 ;
+  N067 [ color=orange , label="__retres := a + b" ] ;
  N067 -> N066 ;
- N067 -> N065 ;
-  N068 [ label="Label wp:sid25 (Stmt s25)" ] ;
+  N068 [ label="Label wp:sid6 (Stmt s6)" ] ;
  N068 -> N067 ;
-  N069 [ color=orange , label="__retres := a + b" ] ;
+  N069 [ label="Label wp:sid24 (Stmt s24)" ] ;
  N069 -> N068 ;
-  N070 [ label="Label wp:sid6 (Stmt s6)" ] ;
- N070 -> N069 ;
-  N071 [ label="Label wp:sid24 (Stmt s24)" ] ;
+  N070 [ color=orange , label="Return __retres" ] ;
+ N070 -> N059 ;
+  N071 [ label="Label wp:sid27 (Stmt s27)" ] ;
  N071 -> N070 ;
-  N072 [ color=orange , label="Return __retres" ] ;
- N072 -> N061 ;
-  N073 [ label="Label wp:sid27 (Stmt s27)" ] ;
+  N072 [ color=orange , label="__retres := -1" ] ;
+ N072 -> N071 ;
+  N073 [ label="Label wp:sid8 (Stmt s8)" ] ;
  N073 -> N072 ;
-  N074 [ color=orange , label="__retres := -1" ] ;
+  N074 [ color=green , label="Assume f_ensures_3" ] ;
  N074 -> N073 ;
-  N075 [ label="Label wp:sid8 (Stmt s8)" ] ;
- N075 -> N074 ;
-  N076 [ color=green , label="Assume f_ensures_3" ] ;
- N076 -> N075 ;
-  N077 [ color=orange , label="Havoc f_assigns:
+  N075 [ color=orange , label="Havoc f_assigns:
 assigns __retres;" ] ;
+ N075 -> N074 ;
+  N076 [ color=cyan , label="If a > 0" ] ;
+ N076 -> N069 ;
+ N076 -> N000 [ style=dotted ];
+  N077 [ label="Label wp:sid4 (Stmt s4)" ] ;
  N077 -> N076 ;
-  N078 [ color=cyan , label="If a > 0" ] ;
- N078 -> N071 ;
- N078 -> N000 [ style=dotted ];
-  N079 [ label="Label wp:sid4 (Stmt s4)" ] ;
+  N078 [ label="" , shape=circle ] ;
+ N078 -> N075 ;
+ N078 -> N077 ;
+  N079 [ label="Label wp:sid2 (Stmt s2)" ] ;
  N079 -> N078 ;
-  N080 [ label="" , shape=circle ] ;
- N080 -> N077 ;
+  N080 [ color=lightblue , label="B-in { __retres }" ] ;
  N080 -> N079 ;
-  N081 [ label="Label wp:sid2 (Stmt s2)" ] ;
+  N081 [ color=lightblue , label="F-in { a b }" ] ;
  N081 -> N080 ;
-  N082 [ color=lightblue , label="B-in { __retres }" ] ;
+  N082 [ label="Label wp:pre" ] ;
  N082 -> N081 ;
-  N083 [ color=lightblue , label="F-frame { a b }" ] ;
+  N083 [ color=lightblue , label="Global { }" ] ;
  N083 -> N082 ;
-  N084 [ label="Label wp:pre" ] ;
+  N084 [ color=cyan , label="Function f" ] ;
  N084 -> N083 ;
-  N085 [ color=lightblue , label="F-in { a b }" ] ;
- N085 -> N084 ;
-  N086 [ color=lightblue , label="Global { }" ] ;
- N086 -> N085 ;
-  N087 [ color=cyan , label="Function f" ] ;
- N087 -> N086 ;
 }
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/f_default_for_stmt_2.dot b/src/plugins/wp/tests/wp_plugin/oracle_qualif/f_default_for_stmt_2.dot
index be3a8a3a5db7557308b6a855e36ed03b49a2a6ea..7c51f93dabee8afae76d1222d9c817b1053df9ab 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/f_default_for_stmt_2.dot
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/f_default_for_stmt_2.dot
@@ -2,64 +2,63 @@ digraph f {
   rankdir = TB ;
   node [ style = filled, shape = box ] ;
   N000 [ color = red, shape = circle, label = "*" ] ;
-  N088 [ color=lightblue , label="F-out { a b }" ] ;
- N088 -> N000 [ style=dotted ];
-  N089 [ label="Label wp:post" ] ;
+  N085 [ color=lightblue , label="F-out { a b }" ] ;
+ N085 -> N000 [ style=dotted ];
+  N086 [ label="Label wp:post" ] ;
+ N086 -> N085 ;
+  N087 [ color=lightblue , label="B-out { __retres }" ] ;
+ N087 -> N086 ;
+  N088 [ color=orange , label="Return __retres" ] ;
+ N088 -> N087 ;
+  N089 [ label="Label wp:sid27 (Stmt s27)" ] ;
  N089 -> N088 ;
-  N090 [ color=lightblue , label="B-out { __retres }" ] ;
+  N090 [ label="Label wp:sid26 (Stmt s26)" ] ;
  N090 -> N089 ;
-  N091 [ color=orange , label="Return __retres" ] ;
+  N091 [ color=green , label="Assume f_assert" ] ;
  N091 -> N090 ;
-  N092 [ label="Label wp:sid27 (Stmt s27)" ] ;
+  N092 [ label="Label wp:sid25 (Stmt s25)" ] ;
  N092 -> N091 ;
-  N093 [ label="Label wp:sid26 (Stmt s26)" ] ;
+  N093 [ color=orange , label="__retres := a + b" ] ;
  N093 -> N092 ;
-  N094 [ color=green , label="Assume f_assert" ] ;
+  N094 [ label="Label wp:sid6 (Stmt s6)" ] ;
  N094 -> N093 ;
-  N095 [ label="Label wp:sid25 (Stmt s25)" ] ;
+  N095 [ label="Label wp:sid24 (Stmt s24)" ] ;
  N095 -> N094 ;
-  N096 [ color=orange , label="__retres := a + b" ] ;
- N096 -> N095 ;
-  N097 [ label="Label wp:sid6 (Stmt s6)" ] ;
+  N096 [ color=orange , label="Return __retres" ] ;
+ N096 -> N087 ;
+  N097 [ label="Label wp:sid27 (Stmt s27)" ] ;
  N097 -> N096 ;
-  N098 [ label="Label wp:sid24 (Stmt s24)" ] ;
+  N098 [ color=orange , label="__retres := -1" ] ;
  N098 -> N097 ;
-  N099 [ color=orange , label="Return __retres" ] ;
- N099 -> N090 ;
-  N100 [ label="Label wp:sid27 (Stmt s27)" ] ;
+  N099 [ label="Label wp:sid8 (Stmt s8)" ] ;
+ N099 -> N098 ;
+  N100 [ color=green , label="Assume f_ensures_3" ] ;
  N100 -> N099 ;
-  N101 [ color=orange , label="__retres := -1" ] ;
- N101 -> N100 ;
-  N102 [ label="Label wp:sid8 (Stmt s8)" ] ;
+  N101 [ color=red , label="Assigns f_assigns" ] ;
+  N101 -> N100 [ style=dotted ] ;
+  N102 [ label="" , shape=circle ] ;
  N102 -> N101 ;
-  N103 [ color=green , label="Assume f_ensures_3" ] ;
- N103 -> N102 ;
-  N104 [ color=red , label="Assigns f_assigns" ] ;
-  N105 [ label="" , shape=circle ] ;
+ N102 -> N100 ;
+  N103 [ color=red , label="Prove f_ensures_3" ] ;
+  N103 -> N102 [ style=dotted ] ;
+  N104 [ label="" , shape=circle ] ;
+ N104 -> N103 ;
+ N104 -> N102 ;
+  N105 [ color=cyan , label="If a > 0" ] ;
+ N105 -> N095 ;
  N105 -> N104 ;
- N105 -> N103 ;
-  N106 [ color=red , label="Prove f_ensures_3" ] ;
-  N106 -> N105 [ style=dotted ] ;
-  N107 [ label="" , shape=circle ] ;
+  N106 [ label="Label wp:sid4 (Stmt s4)" ] ;
+ N106 -> N105 ;
+  N107 [ label="Label wp:sid2 (Stmt s2)" ] ;
  N107 -> N106 ;
- N107 -> N105 ;
-  N108 [ color=cyan , label="If a > 0" ] ;
- N108 -> N098 ;
+  N108 [ color=lightblue , label="B-in { __retres }" ] ;
  N108 -> N107 ;
-  N109 [ label="Label wp:sid4 (Stmt s4)" ] ;
+  N109 [ color=lightblue , label="F-in { a b }" ] ;
  N109 -> N108 ;
-  N110 [ label="Label wp:sid2 (Stmt s2)" ] ;
+  N110 [ label="Label wp:pre" ] ;
  N110 -> N109 ;
-  N111 [ color=lightblue , label="B-in { __retres }" ] ;
+  N111 [ color=lightblue , label="Global { }" ] ;
  N111 -> N110 ;
-  N112 [ color=lightblue , label="F-frame { a b }" ] ;
+  N112 [ color=cyan , label="Function f" ] ;
  N112 -> N111 ;
-  N113 [ label="Label wp:pre" ] ;
- N113 -> N112 ;
-  N114 [ color=lightblue , label="F-in { a b }" ] ;
- N114 -> N113 ;
-  N115 [ color=lightblue , label="Global { }" ] ;
- N115 -> N114 ;
-  N116 [ color=cyan , label="Function f" ] ;
- N116 -> N115 ;
 }
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/fallback.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/fallback.res.oracle
index 4b005c11a31b2e9dbfab45e3ecebf574424538f2..c78a7cf65a38f32339cb534a45aaced02ad60dcf 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/fallback.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/fallback.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/fallback.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: Prover 'Alt-Ergo:1.2.0' not found, fallback to 'Alt-Ergo:2.0.0'
 [wp] 1 goal scheduled
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.0.res.oracle
index 219472265d9f7873bae6ecca18fc86ea6f27eba6..0d5f90a7526755a6d15610e4881c08abf7e0e1a5 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-timeout 1 [...]
 [kernel] Parsing tests/wp_plugin/flash.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 6 goals scheduled
 [wp] [Qed] Goal typed_job_ensures_Events : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.1.res.oracle
index 70adda9301671f9105136c51565e7e6a3af9f7cf..a01eeba9e85753bb3728a8b18e52179de2ff3f36 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/flash.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] tests/wp_plugin/flash-ergo.driver:2: Warning: 
   Redefinition of logic INDEX_init
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.2.res.oracle
index 847a02d9f75f5561d640415e507be62799b9e404..a87892007eea5a1214f99161ef4e1b9826bafe7d 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.2.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/flash.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 6 goals scheduled
 [wp] [Qed] Goal typed_flash_job_ensures_Events : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.0.res.oracle
index beac21fa7b5ad7a5d2144f9eac99391570ce6afe..5ba66e74babbcfc208688d5a4e9b0989e089004b 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.0.res.oracle
@@ -4,7 +4,6 @@
   Floating-point constant 0.2 is not represented exactly. Will use 0x1.999999999999ap-3.
   (warn-once: no further messages from category 'parser:decimal-float' will be emitted)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: native support for coq is deprecated, use tip instead
 [wp] 1 goal scheduled
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.1.res.oracle
index fd00d9ebd5b3572c8a1acd500ba6df167dcf7384..0423017c2be17ac025fcf70e73491281b769971f 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.1.res.oracle
@@ -4,7 +4,6 @@
   Floating-point constant 0.2 is not represented exactly. Will use 0x1.999999999999ap-3.
   (warn-once: no further messages from category 'parser:decimal-float' will be emitted)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: native support for alt-ergo is deprecated, use why3 instead
 [wp] 1 goal scheduled
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.2.res.oracle
index 5974584a73c3314ee7219f84e732d7bbe21260be..fcad25a085a2ccc51c4d9b3896c25c7fca9504f2 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.2.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.2.res.oracle
@@ -4,7 +4,6 @@
   Floating-point constant 0.2 is not represented exactly. Will use 0x1.999999999999ap-3.
   (warn-once: no further messages from category 'parser:decimal-float' will be emitted)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_output_ensures_KO : Unsuccess
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_real.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_real.0.res.oracle
index 96493d8e91a25c306aa1363426dc4155e4007edb..265dcf746300cd6547717198ab1ec49ae4e343e5 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_real.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_real.0.res.oracle
@@ -4,7 +4,6 @@
   Floating-point constant 1e-5 is not represented exactly. Will use 0x1.4f8b588e368f1p-17.
   (warn-once: no further messages from category 'parser:decimal-float' will be emitted)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_real_dequal_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_real.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_real.1.res.oracle
index 497f15c885f64541d1d18180a84fb4e2e658dea3..a42394bed4b944faad652b0f70e55d095ca69ae7 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_real.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_real.1.res.oracle
@@ -4,7 +4,6 @@
   Floating-point constant 1e-5 is not represented exactly. Will use 0x1.4f8b588e368f1p-17.
   (warn-once: no further messages from category 'parser:decimal-float' will be emitted)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_dequal_ensures : Unsuccess
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/frame.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/frame.res.oracle
index 47c2b9e78e3107c3e32468219e46de76bc8cae23..1d9ae90802a9173944e7f6725c1a27e606548204 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/frame.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/frame.res.oracle
@@ -1,15 +1,14 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/frame.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 6 goals scheduled
-[wp] [Alt-Ergo] Goal typed_alias_ensures_KO : Unsuccess
-[wp] [Alt-Ergo] Goal typed_global_ensures_KO : Unsuccess
 [wp] [Qed] Goal typed_local_ensures_FRAMED : Valid
 [wp] [Alt-Ergo] Goal typed_local_ensures_KO : Unsuccess
+[wp] [Alt-Ergo] Goal typed_global_ensures_KO : Unsuccess
 [wp] [Alt-Ergo] Goal typed_localref_ensures_KO : Unsuccess
 [wp] [Qed] Goal typed_localref_assert_FRAMED : Valid
+[wp] [Alt-Ergo] Goal typed_alias_ensures_KO : Unsuccess
 [wp] Proved goals:    2 / 6
   Qed:             2 
   Alt-Ergo:        0  (unsuccess: 4)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/g.dot b/src/plugins/wp/tests/wp_plugin/oracle_qualif/g.dot
index 4fffdb8fb16edd8f2e3eb57b430c493b7f3da9f4..90e91e8e87a4a2f5abc71d260f9fcf9dbdb53fbf 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/g.dot
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/g.dot
@@ -2,47 +2,45 @@ digraph g {
   rankdir = TB ;
   node [ style = filled, shape = box ] ;
   N000 [ color = red, shape = circle, label = "*" ] ;
-  N035 [ color=red , label="Prove g_ensures_2" ] ;
-  N035 -> N000 [ style=dotted ] ;
-  N036 [ color=lightblue , label="F-out { a b }" ] ;
+  N034 [ color=red , label="Prove g_ensures_2" ] ;
+  N034 -> N000 [ style=dotted ] ;
+  N035 [ color=lightblue , label="F-out { a b }" ] ;
+ N035 -> N034 ;
+  N036 [ label="Label wp:post" ] ;
  N036 -> N035 ;
-  N037 [ label="Label wp:post" ] ;
+  N037 [ color=lightblue , label="B-out { __retres }" ] ;
  N037 -> N036 ;
-  N038 [ color=lightblue , label="B-out { __retres }" ] ;
+  N038 [ color=orange , label="Return __retres" ] ;
  N038 -> N037 ;
-  N039 [ color=orange , label="Return __retres" ] ;
+  N039 [ label="Label wp:sid32 (Stmt s32)" ] ;
  N039 -> N038 ;
-  N040 [ label="Label wp:sid32 (Stmt s32)" ] ;
+  N040 [ label="Label wp:sid31 (Stmt s31)" ] ;
  N040 -> N039 ;
-  N041 [ label="Label wp:sid31 (Stmt s31)" ] ;
+  N041 [ color=green , label="Assume g_assert" ] ;
  N041 -> N040 ;
-  N042 [ color=green , label="Assume g_assert" ] ;
- N042 -> N041 ;
-  N043 [ color=red , label="Prove g_assert" ] ;
-  N043 -> N042 [ style=dotted ] ;
-  N044 [ label="" , shape=circle ] ;
+  N042 [ color=red , label="Prove g_assert" ] ;
+  N042 -> N041 [ style=dotted ] ;
+  N043 [ label="" , shape=circle ] ;
+ N043 -> N042 ;
+ N043 -> N041 ;
+  N044 [ label="Label wp:sid30 (Stmt s30)" ] ;
  N044 -> N043 ;
- N044 -> N042 ;
-  N045 [ label="Label wp:sid30 (Stmt s30)" ] ;
+  N045 [ color=orange , label="__retres := a + b" ] ;
  N045 -> N044 ;
-  N046 [ color=orange , label="__retres := a + b" ] ;
+  N046 [ label="Label wp:sid13 (Stmt s13)" ] ;
  N046 -> N045 ;
-  N047 [ label="Label wp:sid13 (Stmt s13)" ] ;
+  N047 [ label="Label wp:sid29 (Stmt s29)" ] ;
  N047 -> N046 ;
-  N048 [ label="Label wp:sid29 (Stmt s29)" ] ;
+  N048 [ label="Label wp:sid11 (Stmt s11)" ] ;
  N048 -> N047 ;
-  N049 [ label="Label wp:sid11 (Stmt s11)" ] ;
+  N049 [ color=lightblue , label="B-in { __retres }" ] ;
  N049 -> N048 ;
-  N050 [ color=lightblue , label="B-in { __retres }" ] ;
+  N050 [ color=lightblue , label="F-in { a b }" ] ;
  N050 -> N049 ;
-  N051 [ color=lightblue , label="F-frame { a b }" ] ;
+  N051 [ label="Label wp:pre" ] ;
  N051 -> N050 ;
-  N052 [ label="Label wp:pre" ] ;
+  N052 [ color=lightblue , label="Global { }" ] ;
  N052 -> N051 ;
-  N053 [ color=lightblue , label="F-in { a b }" ] ;
+  N053 [ color=cyan , label="Function g" ] ;
  N053 -> N052 ;
-  N054 [ color=lightblue , label="Global { }" ] ;
- N054 -> N053 ;
-  N055 [ color=cyan , label="Function g" ] ;
- N055 -> N054 ;
 }
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/ground_real.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/ground_real.res.oracle
index 9a35ec5ad1c74a93c5bc6f68d35c8b7dbb0a0fdc..a875c26ce74f00b05ef3fded034d1de490509a9c 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/ground_real.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/ground_real.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/ground_real.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_R : Valid
 [wp] Proved goals:    1 / 1
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/inductive.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/inductive.res.oracle
index 4c1700d30e3a246fcd6405fdad46b5f2dcea8453..6d7143512ed48ff7e046732495c4230c531fc48a 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/inductive.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/inductive.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-timeout 240 [...]
 [kernel] Parsing tests/wp_plugin/inductive.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: native support for coq is deprecated, use tip instead
 [wp] 2 goals scheduled
 [wp] [Coq] Goal typed_lemma_offset : Saved script
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/init_const.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/init_const.res.oracle
index cdc1cc3b7c5193f7139c2c959d34ccf09ff88ada..4389c814aec8df535f7d9bbd12b2b51036f6c7e6 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/init_const.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/init_const.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/init_const.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 4 goals scheduled
 [wp] [Alt-Ergo] Goal typed_fA_ensures_KO : Unsuccess
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/init_const_guard.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/init_const_guard.res.oracle
index 21ceab5595dc8b8671c4c700d44d75a2b39f1914..2a606446dc508ff2c1ee4c64f75ce2f7a75e7097 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/init_const_guard.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/init_const_guard.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/init_const_guard.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 7 goals scheduled
 [wp] [Qed] Goal typed_f_ensures_Const : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/init_extern.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/init_extern.res.oracle
index a998137dcc1af1438ca62c0353296865f0ee3117..bbc0f9b17382cdbafbeb6f5a9aa9279ce478c6dc 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/init_extern.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/init_extern.res.oracle
@@ -2,7 +2,6 @@
 [kernel] Parsing tests/wp_plugin/init_extern.i (no preprocessing)
 [kernel] Parsing tests/wp_plugin/init_linker.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
 [wp] [Qed] Goal typed_f_ensures_OK : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/init_valid.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/init_valid.res.oracle
index 2ad8b7259698ff0772c2439f7309148ba0aba033..3f9234d02bd81a465147e9d05117667f9dfe9cbd 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/init_valid.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/init_valid.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/init_valid.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 4 goals scheduled
 [wp] [Qed] Goal typed_validA_assert_OK : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/initarr.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/initarr.res.oracle
index 1654af3ba936a2a8b340f13e4970ebc01c3dcd89..1607fa2719344a9f53471ea5e443d5e3d319ea6d 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/initarr.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/initarr.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/initarr.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Alt-Ergo] Goal typed_job_ensures_SEP : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/injector.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/injector.0.res.oracle
index af35f6b8507e96fce68044a83cac500c84814833..65ebd21fce6811c9b33ea504d9ae8136a7f6d9aa 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/injector.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/injector.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/injector.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 13 goals scheduled
 [wp] [Qed] Goal typed_f_call_g_requires : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/injector.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/injector.1.res.oracle
index 273409a9bcabf0ce12e0eb3e455a9d4c89714d40..8730d221d2969eca9b2a83336a5d944037f6874e 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/injector.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/injector.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-steps 50 [...]
 [kernel] Parsing tests/wp_plugin/injector.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 4 goals scheduled
 [wp] [Alt-Ergo] Goal typed_f_ko_ensures_qed_ko : Unsuccess
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/loop.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/loop.res.oracle
index 33f5a9859865d89af15b0b70727997753ba2d148..602235b4e1772332174a1428afa250766274b4de 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/loop.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/loop.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/loop.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 9 goals scheduled
 [wp] [Alt-Ergo] Goal typed_init_ensures_qed_ok : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/loopcurrent.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/loopcurrent.res.oracle
index 60ddf9009c6893786a7ed8b4d15627fde5437c5e..75c868bd36ae05e9b8149506fe3d16a45176c363 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/loopcurrent.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/loopcurrent.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/loopcurrent.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_plugin/loopcurrent.i:12: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/loopentry.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/loopentry.res.oracle
index 93b40345adbe00724c694ba553239dac785743b1..f62dda1b35eefa46aabdfd4180461127302e5bd7 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/loopentry.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/loopentry.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/loopentry.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_plugin/loopentry.i:12: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/loopextra.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/loopextra.res.oracle
index 32ed32900d4795e92adf0f51e067b0be4e80c7d0..111bb4a02c06d23a33d6407e49cf7337e132400d 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/loopextra.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/loopextra.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/loopextra.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_plugin/loopextra.i:6: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/mask.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/mask.res.oracle
index fab459f7a10eec2d4250a89b09651f7250977f6e..a212cb8779f94f82742d16dac4a0a92d846a3f36 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/mask.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/mask.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/mask.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Qed] Goal typed_compute_ensures_A : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.0.res.oracle
index 82888040205afdcb8ba0206e3b6007c7fb8925c4..4af858324c195a679739ad390d26d65cb4403141 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-timeout 100 -wp-steps 1500 [...]
 [kernel] Parsing tests/wp_plugin/math.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 30 goals scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_abs_neg : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.1.res.oracle
index a3c9e94c53e0e0d69ef81c937eff0a97aad86f9e..40753d2a146f38c6a7492f72afbf13ab99e03d60 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-timeout 100 -wp-steps 1500 [...]
 [kernel] Parsing tests/wp_plugin/math.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: native support for alt-ergo is deprecated, use why3 instead
 [wp] 30 goals scheduled
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.2.res.oracle
index 6dd9859b66923ba3291bb6433d7017c18ef0d153..ffc737646cc3751ece484585b3668b9546fa4a87 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.2.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-timeout 100 -wp-steps 10 [...]
 [kernel] Parsing tests/wp_plugin/math.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 9 goals scheduled
 [wp] [Alt-Ergo] Goal typed_ko_ensures_ko_sin_asin : Unsuccess
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.3.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.3.res.oracle
index 5b07b133292e5f331f03ec150346b916870de08f..81ba2360317d22e51aed43fc0ec3e3e828560c6f 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.3.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.3.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-timeout 100 -wp-steps 10 [...]
 [kernel] Parsing tests/wp_plugin/math.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: native support for alt-ergo is deprecated, use why3 instead
 [wp] 9 goals scheduled
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/model.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/model.res.oracle
index 45defe11c252e1fdb22342768b34b459e48ce881..9a0ca70837815110370de4bd01d9653916f4d785 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/model.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/model.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp_plugin/model.i:10: Warning: 
   parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead.
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 ---------------------------------------------
@@ -85,37 +84,7 @@ end
   f                         -        -        1       0.0%
 ------------------------------------------------------------
 [wp] Running WP plugin...
-[wp] 2 goals scheduled
-[wp:print-generated] 
-  theory WP1
-    (* use why3.BuiltIn.BuiltIn *)
-    
-    (* use bool.Bool *)
-    
-    (* use int.Int *)
-    
-    (* use int.ComputerDivision *)
-    
-    (* use real.RealInfix *)
-    
-    (* use frama_c_wp.qed.Qed *)
-    
-    (* use map.Map *)
-    
-    (* use frama_c_wp.memory.Memory *)
-    
-    (* use frama_c_wp.cint.Cint *)
-    
-    (* use Compound *)
-    
-    (* use Axiomatic *)
-    
-    goal wp_goal :
-      forall t:addr -> int, i:int, a:addr.
-       let x = get t (shift_sint32 a i) in
-       region (base a) <= 0 -> is_sint32 i -> is_sint32 x -> P_P x
-  end
-[wp] [Alt-Ergo] Goal typed_f_ensures : Unsuccess
+[wp] 1 goal scheduled
 ---------------------------------------------
 --- Context 'typed_ref_f' Cluster 'Compound' 
 ---------------------------------------------
@@ -159,7 +128,7 @@ theory Axiomatic1
   predicate P_P1 int
 end
 [wp:print-generated] 
-  theory WP2
+  theory WP1
     (* use why3.BuiltIn.BuiltIn *)
     
     (* use bool.Bool1 *)
@@ -188,8 +157,8 @@ end
        region1 (base1 a) <=' 0 -> is_sint321 i -> is_sint321 x -> P_P1 x
   end
 [wp] [Alt-Ergo] Goal typed_ref_f_ensures : Unsuccess
-[wp] Proved goals:    0 / 2
-  Alt-Ergo:        0  (unsuccess: 2)
+[wp] Proved goals:    0 / 1
+  Alt-Ergo:        0  (unsuccess: 1)
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   f                         -        -        2       0.0%
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/no_step_limit.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/no_step_limit.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..ce12f14d75e508eb5d7d3aaf23c54f7322e71554
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/no_step_limit.res.oracle
@@ -0,0 +1,7 @@
+# frama-c -wp -wp-steps 10 [...]
+[kernel] Parsing tests/wp_plugin/no_step_limit.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] 1 goal scheduled
+[wp] [no-steps] Goal typed_lemma_truc : Unsuccess
+[wp] Proved goals:    0 / 1
+  no-steps:        0  (unsuccess: 1)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/nosession.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/nosession.res.oracle
index 21dad7a45d6492664cfd7d5c8ecd4aed040ddadf..d56af67a5072ba45bb43314c4e3ca5658524abf1 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/nosession.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/nosession.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/nosession.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Failed] Goal typed_f_ensures
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/nowp.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/nowp.res.oracle
index 28d3b1aac6194de68decb3aad592930d7d05c1d2..f11f92c390ec20461736d7afffab1019345708a9 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/nowp.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/nowp.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/nowp.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/nth.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/nth.res.oracle
index f7ef9322a9954f7c26eddbf37d08b84cefee4354..1647eed4e12f9eec5d91b1c473c1899f1700a55d 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/nth.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/nth.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/nth.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 4 goals scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_access_16_16_ok : Valid
 [wp] [Alt-Ergo] Goal typed_lemma_access_4_4_ok : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/overarray.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/overarray.res.oracle
index a78f9d23cc2c17a9cd6d0711871c8fb2a775b1eb..6daeab38c98f63ca1fdf216a7f789be8d86d92c5 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/overarray.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/overarray.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/overarray.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 12 goals scheduled
 [wp] [Qed] Goal typed_f1_ok_assigns_exit : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/overassign.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/overassign.res.oracle
index 96e53948b71b521539af303f915363f2e370f25f..5bfb2cf3e3404fc852f21bd6bce54e9d187991a5 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/overassign.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/overassign.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/overassign.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 12 goals scheduled
 [wp] [Qed] Goal typed_f1_ok_assigns_exit : Valid
@@ -28,3 +27,11 @@
   f5_ko                     -        -        2       0.0%
   f6_ko                     -        -        2       0.0%
 ------------------------------------------------------------
+[wp] Warning: Memory model hypotheses for function 'f1_ok':
+  /*@ behavior typed:
+        requires \separated(p + (0 .. 9), &p); */
+  void f1_ok(void);
+[wp] Warning: Memory model hypotheses for function 'f2_ok':
+  /*@ behavior typed:
+        requires \separated(p + (10 .. 19), &p); */
+  void f2_ok(void);
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/params.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/params.res.oracle
index 66f2e22013fdd80456a4ba59946ccd0f5b1d73f4..f5af22f701424ef220ab28a18bdebd44c36410d2 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/params.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/params.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/params.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_lem : Valid
 [wp] Proved goals:    1 / 1
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/plet.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/plet.res.oracle
index a8a6e9e1f363a439258d75c0e9940283db1d04dc..30017bf15b078ab2665348dee450cf16b66fde5e 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/plet.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/plet.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/plet.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_GOAL : Valid
 [wp] Proved goals:    1 / 1
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/post_assigns.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/post_assigns.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..5f2225e888c8039688ad6f032109704023a8750c
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/post_assigns.res.oracle
@@ -0,0 +1,23 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_plugin/post_assigns.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 5 goals scheduled
+[wp] [Qed] Goal typed_receive_ensures : Valid
+[wp] [Qed] Goal typed_receive_assigns_exit_part1 : Valid
+[wp] [Qed] Goal typed_receive_assigns_exit_part2 : Valid
+[wp] [Qed] Goal typed_receive_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_receive_assigns_normal_part2 : Valid
+[wp] Proved goals:    5 / 5
+  Qed:             5
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  receive                   5        -        5       100%
+------------------------------------------------------------
+[wp] Warning: Memory model hypotheses for function 'receive':
+  /*@
+     behavior typed:
+       requires \separated(message + (..), &size);
+       requires \separated(message + (0 .. \at(size,Post)), &size);
+     */
+  void receive(int n, char *message);
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/post_valid.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/post_valid.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..42883461442bf7cfe6e8ca58e5a3912baf397bed
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/post_valid.res.oracle
@@ -0,0 +1,15 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_plugin/post_valid.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 3 goals scheduled
+[wp] [Alt-Ergo] Goal typed_job_ensures_LOCAL : Valid
+[wp] [Alt-Ergo] Goal typed_job_ensures_FORMAL : Unsuccess
+[wp] [Alt-Ergo] Goal typed_job_ensures_GLOBAL : Valid
+[wp] Proved goals:    2 / 3
+  Qed:             0 
+  Alt-Ergo:        2  (unsuccess: 1)
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  job                       -        2        3      66.7%
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/prenex.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/prenex.res.oracle
index 522d782c44a4cdbf2521e37f0a221b09d177d3f4..dcaa1de220c10583f6f3ba7868cc1a14e86d7bea 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/prenex.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/prenex.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/prenex.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 12 goals scheduled
 [wp] [Alt-Ergo] Goal typed_diag_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/region_to_coq.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/region_to_coq.res.oracle
index e9138f7b492a1b4692401846228aec556b99e6b1..90915c00cf2005f3e6fc62a0cb21910cb94531b2 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/region_to_coq.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/region_to_coq.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/region_to_coq.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: native support for coq is deprecated, use tip instead
 [wp] 4 goals scheduled
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/removed.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/removed.res.oracle
index b622a45a0f7a2daa0c28f30d33096e4fde0e5d6c..2580c0129be69f18f65f38d88a7180eeb7b2c4cb 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/removed.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/removed.res.oracle
@@ -12,7 +12,6 @@
 [eva:final-states] Values at end of function main:
   __retres ∈ [-2147483647..2147483647]
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_main_assert_Eva_signed_overflow : Unsuccess
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/repeat.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/repeat.res.oracle
index 28ac3e50e6eb882bd71fa02d0ae891664acad61b..d66e2f2fd319d17876094133fa82c11fb2de4300 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/repeat.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/repeat.res.oracle
@@ -1,33 +1,13 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/repeat.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_plugin/repeat.c:47: Warning: 
   Missing assigns clause (assigns 'everything' instead)
 [wp] 47 goals scheduled
-[wp] [Qed] Goal typed_induction_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_induction_loop_invariant_preserved : Valid
-[wp] [Qed] Goal typed_induction_loop_invariant_established : Valid
-[wp] [Alt-Ergo] Goal typed_induction_loop_invariant_2_preserved : Valid
-[wp] [Qed] Goal typed_induction_loop_invariant_2_established : Valid
-[wp] [Qed] Goal typed_induction_loop_assigns : Valid
-[wp] [Qed] Goal typed_induction_assigns_exit_part1 : Valid
-[wp] [Qed] Goal typed_induction_assigns_exit_part2 : Valid
-[wp] [Qed] Goal typed_induction_assigns_normal : Valid
 [wp] [Qed] Goal typed_master_ensures : Valid
 [wp] [Qed] Goal typed_master_assigns_exit : Valid
 [wp] [Qed] Goal typed_master_assigns_normal : Valid
-[wp] [Alt-Ergo] Goal typed_shifted_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_shifted_loop_invariant_preserved : Valid
-[wp] [Qed] Goal typed_shifted_loop_invariant_established : Valid
-[wp] [Alt-Ergo] Goal typed_shifted_loop_invariant_2_preserved : Valid
-[wp] [Qed] Goal typed_shifted_loop_invariant_2_established : Valid
-[wp] [Qed] Goal typed_shifted_loop_assigns : Valid
-[wp] [Qed] Goal typed_shifted_assigns_exit_part1 : Valid
-[wp] [Qed] Goal typed_shifted_assigns_exit_part2 : Valid
-[wp] [Qed] Goal typed_shifted_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_shifted_assigns_normal_part2 : Valid
 [wp] [Qed] Goal typed_unroll_ensures : Valid
 [wp] [Qed] Goal typed_unroll_loop_invariant_preserved : Valid
 [wp] [Qed] Goal typed_unroll_loop_invariant_established : Valid
@@ -53,6 +33,25 @@
 [wp] [Qed] Goal typed_unroll_assigns_normal_part09 : Valid
 [wp] [Qed] Goal typed_unroll_assigns_normal_part10 : Valid
 [wp] [Qed] Goal typed_unroll_assigns_normal_part11 : Valid
+[wp] [Qed] Goal typed_induction_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_induction_loop_invariant_preserved : Valid
+[wp] [Qed] Goal typed_induction_loop_invariant_established : Valid
+[wp] [Alt-Ergo] Goal typed_induction_loop_invariant_2_preserved : Valid
+[wp] [Qed] Goal typed_induction_loop_invariant_2_established : Valid
+[wp] [Qed] Goal typed_induction_loop_assigns : Valid
+[wp] [Qed] Goal typed_induction_assigns_exit_part1 : Valid
+[wp] [Qed] Goal typed_induction_assigns_exit_part2 : Valid
+[wp] [Qed] Goal typed_induction_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_shifted_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_shifted_loop_invariant_preserved : Valid
+[wp] [Qed] Goal typed_shifted_loop_invariant_established : Valid
+[wp] [Alt-Ergo] Goal typed_shifted_loop_invariant_2_preserved : Valid
+[wp] [Qed] Goal typed_shifted_loop_invariant_2_established : Valid
+[wp] [Qed] Goal typed_shifted_loop_assigns : Valid
+[wp] [Qed] Goal typed_shifted_assigns_exit_part1 : Valid
+[wp] [Qed] Goal typed_shifted_assigns_exit_part2 : Valid
+[wp] [Qed] Goal typed_shifted_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_shifted_assigns_normal_part2 : Valid
 [wp] Proved goals:   47 / 47
   Qed:            42 
   Alt-Ergo:        5
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/rte.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/rte.res.oracle
index 71c6b6ffc4b9973d35fa83da51dfb5a06aa3d003..b15eec1d8c0f3329246d434eb8f8f479d12f622e 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/rte.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/rte.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp_plugin/rte.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function job
 [rte] annotating function job2
 [rte] annotating function job3
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.0.res.oracle
index 64612393030a62a4f4e7b0dc92fcdfd20e0c8e48..ce5458f78c87634b3be434ba524388d503ccd667 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.0.res.oracle
@@ -1,28 +1,8 @@
 # frama-c -wp -wp-model 'Typed (Caveat)' [...]
 [kernel] Parsing tests/wp_plugin/sequence.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 39 goals scheduled
-[wp] [Qed] Goal typed_caveat_loops_ensures_ok_first : Valid
-[wp] [Alt-Ergo] Goal typed_caveat_loops_ensures_ok_last : Valid
-[wp] [Alt-Ergo] Goal typed_caveat_loops_loop_invariant_ok_id_max_preserved : Valid
-[wp] [Qed] Goal typed_caveat_loops_loop_invariant_ok_id_max_established : Valid
-[wp] [Alt-Ergo] Goal typed_caveat_loops_loop_invariant_ok_id_min_preserved : Valid
-[wp] [Qed] Goal typed_caveat_loops_loop_invariant_ok_id_min_established : Valid
-[wp] [Alt-Ergo] Goal typed_caveat_loops_loop_invariant_ok_inv_preserved : Valid
-[wp] [Qed] Goal typed_caveat_loops_loop_invariant_ok_inv_established : Valid
-[wp] [Qed] Goal typed_caveat_loops_loop_assigns : Valid
-[wp] [Qed] Goal typed_caveat_loops_assigns_exit_part1 : Valid
-[wp] [Qed] Goal typed_caveat_loops_assigns_exit_part2 : Valid
-[wp] [Qed] Goal typed_caveat_loops_assigns_exit_part3 : Valid
-[wp] [Qed] Goal typed_caveat_loops_assigns_normal_part1 : Valid
-[wp] [Qed] Goal typed_caveat_loops_assigns_normal_part2 : Valid
-[wp] [Qed] Goal typed_caveat_loops_assigns_normal_part3 : Valid
-[wp] [Alt-Ergo] Goal typed_caveat_loops_g_called_ensures_ok_u1 : Valid
-[wp] [Qed] Goal typed_caveat_loops_g_called_ensures_ok_u2 : Valid
-[wp] [Alt-Ergo] Goal typed_caveat_loops_g_not_called_ensures_ok_v1 : Valid
-[wp] [Alt-Ergo] Goal typed_caveat_loops_g_not_called_ensures_ok_v2 : Valid
 [wp] [Qed] Goal typed_caveat_no_calls_ensures_ok_m1 : Valid
 [wp] [Alt-Ergo] Goal typed_caveat_no_calls_ensures_ok_m2 : Valid
 [wp] [Qed] Goal typed_caveat_no_calls_ensures_ok_bug_why3_n1 : Valid
@@ -43,6 +23,25 @@
 [wp] [Qed] Goal typed_caveat_sequence_g_not_called_ensures_ok_q1 : Valid
 [wp] [Qed] Goal typed_caveat_sequence_g_not_called_ensures_ok_q2 : Valid
 [wp] [Alt-Ergo] Goal typed_caveat_sequence_g_not_called_ensures_ok_q3 : Valid
+[wp] [Qed] Goal typed_caveat_loops_ensures_ok_first : Valid
+[wp] [Alt-Ergo] Goal typed_caveat_loops_ensures_ok_last : Valid
+[wp] [Alt-Ergo] Goal typed_caveat_loops_loop_invariant_ok_id_max_preserved : Valid
+[wp] [Qed] Goal typed_caveat_loops_loop_invariant_ok_id_max_established : Valid
+[wp] [Alt-Ergo] Goal typed_caveat_loops_loop_invariant_ok_id_min_preserved : Valid
+[wp] [Qed] Goal typed_caveat_loops_loop_invariant_ok_id_min_established : Valid
+[wp] [Alt-Ergo] Goal typed_caveat_loops_loop_invariant_ok_inv_preserved : Valid
+[wp] [Qed] Goal typed_caveat_loops_loop_invariant_ok_inv_established : Valid
+[wp] [Qed] Goal typed_caveat_loops_loop_assigns : Valid
+[wp] [Qed] Goal typed_caveat_loops_assigns_exit_part1 : Valid
+[wp] [Qed] Goal typed_caveat_loops_assigns_exit_part2 : Valid
+[wp] [Qed] Goal typed_caveat_loops_assigns_exit_part3 : Valid
+[wp] [Qed] Goal typed_caveat_loops_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_caveat_loops_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_caveat_loops_assigns_normal_part3 : Valid
+[wp] [Alt-Ergo] Goal typed_caveat_loops_g_called_ensures_ok_u1 : Valid
+[wp] [Qed] Goal typed_caveat_loops_g_called_ensures_ok_u2 : Valid
+[wp] [Alt-Ergo] Goal typed_caveat_loops_g_not_called_ensures_ok_v1 : Valid
+[wp] [Alt-Ergo] Goal typed_caveat_loops_g_not_called_ensures_ok_v2 : Valid
 [wp] Proved goals:   39 / 39
   Qed:            25 
   Alt-Ergo:       14
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.1.res.oracle
index 8905c23c28d16382cc830f9f7616a7718869d0e6..4bda2590b48433fac647442ebaa1d96c71b45ce6 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.1.res.oracle
@@ -1,9 +1,23 @@
 # frama-c -wp -wp-model 'Typed (Caveat)' [...]
 [kernel] Parsing tests/wp_plugin/sequence.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 34 goals scheduled
+[wp] [Qed] Goal typed_caveat_no_calls_ensures_ok_m1 : Valid
+[wp] [Alt-Ergo] Goal typed_caveat_no_calls_ensures_ok_m2 : Valid
+[wp] [Alt-Ergo] Goal typed_caveat_no_calls_ensures_ok_n2 : Valid
+[wp] [Alt-Ergo] Goal typed_caveat_no_calls_ensures_ok_n3 : Valid
+[wp] [Qed] Goal typed_caveat_no_calls_assigns : Valid
+[wp] [Qed] Goal typed_caveat_sequence_assigns_exit : Valid
+[wp] [Qed] Goal typed_caveat_sequence_assigns_normal : Valid
+[wp] [Qed] Goal typed_caveat_sequence_g_called_ensures_ok_o1 : Valid
+[wp] [Qed] Goal typed_caveat_sequence_g_called_ensures_ok_p1 : Valid
+[wp] [Qed] Goal typed_caveat_sequence_g_called_ensures_ok_p2 : Valid
+[wp] [Alt-Ergo] Goal typed_caveat_sequence_g_called_ensures_ok_p3 : Valid
+[wp] [Qed] Goal typed_caveat_sequence_g_not_called_ensures_ok_o2 : Valid
+[wp] [Qed] Goal typed_caveat_sequence_g_not_called_ensures_ok_q1 : Valid
+[wp] [Qed] Goal typed_caveat_sequence_g_not_called_ensures_ok_q2 : Valid
+[wp] [Alt-Ergo] Goal typed_caveat_sequence_g_not_called_ensures_ok_q3 : Valid
 [wp] [Qed] Goal typed_caveat_loops_ensures_ok_first : Valid
 [wp] [Alt-Ergo] Goal typed_caveat_loops_ensures_ok_last : Valid
 [wp] [Alt-Ergo] Goal typed_caveat_loops_loop_invariant_ok_id_max_preserved : Valid
@@ -23,21 +37,6 @@
 [wp] [Qed] Goal typed_caveat_loops_g_called_ensures_ok_u2 : Valid
 [wp] [Alt-Ergo] Goal typed_caveat_loops_g_not_called_ensures_ok_v1 : Valid
 [wp] [Alt-Ergo] Goal typed_caveat_loops_g_not_called_ensures_ok_v2 : Valid
-[wp] [Qed] Goal typed_caveat_no_calls_ensures_ok_m1 : Valid
-[wp] [Alt-Ergo] Goal typed_caveat_no_calls_ensures_ok_m2 : Valid
-[wp] [Alt-Ergo] Goal typed_caveat_no_calls_ensures_ok_n2 : Valid
-[wp] [Alt-Ergo] Goal typed_caveat_no_calls_ensures_ok_n3 : Valid
-[wp] [Qed] Goal typed_caveat_no_calls_assigns : Valid
-[wp] [Qed] Goal typed_caveat_sequence_assigns_exit : Valid
-[wp] [Qed] Goal typed_caveat_sequence_assigns_normal : Valid
-[wp] [Qed] Goal typed_caveat_sequence_g_called_ensures_ok_o1 : Valid
-[wp] [Qed] Goal typed_caveat_sequence_g_called_ensures_ok_p1 : Valid
-[wp] [Qed] Goal typed_caveat_sequence_g_called_ensures_ok_p2 : Valid
-[wp] [Alt-Ergo] Goal typed_caveat_sequence_g_called_ensures_ok_p3 : Valid
-[wp] [Qed] Goal typed_caveat_sequence_g_not_called_ensures_ok_o2 : Valid
-[wp] [Qed] Goal typed_caveat_sequence_g_not_called_ensures_ok_q1 : Valid
-[wp] [Qed] Goal typed_caveat_sequence_g_not_called_ensures_ok_q2 : Valid
-[wp] [Alt-Ergo] Goal typed_caveat_sequence_g_not_called_ensures_ok_q3 : Valid
 [wp] Proved goals:   34 / 34
   Qed:            22 
   Alt-Ergo:       12
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.2.res.oracle
index b58e86cce5e522462e5d2c639c8cc7b8bee0eb27..9f08e04867c88212456b5f19fc1a3f40e7ba00e8 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.2.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Caveat)' -wp-steps 50 [...]
 [kernel] Parsing tests/wp_plugin/sequence.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/stmt.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/stmt.res.oracle
index d9273f9a996b1e35e80c61643caab9f1c2a5a547..3a74fac104c542c05e02bcaa5acab1560cebf58a 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/stmt.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/stmt.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/stmt.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] [CFG] Goal f_exits : Valid (Unreachable)
 [wp] [CFG] Goal g_exits : Valid (Unreachable)
 [wp] [CFG] Goal g_assigns : Valid (Unreachable)
@@ -13,11 +12,11 @@
 [wp] [CFG] Goal h_exits : Valid (Unreachable)
 [wp] Warning: Missing RTE guards
 [wp] 10 goals scheduled
+[wp] [Qed] Goal typed_f_ensures : Valid
+[wp] [Qed] Goal typed_f_assigns : Valid
 [wp] [Qed] Goal typed_f_ensures_2 : Valid
 [wp] [Qed] Goal typed_f_ensures_3 : Valid
 [wp] [Qed] Goal typed_f_assert : Valid
-[wp] [Qed] Goal typed_f_ensures : Valid
-[wp] [Qed] Goal typed_f_assigns : Valid
 [wp] [Qed] Goal typed_g_ensures_2 : Valid
 [wp] [Qed] Goal typed_g_assert : Valid
 [wp] [Qed] Goal typed_h_ensures_2 : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/string_c.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/string_c.res.oracle
index 0c67db7db8712f0b13c7fbee20f2db940b1fae8e..e5ecf9b5e00d8593bc806889fba90904b71c6b37 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/string_c.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/string_c.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-timeout 120 -wp-steps 2500 [...]
 [kernel] Parsing tests/wp_plugin/string_c.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 44 goals scheduled
 [wp] [Alt-Ergo] Goal typed_memcpy_ensures_copied_contents : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/struct.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/struct.res.oracle
index 37e0be540b7f5b0a9689248b70d9c3840513c0b3..42aa2a20e4fbef7c950217e1b9386a86b2e31385 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/struct.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/struct.res.oracle
@@ -1,9 +1,14 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/struct.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 18 goals scheduled
+[wp] [Qed] Goal typed_id_ensures_qed_ok_P1 : Valid
+[wp] [Qed] Goal typed_id_ensures_qed_ok_P2 : Valid
+[wp] [Qed] Goal typed_g_ensures_qed_ok_P3 : Valid
+[wp] [Qed] Goal typed_g_ensures_qed_ok_P4 : Valid
+[wp] [Qed] Goal typed_g_ensures_qed_ok_P5 : Valid
+[wp] [Qed] Goal typed_g_assigns : Valid
 [wp] [Qed] Goal typed_f_ensures_qed_ok_E0 : Valid
 [wp] [Qed] Goal typed_f_ensures_qed_ok_E1 : Valid
 [wp] [Qed] Goal typed_f_ensures_qed_ok_E2 : Valid
@@ -16,12 +21,6 @@
 [wp] [Qed] Goal typed_f_ensures_qed_ok_E9 : Valid
 [wp] [Qed] Goal typed_f_ensures_qed_ok_E10 : Valid
 [wp] [Qed] Goal typed_f_ensures_qed_ok_E11 : Valid
-[wp] [Qed] Goal typed_g_ensures_qed_ok_P3 : Valid
-[wp] [Qed] Goal typed_g_ensures_qed_ok_P4 : Valid
-[wp] [Qed] Goal typed_g_ensures_qed_ok_P5 : Valid
-[wp] [Qed] Goal typed_g_assigns : Valid
-[wp] [Qed] Goal typed_id_ensures_qed_ok_P1 : Valid
-[wp] [Qed] Goal typed_id_ensures_qed_ok_P2 : Valid
 [wp] Proved goals:   18 / 18
   Qed:            18
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/struct_hack.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/struct_hack.res.oracle
index f42dd19bc62938f7011f367998a9305ee490715a..15e36ca17c4b10d669412b57f0051f386e9cff61 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/struct_hack.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/struct_hack.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp_plugin/struct_hack.i:46: Warning: 
   parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead.
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_plugin/struct_hack.i:37: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/subset.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/subset.res.oracle
index 1330ec957e608d3a72c926aee310b26b97312b32..8fc2d073364afea561fc261a9a71f6f72fd199f7 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/subset.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/subset.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/subset.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_mem_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/subset_fopen.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/subset_fopen.res.oracle
index bc26d1ed0e5e1ba13b5e989e26d3429f275c549c..7f76d80b00a10d94eb30f412df38843d33541efa 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/subset_fopen.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/subset_fopen.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/subset_fopen.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 5 goals scheduled
 [wp] [Alt-Ergo] Goal typed_f_assert_Ok_A : Unsuccess
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/trig.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/trig.res.oracle
index a4bc55ce426f46f0f19a9c08a38a529ac8b438f4..59455952143a4d400e7a94030a7fa6c446b544ff 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/trig.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/trig.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/trig.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 4 goals scheduled
 [wp] [Alt-Ergo] Goal typed_foo_assert_qed_ok_S : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/unroll.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/unroll.res.oracle
index e847532a8b0af675af2c134b0a994bf4df024999..1acc6c2f67194ac1cacb71df228693a3ff42ad02 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/unroll.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/unroll.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/unroll.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_plugin/unroll.i:20: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/unsafe-arrays.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/unsafe-arrays.res.oracle
index 2d2d4a2621c736e1c92541672122ef490fdb0170..6944a089a5680677ce9f2faad5a2eb6608eb7665 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/unsafe-arrays.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/unsafe-arrays.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/unsafe-arrays.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
 [wp] [Qed] Goal typed_f_ensures_ARRAYS : Valid
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/unsigned.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/unsigned.res.oracle
index 1901df8a161a2fe48d947ec5cbe3977a2e6292e2..4dc2d8b6cabcc2b77ac16615387e15dadd33c4a1 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/unsigned.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/unsigned.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_plugin/unsigned.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 1 goal scheduled
 [wp] [Script] Goal typed_lemma_U32 : Valid
 [wp] Proved goals:    1 / 1
diff --git a/src/plugins/wp/tests/wp_plugin/post_assigns.i b/src/plugins/wp/tests/wp_plugin/post_assigns.i
new file mode 100644
index 0000000000000000000000000000000000000000..bbd341cbb1397f971ead2717d0766305ed22c28e
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/post_assigns.i
@@ -0,0 +1,15 @@
+/*@
+  assigns *(message + (0 .. n));
+*/
+extern void write(char *message, int n);
+
+int size;
+
+/*@
+  ensures size == n;
+  assigns size, message[ 0 .. \at(size,Post) ];
+*/
+void receive(int n,char *message) {
+  size = n ;
+  write(message, size);
+}
diff --git a/src/plugins/wp/tests/wp_plugin/post_valid.i b/src/plugins/wp/tests/wp_plugin/post_valid.i
new file mode 100644
index 0000000000000000000000000000000000000000..a8add205c1e36a6b4c0e3fda2cefb9e11f7abcce
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/post_valid.i
@@ -0,0 +1,15 @@
+int global;
+
+int *p_global, *p_local, *p_formal ;
+
+/*@
+  ensures LOCAL: !\valid(p_local);
+  ensures FORMAL: \valid(p_formal); // FAILS
+  ensures GLOBAL: \valid(p_global);
+*/
+void job(int formal) {
+  int local = formal;
+  p_local = &local;
+  p_global = &global;
+  p_formal = &formal;
+}
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/array1.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/array1.res.oracle
index ed869315385b0a55a80d94923101c8f805babcce..1af004f7352a7399067955d2a6f532ea402593f8 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/array1.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/array1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/array1.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/array2.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/array2.res.oracle
index 5e7de78ee60a2f5aa14cc1f5e319aab15f01ab5e..8a08fc002341f92fc59c3e0bddc74b46aafb47dd 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/array2.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/array2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/array2.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/array3.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/array3.res.oracle
index d46d52bdc2ca803b21d3faac80876001c715fc68..1344cd80f93131f3b3ce5b68df14775600fe5537 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/array3.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/array3.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/array3.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/array4.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/array4.res.oracle
index b732e6a34d538630c79489e85d1256b3a126eeb3..cfd2596b0591d1bc89e1a30cb9ac27a197a52ea2 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/array4.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/array4.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/array4.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/array5.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/array5.res.oracle
index 31f6983483faa6a1cf748b59de00f228305d5855..96c8bb9496dc74752ccd83b438b8cca2cc8f27b2 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/array5.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/array5.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/array5.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/array6.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/array6.res.oracle
index 34d7eb2a98234201feba0ed0c8ac99eb43f27da4..e9b4be282bb2067de102441f7f84bf1a301329ad 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/array6.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/array6.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/array6.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/array7.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/array7.res.oracle
index 0e0ad91c1638620ed0195d7987d0fa01003e73c6..014de0bbb3a906df837b21bab34a69366d353f29 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/array7.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/array7.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/array7.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/array8.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/array8.res.oracle
index 13c02c6b2d165dd77354201d006bda6425925a7f..c045da519b1923ff0250a10be65fbb19fbbc44e0 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/array8.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/array8.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/array8.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/fb_ADD.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/fb_ADD.res.oracle
index 0db49291906bd53d4198f688cb412a1d48eceeab..524115e64b4234b212eba54058f71db95542f2a2 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/fb_ADD.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/fb_ADD.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/fb_ADD.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/fb_SORT.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/fb_SORT.res.oracle
index 372e798b6738aa13ac1808713975884123dac150..98b5221f1755b87c0d3552511f029bb8513c6a74 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/fb_SORT.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/fb_SORT.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/fb_SORT.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/garbled.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/garbled.res.oracle
index af0aea662d2da09f00b8ce7532b0d23648a6771c..7cae27dc0bb5db0195e3dd039165b5036b2f9f7a 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/garbled.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/garbled.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/garbled.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/index.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/index.res.oracle
index fe16dc545ec4bc400ffb2f52a45392edb2555020..851c520b6845a0e1090004ed8a87e04e687e6a37 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/index.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/index.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/index.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/matrix.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/matrix.res.oracle
index d0a1dcf567acd74de8f3d99a2045742ec76ea668..bd22d004dbbb42d74264f5af2f37df6819875f8b 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/matrix.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/matrix.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/matrix.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/structarray1.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/structarray1.res.oracle
index 4f31df7dff83aa35c0fa9c26f3428671d4a1b5b5..f420eeb6427fdbb1ca7a7764ee519a756296b0dd 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/structarray1.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/structarray1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/structarray1.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/structarray2.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/structarray2.res.oracle
index 94c1cbf18655420babfe0f2e5252d44574767bc2..47409954b5b88eb0c499797658218f760eecf9b3 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/structarray2.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/structarray2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/structarray2.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/structarray3.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/structarray3.res.oracle
index 0cee2a2b63172d9a9266c3f665cb4bd8bd3a43b3..1acebc060c044889880df8bffb9b73e6e12e0e65 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/structarray3.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/structarray3.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/structarray3.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/structarray4.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/structarray4.res.oracle
index 70c1d992d17e288ca98283f4f7413b93496b1c8c..ec6b5a2de86270e3dbfc5304c83ce5621c8909fe 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/structarray4.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/structarray4.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/structarray4.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_region/oracle_qualif/swap.res.oracle b/src/plugins/wp/tests/wp_region/oracle_qualif/swap.res.oracle
index 258e09a4a6956547a87e73fee12edb2644aaea3c..f736619caac65deed1a4955a8fe1996603c0dc18 100644
--- a/src/plugins/wp/tests/wp_region/oracle_qualif/swap.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle_qualif/swap.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_region/swap.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_store/oracle/array.res.oracle b/src/plugins/wp/tests/wp_store/oracle/array.res.oracle
index 70648cc14cdc8c290289caa867c7ec2bbb738ae8..cf476ad115dcb52548e6b69484c218d9305aab60 100644
--- a/src/plugins/wp/tests/wp_store/oracle/array.res.oracle
+++ b/src/plugins/wp/tests/wp_store/oracle/array.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_store/array.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function g
diff --git a/src/plugins/wp/tests/wp_store/oracle/natural.res.oracle b/src/plugins/wp/tests/wp_store/oracle/natural.res.oracle
index 3f1d57dc0cb1b878483dbab1ee516abd86930c8b..fc4518d506c71444b4bb382c2a55129ab0718b35 100644
--- a/src/plugins/wp/tests/wp_store/oracle/natural.res.oracle
+++ b/src/plugins/wp/tests/wp_store/oracle/natural.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_store/natural.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_store/oracle/nonaliasing.res.oracle b/src/plugins/wp/tests/wp_store/oracle/nonaliasing.res.oracle
index d98e119512c223fbd86aaec2fd70e3056e798b97..0850a3c16edfbe868b78b028cfbd5ed0857e2137 100644
--- a/src/plugins/wp/tests/wp_store/oracle/nonaliasing.res.oracle
+++ b/src/plugins/wp/tests/wp_store/oracle/nonaliasing.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_store/nonaliasing.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_store/oracle/struct.res.oracle b/src/plugins/wp/tests/wp_store/oracle/struct.res.oracle
index 5b15a883bf957c1ab05e2a58869516dac0766312..175f393e79efeb2cd0264d214300239688680d5a 100644
--- a/src/plugins/wp/tests/wp_store/oracle/struct.res.oracle
+++ b/src/plugins/wp/tests/wp_store/oracle/struct.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_store/struct.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_store/oracle_qualif/array.res.oracle b/src/plugins/wp/tests/wp_store/oracle_qualif/array.res.oracle
index 910812b95aae44bd63450b0f0f35c88f63b2b4df..9373264bf9dc25047ecf3a7e64b41b779f82cf97 100644
--- a/src/plugins/wp/tests/wp_store/oracle_qualif/array.res.oracle
+++ b/src/plugins/wp/tests/wp_store/oracle_qualif/array.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_store/array.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Qed] Goal typed_g_ensures_P_startof_qed_ok : Valid
diff --git a/src/plugins/wp/tests/wp_store/oracle_qualif/natural.res.oracle b/src/plugins/wp/tests/wp_store/oracle_qualif/natural.res.oracle
index e2f8762967c52bf9b9e15b728769a49967976843..8d3b99ea68772209a97b649d3349178c3734ce6a 100644
--- a/src/plugins/wp/tests/wp_store/oracle_qualif/natural.res.oracle
+++ b/src/plugins/wp/tests/wp_store/oracle_qualif/natural.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_store/natural.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
 [wp] [Qed] Goal typed_f_ensures_qed_ok : Valid
diff --git a/src/plugins/wp/tests/wp_store/oracle_qualif/nonaliasing.0.res.oracle b/src/plugins/wp/tests/wp_store/oracle_qualif/nonaliasing.0.res.oracle
index fd22abbbb9a85bfa113cd5dde2cd32a335f5b3d9..139e0d95e804f6aca5a9002bd87a629369a385fe 100644
--- a/src/plugins/wp/tests/wp_store/oracle_qualif/nonaliasing.0.res.oracle
+++ b/src/plugins/wp/tests/wp_store/oracle_qualif/nonaliasing.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_store/nonaliasing.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures_qed_ok_P : Valid
diff --git a/src/plugins/wp/tests/wp_store/oracle_qualif/nonaliasing.1.res.oracle b/src/plugins/wp/tests/wp_store/oracle_qualif/nonaliasing.1.res.oracle
index bb918fb79e29cbbe4a96120f338047648ec3dea1..8d1a5b9cac94b62e3b028920bf61cd6897007e1a 100644
--- a/src/plugins/wp/tests/wp_store/oracle_qualif/nonaliasing.1.res.oracle
+++ b/src/plugins/wp/tests/wp_store/oracle_qualif/nonaliasing.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-steps 50 [...]
 [kernel] Parsing tests/wp_store/nonaliasing.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures_qed_ko_P_oracle_ko : Unsuccess
diff --git a/src/plugins/wp/tests/wp_store/oracle_qualif/struct.res.oracle b/src/plugins/wp/tests/wp_store/oracle_qualif/struct.res.oracle
index 461e3fcaa6f0677b0acb619c9cd725a27f15423f..705f7dbdd5295e27155cd343fe99868e8a3713e2 100644
--- a/src/plugins/wp/tests/wp_store/oracle_qualif/struct.res.oracle
+++ b/src/plugins/wp/tests/wp_store/oracle_qualif/struct.res.oracle
@@ -1,13 +1,12 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_store/struct.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 6 goals scheduled
-[wp] [Qed] Goal typed_f_assert_qed_ok : Valid
-[wp] [Alt-Ergo] Goal typed_f_call_g_requires : Valid
 [wp] [Qed] Goal typed_g_ensures : Valid
 [wp] [Qed] Goal typed_g_assigns : Valid
+[wp] [Qed] Goal typed_f_assert_qed_ok : Valid
+[wp] [Alt-Ergo] Goal typed_f_call_g_requires : Valid
 [wp] [Alt-Ergo] Goal typed_main_ensures_P_qed_ok : Valid
 [wp] [Alt-Ergo] Goal typed_main_ensures_Q_qed_ok : Valid
 [wp] Proved goals:    6 / 6
diff --git a/src/plugins/wp/tests/wp_tip/oracle/chunk_printing.res.oracle b/src/plugins/wp/tests/wp_tip/oracle/chunk_printing.res.oracle
index e6de0501d53a2b2f1a10599ec0affcfe32491e76..1cb5b23e556d9e985e712eca70660864d7d9e896 100644
--- a/src/plugins/wp/tests/wp_tip/oracle/chunk_printing.res.oracle
+++ b/src/plugins/wp/tests/wp_tip/oracle/chunk_printing.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-rte [...]
 [kernel] Parsing tests/wp_tip/chunk_printing.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [rte] annotating function main
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_tip/oracle/tac_split_quantifiers.res.oracle b/src/plugins/wp/tests/wp_tip/oracle/tac_split_quantifiers.res.oracle
index 31f7225f21a5627b2d54c7d44bec4ec3c44c15f5..a43b8e6759f42e9e7daabf709612bb09a148cb92 100644
--- a/src/plugins/wp/tests/wp_tip/oracle/tac_split_quantifiers.res.oracle
+++ b/src/plugins/wp/tests/wp_tip/oracle/tac_split_quantifiers.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_tip/tac_split_quantifiers.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function split
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.res.oracle b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.res.oracle
index 0de1e59793298ec333db9346817d211d42e40c25..1fc22002b222f9cfabf273f5b1796664c486a825 100644
--- a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.res.oracle
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_tip/tac_split_quantifiers.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 5 goals scheduled
 [wp] [Script] Goal typed_split_ensures_Goal_Exist_Or : Unsuccess
diff --git a/src/plugins/wp/tests/wp_typed/oracle/array_initialized.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/array_initialized.0.res.oracle
index b461930a19aa459d0662ae84c9cd12d3f9b39050..6911b7211955e6ec8512f8a04d6ade0cbc60baae 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/array_initialized.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/array_initialized.0.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp_typed/array_initialized.c:13: Warning: 
   Too many initializers for array g
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main1
diff --git a/src/plugins/wp/tests/wp_typed/oracle/array_initialized.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/array_initialized.1.res.oracle
index a4351662142b509704e9b463ffa67a88ac831c3c..91c35e494c27dfb6e16519f1d684da5651aa073c 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/array_initialized.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/array_initialized.1.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp_typed/array_initialized.c:13: Warning: 
   Too many initializers for array g
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main1
diff --git a/src/plugins/wp/tests/wp_typed/oracle/avar.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/avar.0.res.oracle
index 2aff985d9a40767d203ee47244258205fc5b949f..fd7ab0c35a657ff5ba6547c8b6a7f35acc4f0b05 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/avar.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/avar.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/avar.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_typed/avar.i:4: Warning: 
   No code nor implicit assigns clause for function f, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_typed/oracle/avar.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/avar.1.res.oracle
index 42142a26a799c0867aea47745ca9bb82d722190b..79830d2882daec567a83127aace0e428d09a4f14 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/avar.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/avar.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/avar.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_typed/avar.i:4: Warning: 
   No code nor implicit assigns clause for function f, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_typed/oracle/bug_9.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/bug_9.0.res.oracle
index 6955c7e9f335dc943c0b34ee75a4f9c977e73bef..78f07a377734982e94506b88e77fcb910794fef7 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/bug_9.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/bug_9.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/bug_9.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_typed/oracle/bug_9.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/bug_9.1.res.oracle
index d1a9c2edc88afab1780b170df6f210b29c2a459d..4b6dba37d8e627e797ca1951231df79da442eb8f 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/bug_9.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/bug_9.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/bug_9.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_typed/oracle/cast_fits.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/cast_fits.0.res.oracle
index 5de789f115cfba370b3934f5956180e03715b223..175f532ae7f266fc4435711706f0ba8423e25574 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/cast_fits.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/cast_fits.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/cast_fits.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_typed/cast_fits.i:13: Warning: 
   Cast with incompatible pointers types (source: __anonstruct_L2_2*)
diff --git a/src/plugins/wp/tests/wp_typed/oracle/cast_fits.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/cast_fits.1.res.oracle
index 965f27bfd7d18e284692ac2d1aa47c1f9c980ea0..0db2247f414f8cc14620db7ea3c67cd24eba1594 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/cast_fits.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/cast_fits.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/cast_fits.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_typed/cast_fits.i:13: Warning: 
   Cast with incompatible pointers types (source: __anonstruct_L2_2*)
diff --git a/src/plugins/wp/tests/wp_typed/oracle/frame.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/frame.0.res.oracle
index 1e91b9fe01bb8adc7ee48b04cd3545dfdf445224..ff1c02a4ba546326c78ca6b5c1bc43955534ced6 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/frame.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/frame.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/frame.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function compound
diff --git a/src/plugins/wp/tests/wp_typed/oracle/frame.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/frame.1.res.oracle
index 3cc68cc1beffef594728925049e0ea006134bb47..93b726016189c4ba2b68bacb30ae8ca2fddfcbd2 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/frame.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/frame.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/frame.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function compound
diff --git a/src/plugins/wp/tests/wp_typed/oracle/mvar.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/mvar.0.res.oracle
index 573cc01ba43d17f65607f14cae279f5e60061c93..c00b06312b62e50529b76e36b62185d8eeb09d9b 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/mvar.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/mvar.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/mvar.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_typed/mvar.i:14: Warning: 
   No code nor implicit assigns clause for function Write, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_typed/oracle/mvar.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/mvar.1.res.oracle
index a4c11cbaf131aee41f5bd8d0b1e71a2d790d259f..fef31f965305408e602c2e3191f7fea8c84510e2 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/mvar.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/mvar.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/mvar.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_typed/mvar.i:14: Warning: 
   No code nor implicit assigns clause for function Write, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_typed/oracle/shift_lemma.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/shift_lemma.0.res.oracle
index 9fea0aa32cc281b4a02601332ac2c163c9881497..4d36bdaa42ccdc53dd00de1d58d254528811f40f 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/shift_lemma.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/shift_lemma.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/shift_lemma.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_typed/oracle/shift_lemma.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/shift_lemma.1.res.oracle
index 4a80ee7c1bedda2b60a821b3a4c77e6726bbed6d..4b06e83a95830e9b28587ead79f408a849417783 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/shift_lemma.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/shift_lemma.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/shift_lemma.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_typed/oracle/struct_array_type.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/struct_array_type.res.oracle
index 1de296f9e9a5e7d2f57b95348450d7176eb00eed..5fcad89c14121824e5887d46d04dad71d38806bb 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/struct_array_type.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/struct_array_type.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/struct_array_type.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 ---------------------------------------------
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_alloc.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_alloc.0.res.oracle
index dc5985c4828c9882061431a06104de87c484cfd6..d2e3f2a9cd72abe8c290a08496c943a44251a532 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_alloc.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_alloc.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_alloc.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_alloc.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_alloc.1.res.oracle
index 3716b8fceb32bf2565e3b264e65a2550bc1cc8f0..115e7900443a3b47594946cdc03820b159258291 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_alloc.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_alloc.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/unit_alloc.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_bitwise.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_bitwise.res.oracle
index c73cb0f2080f590d229a037fdd20c46ad134e7b5..6bddd899e5d968db9988a8569ae23c1ecafcadfd 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_bitwise.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_bitwise.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_bitwise.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Global
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_call.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_call.0.res.oracle
index 8db4499af6806ad9b746669a46546d33ca023c3e..2b7c8292fd54200b551baba35eb0363df4096b14 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_call.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_call.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_call.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_typed/unit_call.i:7: Warning: 
   No code nor implicit assigns clause for function f, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_call.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_call.1.res.oracle
index 4d1955acf5164fb3f870e5352cb5103777330203..2fe4a4489865ce4a2bff1a42a3ea9d3fda75232e 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_call.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_call.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/unit_call.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_typed/unit_call.i:7: Warning: 
   No code nor implicit assigns clause for function f, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_cast.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_cast.0.res.oracle
index dfda7aa3f9a879aec4c378acbacc3faaa83f8ec5..280d1b5db6a8a50fb4bec3c575ffe2945408c13c 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_cast.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_cast.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_cast.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_typed/unit_cast.i:4: Warning: 
   Cast with incompatible pointers types (source: sint32*) (target: sint8*)
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_cast.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_cast.1.res.oracle
index bb48de46dd639db6c134a314aeb6dff50675b4b9..84e952f60190a0894e1608f693524f8f221ef31b 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_cast.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_cast.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/unit_cast.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_typed/unit_cast.i:4: Warning: 
   Cast with incompatible pointers types (source: sint32*) (target: sint8*)
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_cst.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_cst.0.res.oracle
index c96410cf87b70cf9838c74b65a07c0f87724d117..f220848799ec78a5c6a29168d305db2f7347e0f8 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_cst.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_cst.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_cst.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_cst.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_cst.1.res.oracle
index 2dc8392a426d484ab6a52db69c1b399087a9c7d0..ac27acaa0ddda8702954a63f3a1de2a28765810c 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_cst.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_cst.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/unit_cst.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_float.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_float.res.oracle
index bb4bf9336170c2c82945560d731b1e437dd835dd..157f2dd9361584760669482fd204b616304881e9 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_float.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_float.res.oracle
@@ -4,7 +4,6 @@
   Floating-point constant 0.2 is not represented exactly. Will use 0x1.999999999999ap-3.
   (warn-once: no further messages from category 'parser:decimal-float' will be emitted)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_hard.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_hard.0.res.oracle
index 8dee3ca102c5e09c71768a6a6bcb62f33b98ae52..8c6dba5f1eb0f760cf13f4f9033e52ea88b62c73 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_hard.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_hard.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_hard.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_hard.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_hard.1.res.oracle
index 92ab010a2b72171180ade7aa0a8728fad75fc586..dc71a1a475c539600e6c24eedb48fab7b55c26b2 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_hard.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_hard.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/unit_hard.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_ite.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_ite.0.res.oracle
index 7388a4baf8038dd5763d2490d070e18f3ee240fd..508a664970f6135939d4b6e100f817a5ddf071d8 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_ite.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_ite.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_ite.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function check
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_ite.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_ite.1.res.oracle
index 9976179a7121da8220bd6193dba9b4a47b1af624..c0eec98834070f47edced3f7b7288673ae2a08bc 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_ite.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_ite.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/unit_ite.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function check
@@ -12,5 +11,6 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'check':
-  /*@ behavior typed_ref: requires \valid(p); */
+  /*@ behavior typed_ref:
+        requires \valid(p); */
   void check(int x, int *p);
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_labels.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_labels.0.res.oracle
index c1c14a0c6470b457e4acd28cafa21e1281d98c23..f610bd6ab0f9f4e7c9c591aca024d38bdafe0449 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_labels.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_labels.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_labels.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function duplet
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_labels.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_labels.1.res.oracle
index cba638b02bb8c53145c8fb5181adf1fbdf1982b4..98b60be4d4acc85fc0c73725a7e1ca124159ed51 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_labels.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_labels.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/unit_labels.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function duplet
@@ -30,8 +29,8 @@ Prove: true.
 [wp] Warning: Memory model hypotheses for function 'duplet':
   /*@
      behavior typed_ref:
-     requires \separated(pi,pj,a+(..));
-     requires \valid(pi);
-     requires \valid(pj);
+       requires \separated(pi, pj, a + (..));
+       requires \valid(pi);
+       requires \valid(pj);
      */
   void duplet(int *a, int *pi, int *pj);
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_lemma.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_lemma.0.res.oracle
index 6be54b4bb0957640bab00f4e5403d2427b542ef8..7c21a18a61a696a9dd81a12baedef66041010c81 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_lemma.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_lemma.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_lemma.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 ------------------------------------------------------------
   Global
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_lemma.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_lemma.1.res.oracle
index e3fed83ab4c5249d91d6d8ff9994264b282ebf57..8d72724d212dfebee9921b23f9a8f5d4a74ca81e 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_lemma.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_lemma.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/unit_lemma.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 ------------------------------------------------------------
   Global
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_local.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_local.0.res.oracle
index e81bad545d076c6fb587da7846856a050e5be47d..b79c6356f022c4b300687766ac2961b7bf048ea1 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_local.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_local.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_local.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function bar
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_local.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_local.1.res.oracle
index ca652b49c38ec3d95c0e7c50b854e457574442ae..f756360a105429747f220bf7b75df3e8d637a435 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_local.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_local.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Raw)' [...]
 [kernel] Parsing tests/wp_typed/unit_local.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function bar
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_loopscope.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_loopscope.0.res.oracle
index 3ef9cfde40405fdc904df5294e5c88e50756f2e4..5a1fdea5b33712a284f6c810143b991192fc0640 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_loopscope.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_loopscope.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_loopscope.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_typed/unit_loopscope.i:14: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_loopscope.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_loopscope.1.res.oracle
index 6413e9d7d3206f7ff6ac1464b9378c04dac005ce..9cd81cf810713b1a3524c268452769cbb34bcf1c 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_loopscope.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_loopscope.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/unit_loopscope.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_typed/unit_loopscope.i:14: Warning: 
   Missing assigns clause (assigns 'everything' instead)
@@ -19,5 +18,6 @@ Prove: false.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'f':
-  /*@ behavior typed_ref: requires \valid(written); */
+  /*@ behavior typed_ref:
+        requires \valid(written); */
   void f(unsigned int *written);
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_matrix.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_matrix.0.res.oracle
index b744d1ea2ded3c291eba6d3aeae6cc1455a3e0da..f3cb015dea5def8ab6a430cab921475060bcfab5 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_matrix.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_matrix.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_matrix.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function make
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_matrix.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_matrix.1.res.oracle
index 8a07fab05017a844ede2f8130e13da5bb3a67e37..c0f6bc8b083b00abd8b760766313095961da71ff 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_matrix.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_matrix.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/unit_matrix.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function make
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_string.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_string.0.res.oracle
index e131924404aa5101bd6ddc8ebbe5104e19530c33..09bf183361456eb884755b6f672fa5ed3444d56a 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_string.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_string.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_string.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_string.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_string.1.res.oracle
index b129820adfb64f78fd855d6a6ea0de6257dca5e4..33e37139a199e32a66d72f8398733bafe8f88bce 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_string.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_string.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/unit_string.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_tset.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_tset.0.res.oracle
index 9d00a4ee69ac21812c65aafdb9ff2004341c50de..fd636bbb09f5ba89b5108a7ce87a4e990a7a5b87 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_tset.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_tset.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_tset.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function complex
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_tset.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_tset.1.res.oracle
index 68e873a5b9f611b6b0f31db383bae2a11ea00536..7af88b3ded647e1a034133916ef6f2aa0e9e03c0 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_tset.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_tset.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/unit_tset.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function complex
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_bitwise.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_bitwise.0.res.oracle
index 056fdd1bee8306e0ff4705859d8a47b00b93ccb0..4e4f0bbf55a16a97adedf3c2357f132c3e3b91f2 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_bitwise.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_bitwise.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/user_bitwise.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function rl1
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_bitwise.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_bitwise.1.res.oracle
index 90e88cdc057bf70998b27791e828239a3c92f6f4..8bb1f805315dbb8cf84ccfee810bfc0b1843b2f2 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_bitwise.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_bitwise.1.res.oracle
@@ -1,6 +1,5 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/user_bitwise.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] No proof obligations
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_collect.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_collect.0.res.oracle
index 6d48fd7458959b16b42f491c3d96de5430bcf2cd..08ed2413253191c6d0e05590fbf877cfbd7cdf0b 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_collect.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_collect.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/user_collect.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function caller
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_collect.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_collect.1.res.oracle
index b5584066b9c0b50d900d56a88a69db04ebd2d0cf..af4d14ff9c3f55f1a8c354b4777b3e80817a9bec 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_collect.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_collect.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/user_collect.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function caller
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 e8e6e13bc582dde43cd57df852ee32ea1fc163ed..57d9150a815562d82288549a231d7a4054e0c40c 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/user_init.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] [CFG] Goal init_exits : Valid (Unreachable)
 [wp] [CFG] Goal init_t1_exits : Valid (Unreachable)
 [wp] [CFG] Goal init_t2_v1_exits : Valid (Unreachable)
@@ -87,12 +86,18 @@ Prove: true.
 
 ------------------------------------------------------------
 
-Goal Loop assigns 'Zone' (1/2):
+Goal Loop assigns 'Zone' (1/3):
 Prove: true.
 
 ------------------------------------------------------------
 
-Goal Loop assigns 'Zone' (2/2):
+Goal Loop assigns 'Zone' (2/3):
+Effect at line 20
+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).
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 aa1fcfbc2ff78b19adb1a83efb7a8576a3e8bf19..2b7c224c04f509bfa2365292aedb2e50f4dc976a 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
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/user_init.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] [CFG] Goal init_exits : Valid (Unreachable)
 [wp] [CFG] Goal init_t1_exits : Valid (Unreachable)
 [wp] [CFG] Goal init_t2_v1_exits : Valid (Unreachable)
@@ -87,12 +86,18 @@ Prove: true.
 
 ------------------------------------------------------------
 
-Goal Loop assigns 'Zone' (1/2):
+Goal Loop assigns 'Zone' (1/3):
 Prove: true.
 
 ------------------------------------------------------------
 
-Goal Loop assigns 'Zone' (2/2):
+Goal Loop assigns 'Zone' (2/3):
+Effect at line 20
+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).
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_injector.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_injector.res.oracle
index 7ed19a55a525c1c54c8db1ec64f23df88313c566..b49ad5f8dddc52f47a74259da71cc92795e32b34 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_injector.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_injector.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/user_injector.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function job
@@ -119,7 +118,10 @@ Prove: true.
 [wp] Warning: Memory model hypotheses for function 'job':
   /*@
      behavior typed:
-     requires \separated(\union(&seq,&service_cpt,service_id+(..),
-                           service_result+(..)),error);
+       requires
+         \separated(
+           error, (int *)service_id + (..), (int *)service_result + (..), &seq,
+           &service_cpt
+           );
      */
   int job(int a, int b, int *error);
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 46d05c94af57bfcc2afd20cb9ef2a1c31051db65..3df342a583be2d88bfd6665c0468e1a40becb410 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/user_rec.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Global
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 e8561738bcd6641cdd98021ce41a451ef9366891..14d0ebde9e942251adc93092bccf56baacc99dfe 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
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/user_rec.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Global
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 758429573e32d2523927750a36cebd84cf13d7fb..f6ac9a650aea8ed15b1ca16eb05f2209f1930beb 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/user_string.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function strlen
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 d99aaaf937e73f39368935427477e925ff1a4818..b0256f00b0c4d77b72ad77ee1e2fd7ab3bb14df3 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
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/user_string.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function strlen
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_swap.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_swap.0.res.oracle
index 1bb42be2636e30dee886ed48cfec3afe4d592828..ed045c6b7826dd899433716233552a553451921a 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_swap.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_swap.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/user_swap.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_swap.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_swap.1.res.oracle
index d4109c976370521d7cc76a28e3f8f96a325a377e..abbc64b85dacff64fa8d779ed0d10ab167bc9959 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_swap.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_swap.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/user_swap.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function main
@@ -44,8 +43,8 @@ Prove: true.
 [wp] Warning: Memory model hypotheses for function 'swap':
   /*@
      behavior typed_ref:
-     requires \separated(a,b);
-     requires \valid(a);
-     requires \valid(b);
+       requires \separated(a, b);
+       requires \valid(a);
+       requires \valid(b);
      */
   void swap(int *a, int *b);
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/array_initialized.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/array_initialized.0.res.oracle
index e2a176a72f5066032526fbf01dc4b811772595c7..0d1a283b5f82294ce2f798f83ea9eee83fa89231 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/array_initialized.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/array_initialized.0.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp_typed/array_initialized.c:13: Warning: 
   Too many initializers for array g
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 5 goals scheduled
 [wp] [Alt-Ergo] Goal typed_main1_assert : Valid
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/array_initialized.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/array_initialized.1.res.oracle
index e2a176a72f5066032526fbf01dc4b811772595c7..0d1a283b5f82294ce2f798f83ea9eee83fa89231 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/array_initialized.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/array_initialized.1.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp_typed/array_initialized.c:13: Warning: 
   Too many initializers for array g
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 5 goals scheduled
 [wp] [Alt-Ergo] Goal typed_main1_assert : Valid
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/avar.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/avar.res.oracle
index a9b513c05f613b1e8641964319ce2b9cd82f6bfb..878e590dd1e091c3fe6db642952a77cdd1b9b449 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/avar.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/avar.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/avar.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_typed/avar.i:4: Warning: 
   No code nor implicit assigns clause for function f, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/cast_fits.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/cast_fits.res.oracle
index b720cb1e0e29341083e776e8f22e0f55ee769177..1a80a196cf89532c5ad595a5ceedc2ad31dd2182 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/cast_fits.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/cast_fits.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/cast_fits.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_typed/cast_fits.i:13: Warning: 
   Cast with incompatible pointers types (source: __anonstruct_L2_2*)
@@ -14,11 +13,11 @@
      (target: __anonunion_L8_8*)
 [wp] 8 goals scheduled
 [wp] [Alt-Ergo] Goal typed_fits1_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_mismatch1_ensures : Unsuccess (Stronger)
 [wp] [Alt-Ergo] Goal typed_fits2_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_fits3_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_fits4_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_fits5_ensures : Valid
-[wp] [Alt-Ergo] Goal typed_mismatch1_ensures : Unsuccess (Stronger)
 [wp] [Alt-Ergo] Goal typed_mismatch2_ensures : Unsuccess (Stronger)
 [wp] [Alt-Ergo] Goal typed_mismatch3_ensures : Unsuccess (Stronger)
 [wp] Proved goals:    5 / 8
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/frame.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/frame.res.oracle
index 2c002e7b1b168ce19f4d7a8d13be19971ffa0196..dbc2330142860c450016dadd3afe2cd9f5c8a828 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/frame.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/frame.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/frame.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Alt-Ergo] Goal typed_compound_assert_SEP : Valid
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.res.oracle
index 2d667089f84a3524ab94f99ca2f3b3d1e87825a4..65452ad8fe8dcf8a886ab9f392404f71630df81b 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/mvar.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_typed/mvar.i:14: Warning: 
   No code nor implicit assigns clause for function Write, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/shift_lemma.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/shift_lemma.res.oracle
index e8a80395ed36a95a70a975d148592102ba683b4e..b09f19d9e21cd1d22ac3a67730dd7a5b487d9c55 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/shift_lemma.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/shift_lemma.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/shift_lemma.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 5 goals scheduled
 [wp] [Alt-Ergo] Goal typed_f_assert : Valid
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/struct_array_type.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/struct_array_type.res.oracle
index 7513018dcd915582fee84ed0c4e927b408e536d9..a7963a1a6f95d866ce43bb242984b73428ac54c3 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/struct_array_type.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/struct_array_type.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/struct_array_type.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Alt-Ergo] Goal typed_f_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_alloc.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_alloc.0.res.oracle
index 5e5b91dc94a4fae2c602610b76ab88d741c057a3..18546f909a348ac909e1a04f80648b14d3305b68 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_alloc.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_alloc.0.res.oracle
@@ -1,16 +1,15 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_alloc.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 7 goals scheduled
-[wp] [Qed] Goal typed_f_assigns : Valid
-[wp] [Qed] Goal typed_g_assigns : Valid
-[wp] [Alt-Ergo] Goal typed_h_ensures : Valid
 [wp] [Qed] Goal typed_job_assert : Valid
 [wp] [Alt-Ergo] Goal typed_job_assert_2 : Valid
 [wp] [Qed] Goal typed_job_assert_3 : Valid
 [wp] [Alt-Ergo] Goal typed_job_assert_4 : Valid
+[wp] [Qed] Goal typed_f_assigns : Valid
+[wp] [Qed] Goal typed_g_assigns : Valid
+[wp] [Alt-Ergo] Goal typed_h_ensures : Valid
 [wp] Proved goals:    7 / 7
   Qed:             4 
   Alt-Ergo:        3
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_alloc.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_alloc.1.res.oracle
index 97a099bc62cdf9c56dfa9a739f1f92911f633b74..86359ce6ec2a844ed6a61b3b7b1ff36e8998a6bf 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_alloc.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_alloc.1.res.oracle
@@ -1,16 +1,15 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/unit_alloc.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 7 goals scheduled
-[wp] [Qed] Goal typed_ref_f_assigns : Valid
-[wp] [Qed] Goal typed_ref_g_assigns : Valid
-[wp] [Alt-Ergo] Goal typed_ref_h_ensures : Valid
 [wp] [Qed] Goal typed_ref_job_assert : Valid
 [wp] [Alt-Ergo] Goal typed_ref_job_assert_2 : Valid
 [wp] [Qed] Goal typed_ref_job_assert_3 : Valid
 [wp] [Alt-Ergo] Goal typed_ref_job_assert_4 : Valid
+[wp] [Qed] Goal typed_ref_f_assigns : Valid
+[wp] [Qed] Goal typed_ref_g_assigns : Valid
+[wp] [Alt-Ergo] Goal typed_ref_h_ensures : Valid
 [wp] Proved goals:    7 / 7
   Qed:             4 
   Alt-Ergo:        3
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_bitwise.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_bitwise.0.res.oracle
index 03bc287592f8a1a34f36c76e9dd23e90f8aefc9d..7459d60fcb3a9ff2576f1a64c007140d0205f2df 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_bitwise.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_bitwise.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_bitwise.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 61 goals scheduled
 [wp] [Alt-Ergo] Goal typed_lemma_band_sint8 : Valid
@@ -22,33 +21,41 @@
 [wp] [Qed] Goal typed_lemma_lor_stb : Valid
 [wp] [Qed] Goal typed_lemma_lxor_assoc : Valid
 [wp] [Qed] Goal typed_lemma_lxor_com : Valid
-[wp] [Qed] Goal typed_band1_uchar_assert_ok : Valid
-[wp] [Alt-Ergo] Goal typed_band1_uchar_assert_ok_2 : Valid
-[wp] [Qed] Goal typed_band1_uint_assert_ok : Valid
-[wp] [Alt-Ergo] Goal typed_band1_uint_assert_ok_2 : Valid
-[wp] [Qed] Goal typed_band1_ulong_assert_ok : Valid
-[wp] [Alt-Ergo] Goal typed_band1_ulong_assert_ok_2 : Valid
-[wp] [Qed] Goal typed_band1_ushort_assert_ok : Valid
-[wp] [Alt-Ergo] Goal typed_band1_ushort_assert_ok_2 : Valid
-[wp] [Alt-Ergo] Goal typed_band_char_ensures_ok : Valid
 [wp] [Qed] Goal typed_band_int_ensures_ok : Valid
 [wp] [Qed] Goal typed_band_int_assert_ok : Valid
-[wp] [Alt-Ergo] Goal typed_band_uchar_ensures_ok : Valid
-[wp] [Qed] Goal typed_band_uint_ensures_ok : Valid
-[wp] [Alt-Ergo] Goal typed_bnot_char_ensures_ok : Valid
+[wp] [Qed] Goal typed_bor_int_ensures_ok : Valid
+[wp] [Qed] Goal typed_bxor_int_ensures_ok : Valid
 [wp] [Qed] Goal typed_bnot_int_ensures_ok : Valid
-[wp] [Qed] Goal typed_bnot_uchar_ensures_ok : Valid
+[wp] [Qed] Goal typed_lshift_int_ensures_ok : Valid
+[wp] [Qed] Goal typed_rshift_int_ensures_ok : Valid
+[wp] [Qed] Goal typed_band1_uint_assert_ok : Valid
+[wp] [Alt-Ergo] Goal typed_band1_uint_assert_ok_2 : Valid
+[wp] [Qed] Goal typed_band_uint_ensures_ok : Valid
+[wp] [Qed] Goal typed_bor_uint_ensures_ok : Valid
+[wp] [Qed] Goal typed_bxor_uint_ensures_ok : Valid
+[wp] [Alt-Ergo] Goal typed_bxor_uint_ensures_ok_2 : Valid
 [wp] [Qed] Goal typed_bnot_uint_ensures_ok : Valid
+[wp] [Qed] Goal typed_lshift_uint_ensures_ok : Valid
+[wp] [Qed] Goal typed_rshift_uint_ensures_ok : Valid
+[wp] [Alt-Ergo] Goal typed_band_char_ensures_ok : Valid
 [wp] [Alt-Ergo] Goal typed_bor_char_ensures_ok : Valid
-[wp] [Qed] Goal typed_bor_int_ensures_ok : Valid
-[wp] [Qed] Goal typed_bor_uchar_ensures_ok : Valid
-[wp] [Qed] Goal typed_bor_uint_ensures_ok : Valid
 [wp] [Alt-Ergo] Goal typed_bxor_char_ensures_ok : Valid
-[wp] [Qed] Goal typed_bxor_int_ensures_ok : Valid
+[wp] [Alt-Ergo] Goal typed_bnot_char_ensures_ok : Valid
+[wp] [Qed] Goal typed_lshift_char_ensures_ok : Valid
+[wp] [Qed] Goal typed_rshift_char_ensures_ok : Valid
+[wp] [Qed] Goal typed_band1_uchar_assert_ok : Valid
+[wp] [Alt-Ergo] Goal typed_band1_uchar_assert_ok_2 : Valid
+[wp] [Alt-Ergo] Goal typed_band_uchar_ensures_ok : Valid
+[wp] [Qed] Goal typed_bor_uchar_ensures_ok : Valid
 [wp] [Qed] Goal typed_bxor_uchar_ensures_ok : Valid
 [wp] [Alt-Ergo] Goal typed_bxor_uchar_ensures_ok_2 : Valid
-[wp] [Qed] Goal typed_bxor_uint_ensures_ok : Valid
-[wp] [Alt-Ergo] Goal typed_bxor_uint_ensures_ok_2 : Valid
+[wp] [Qed] Goal typed_bnot_uchar_ensures_ok : Valid
+[wp] [Qed] Goal typed_lshift_uchar_ensures_ok : Valid
+[wp] [Alt-Ergo] Goal typed_rshift_uchar_ensures_ok : Valid
+[wp] [Qed] Goal typed_band1_ushort_assert_ok : Valid
+[wp] [Alt-Ergo] Goal typed_band1_ushort_assert_ok_2 : Valid
+[wp] [Qed] Goal typed_band1_ulong_assert_ok : Valid
+[wp] [Alt-Ergo] Goal typed_band1_ulong_assert_ok_2 : Valid
 [wp] [Qed] Goal typed_cast_ensures_ok : Valid
 [wp] [Qed] Goal typed_cast_assert_ok : Valid
 [wp] [Qed] Goal typed_cast_assert_ok_2 : Valid
@@ -57,14 +64,6 @@
 [wp] [Qed] Goal typed_cast_assert_ok_5 : Valid
 [wp] [Qed] Goal typed_cast_assert_ok_6 : Valid
 [wp] [Qed] Goal typed_cast_assert_ok_7 : Valid
-[wp] [Qed] Goal typed_lshift_char_ensures_ok : Valid
-[wp] [Qed] Goal typed_lshift_int_ensures_ok : Valid
-[wp] [Qed] Goal typed_lshift_uchar_ensures_ok : Valid
-[wp] [Qed] Goal typed_lshift_uint_ensures_ok : Valid
-[wp] [Qed] Goal typed_rshift_char_ensures_ok : Valid
-[wp] [Qed] Goal typed_rshift_int_ensures_ok : Valid
-[wp] [Alt-Ergo] Goal typed_rshift_uchar_ensures_ok : Valid
-[wp] [Qed] Goal typed_rshift_uint_ensures_ok : Valid
 [wp] Proved goals:   61 / 61
   Qed:            41 
   Alt-Ergo:       20
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_bitwise.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_bitwise.1.res.oracle
index 9c4dc9afa22a0bdcb51edec61b4ef6ad14c02b0c..10406f8c492cb1a2ab30b5aa6196c538c69bbab4 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_bitwise.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_bitwise.1.res.oracle
@@ -1,12 +1,11 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_bitwise.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 4 goals scheduled
 [wp] [Alt-Ergo] Goal typed_band_int_assert_ko : Unsuccess
-[wp] [Alt-Ergo] Goal typed_bnot_uchar_ensures_ko : Unsuccess
 [wp] [Alt-Ergo] Goal typed_bnot_uint_ensures_ko : Unsuccess
+[wp] [Alt-Ergo] Goal typed_bnot_uchar_ensures_ko : Unsuccess
 [wp] [Alt-Ergo] Goal typed_cast_assert_ko : Unsuccess
 [wp] Proved goals:    0 / 4
   Alt-Ergo:        0  (unsuccess: 4)
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_call.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_call.res.oracle
index e39935873a6909a3522ca8fece74af0a4fcdd270..e2091a07708432017ec2a5599e677cb06cab0721 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_call.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_call.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_call.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [kernel] tests/wp_typed/unit_call.i:7: Warning: 
   No code nor implicit assigns clause for function f, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_cast.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_cast.res.oracle
index 8d8d1eff5fc7b853214e148d778b4fefd45f81c1..c54e6f55894426414495d56cd63c0fe1a8b2e3c1 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_cast.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_cast.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_cast.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_typed/unit_cast.i:4: Warning: 
   Cast with incompatible pointers types (source: sint32*) (target: sint8*)
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_cst.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_cst.res.oracle
index 70fa445d32bc7524e1013b4f2f8c23943f876e64..503a254a25f00fd9ae064719d864b8f608a8b112 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_cst.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_cst.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_cst.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
 [wp] [Qed] Goal typed_f_ensures_A : Valid
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_float.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_float.res.oracle
index 6b5ca009e8dae54cdf0091adf167288ae2600dcf..df568124db56b58ad7625bfc83e1d823c194dc6b 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_float.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_float.res.oracle
@@ -4,7 +4,6 @@
   Floating-point constant 0.2 is not represented exactly. Will use 0x1.999999999999ap-3.
   (warn-once: no further messages from category 'parser:decimal-float' will be emitted)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 6 goals scheduled
 [wp] [Qed] Goal typed_main_ensures_CST_F : Valid
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_hard.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_hard.res.oracle
index 00ea955fe66bb4fdcfaeda35930d84395eb85608..71e047a463e1457643a7bfa8f70f0aaef0f6c362 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_hard.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_hard.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_hard.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
 [wp] [Qed] Goal typed_main_requires_p_is_33FF : Valid
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_ite.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_ite.res.oracle
index 0bc63584c9b7b6f5e2db2591d0f8788eb066b47e..0fc85faf32b648767159621cd29f07da187565d4 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_ite.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_ite.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_ite.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
 [wp] [Qed] Goal typed_check_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_labels.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_labels.res.oracle
index 802c3513d531b3752211fedb5dd7632ed0773f49..a255ecbfec34a8abcb606596793671d050dd77f4 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_labels.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_labels.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_labels.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
 [wp] [Alt-Ergo] Goal typed_duplet_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_lemma.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_lemma.res.oracle
index 6015427dddcbc8c7d4bf286aa356f9bcc4db8599..a863510b6f644cac7b250b7ea486e3389ba1fc87 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_lemma.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_lemma.res.oracle
@@ -1,14 +1,13 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_lemma.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] 6 goals scheduled
-[wp] [Alt-Ergo] Goal typed_lemma_P23_KO : Unsuccess
-[wp] [Alt-Ergo] Goal typed_lemma_P52 : Valid
+[wp] [Alt-Ergo] Goal typed_lemma_Foo : Valid
 [wp] [Alt-Ergo] Goal typed_lemma_P13 : Valid
 [wp] [Alt-Ergo] Goal typed_lemma_P14 : Valid
+[wp] [Alt-Ergo] Goal typed_lemma_P23_KO : Unsuccess
+[wp] [Alt-Ergo] Goal typed_lemma_P52 : Valid
 [wp] [Alt-Ergo] Goal typed_lemma_P54 : Valid
-[wp] [Alt-Ergo] Goal typed_lemma_Foo : Valid
 [wp] Proved goals:    5 / 6
   Qed:             0 
   Alt-Ergo:        5  (unsuccess: 1)
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_local.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_local.0.res.oracle
index ffa7b49597ef31892bf907ada32423335317d6ad..137ed92886e4824874d4c3c9d6b161348f360a5e 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_local.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_local.0.res.oracle
@@ -1,12 +1,11 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_local.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
-[wp] [Qed] Goal typed_bar_assigns : Valid
 [wp] [Qed] Goal typed_foo_assigns_part1 : Valid
 [wp] [Alt-Ergo] Goal typed_foo_assigns_part2 : Valid
+[wp] [Qed] Goal typed_bar_assigns : Valid
 [wp] Proved goals:    3 / 3
   Qed:             2 
   Alt-Ergo:        1
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_local.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_local.1.res.oracle
index 86474c5e363a3ff5b28822f9bcdf98546dc8fc3e..183c93047804be2c05c42fd6634638369e847318 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_local.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_local.1.res.oracle
@@ -1,12 +1,11 @@
 # frama-c -wp -wp-model 'Typed (Raw)' [...]
 [kernel] Parsing tests/wp_typed/unit_local.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
-[wp] [Alt-Ergo] Goal typed_raw_bar_assigns : Valid
 [wp] [Alt-Ergo] Goal typed_raw_foo_assigns_part1 : Valid
 [wp] [Alt-Ergo] Goal typed_raw_foo_assigns_part2 : Valid
+[wp] [Alt-Ergo] Goal typed_raw_bar_assigns : Valid
 [wp] Proved goals:    3 / 3
   Qed:             0 
   Alt-Ergo:        3
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_loopscope.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_loopscope.0.res.oracle
index 3b196114d45fb2824e9a38d13d779ee8e7bb388e..80e267199ec95e38e3342d58984e767e822caed7 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_loopscope.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_loopscope.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_loopscope.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_typed/unit_loopscope.i:14: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_loopscope.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_loopscope.1.res.oracle
index 58761bdefa349443b64e729fa5e64f3ed17f288f..4417ddd127acc3f894426f6829b8d8b4766afaf2 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_loopscope.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_loopscope.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/unit_loopscope.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_typed/unit_loopscope.i:14: Warning: 
   Missing assigns clause (assigns 'everything' instead)
@@ -16,5 +15,6 @@
   f                         1        -        2      50.0%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'f':
-  /*@ behavior typed_ref: requires \valid(written); */
+  /*@ behavior typed_ref:
+        requires \valid(written); */
   void f(unsigned int *written);
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_matrix.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_matrix.res.oracle
index 94ce30099a1c7a44562028f3e44c935851aa9ca7..f48df3d43f601321a6b715fc4a9d10273b2107bc 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_matrix.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_matrix.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_matrix.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 3 goals scheduled
 [wp] [Alt-Ergo] Goal typed_make_ensures_OK1 : Valid
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_string.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_string.res.oracle
index 43b55a82a22fb99517433a8b3b1e08b52e536a98..85998f3551920e8f3c059c0b434c9865eb6f39d0 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_string.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_string.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_string.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 6 goals scheduled
 [wp] [Alt-Ergo] Goal typed_f_assert_AB : Valid
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_tset.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_tset.res.oracle
index 756da0b5ce2eb69ccf60a71ae0bdb6475c088085..73c76c092af6f8fd3ab0fc93f3f7af41fb7e4d83 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_tset.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_tset.res.oracle
@@ -1,11 +1,10 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/unit_tset.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 2 goals scheduled
-[wp] [Qed] Goal typed_complex_call_job_requires : Valid
 [wp] [Qed] Goal typed_complex_assigns : Valid
+[wp] [Qed] Goal typed_complex_call_job_requires : Valid
 [wp] Proved goals:    2 / 2
   Qed:             2
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_bitwise.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_bitwise.0.res.oracle
index a29035c5b07da1f5385f084ee7b05afcc9bda57a..e0a7b4b82a7b3d5d7f80cfd6978774bc1b17dd1b 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_bitwise.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_bitwise.0.res.oracle
@@ -1,19 +1,18 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/user_bitwise.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 12 goals scheduled
 [wp] [Qed] Goal typed_ref_rl1_ensures_b0 : Valid
 [wp] [Alt-Ergo] Goal typed_ref_rl1_ensures_bk : Valid
-[wp] [Alt-Ergo] Goal typed_ref_rln32_ensures_b1 : Valid
-[wp] [Alt-Ergo] Goal typed_ref_rln32_ensures_b2 : Valid
-[wp] [Alt-Ergo] Goal typed_ref_rln64_ensures_b1 : Valid
-[wp] [Alt-Ergo] Goal typed_ref_rln64_ensures_b2 : Valid
 [wp] [Alt-Ergo] Goal typed_ref_rr1_ensures_b0 : Valid
 [wp] [Alt-Ergo] Goal typed_ref_rr1_ensures_bk : Valid
+[wp] [Alt-Ergo] Goal typed_ref_rln32_ensures_b1 : Valid
+[wp] [Alt-Ergo] Goal typed_ref_rln32_ensures_b2 : Valid
 [wp] [Alt-Ergo] Goal typed_ref_rrn32_ensures_b1 : Valid
 [wp] [Alt-Ergo] Goal typed_ref_rrn32_ensures_b2 : Valid
+[wp] [Alt-Ergo] Goal typed_ref_rln64_ensures_b1 : Valid
+[wp] [Alt-Ergo] Goal typed_ref_rln64_ensures_b2 : Valid
 [wp] [Alt-Ergo] Goal typed_ref_rrn64_ensures_b1 : Valid
 [wp] [Alt-Ergo] Goal typed_ref_rrn64_ensures_b2 : Valid
 [wp] Proved goals:   12 / 12
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_bitwise.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_bitwise.1.res.oracle
index ae33efb03cb7afe2119a6a3853eff1d475303779..803894a6a5d9c534aebcc30db5e4d8a0a09b6902 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_bitwise.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_bitwise.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/user_bitwise.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] Warning: No goal generated
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_collect.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_collect.res.oracle
index ccc488ddf66ba0894de55fa1e125ee62d5df358a..a6406197d72b3779c404adeb341ce848c0e7f9cd 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_collect.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_collect.res.oracle
@@ -1,9 +1,23 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/user_collect.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 32 goals scheduled
+[wp] [Qed] Goal typed_job_ensures_K : Valid
+[wp] [Qed] Goal typed_job_ensures_P : Valid
+[wp] [Qed] Goal typed_job_assigns_part1 : Valid
+[wp] [Qed] Goal typed_job_assigns_part2 : Valid
+[wp] [Qed] Goal typed_job_assigns_part3 : Valid
+[wp] [Qed] Goal typed_job2_ensures_K : Valid
+[wp] [Qed] Goal typed_job2_ensures_Q : Valid
+[wp] [Qed] Goal typed_job2_assigns_part1 : Valid
+[wp] [Qed] Goal typed_job2_assigns_part2 : Valid
+[wp] [Qed] Goal typed_job2_assigns_part3 : Valid
+[wp] [Qed] Goal typed_job3_ensures_K : Valid
+[wp] [Alt-Ergo] Goal typed_job3_ensures_Q : Valid
+[wp] [Qed] Goal typed_job3_assigns_part1 : Valid
+[wp] [Qed] Goal typed_job3_assigns_part2 : Valid
+[wp] [Qed] Goal typed_job3_assigns_part3 : Valid
 [wp] [Qed] Goal typed_caller_ensures_K : Valid
 [wp] [Alt-Ergo] Goal typed_caller_ensures_P1 : Valid
 [wp] [Alt-Ergo] Goal typed_caller_ensures_P2 : Valid
@@ -21,21 +35,6 @@
 [wp] [Alt-Ergo] Goal typed_caller3_ensures_R : Valid
 [wp] [Alt-Ergo] Goal typed_caller3_call_job3_requires : Valid
 [wp] [Alt-Ergo] Goal typed_caller3_call_job3_2_requires : Valid
-[wp] [Qed] Goal typed_job_ensures_K : Valid
-[wp] [Qed] Goal typed_job_ensures_P : Valid
-[wp] [Qed] Goal typed_job_assigns_part1 : Valid
-[wp] [Qed] Goal typed_job_assigns_part2 : Valid
-[wp] [Qed] Goal typed_job_assigns_part3 : Valid
-[wp] [Qed] Goal typed_job2_ensures_K : Valid
-[wp] [Qed] Goal typed_job2_ensures_Q : Valid
-[wp] [Qed] Goal typed_job2_assigns_part1 : Valid
-[wp] [Qed] Goal typed_job2_assigns_part2 : Valid
-[wp] [Qed] Goal typed_job2_assigns_part3 : Valid
-[wp] [Qed] Goal typed_job3_ensures_K : Valid
-[wp] [Alt-Ergo] Goal typed_job3_ensures_Q : Valid
-[wp] [Qed] Goal typed_job3_assigns_part1 : Valid
-[wp] [Qed] Goal typed_job3_assigns_part2 : Valid
-[wp] [Qed] Goal typed_job3_assigns_part3 : Valid
 [wp] Proved goals:   32 / 32
   Qed:            17 
   Alt-Ergo:       15
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.0.res.oracle
index ba6a1083ab43cf2fc1694ca9a564794e46124e7e..3945dd8f3a65ec11fffa0303fe8300c4c4e63a66 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.0.res.oracle
@@ -1,21 +1,21 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/user_init.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] [CFG] Goal init_exits : Valid (Unreachable)
 [wp] [CFG] Goal init_t1_exits : Valid (Unreachable)
 [wp] [CFG] Goal init_t2_v1_exits : Valid (Unreachable)
 [wp] [CFG] Goal init_t2_v2_exits : Valid (Unreachable)
 [wp] [CFG] Goal init_t2_v3_exits : Valid (Unreachable)
 [wp] Warning: Missing RTE guards
-[wp] 91 goals scheduled
+[wp] 92 goals scheduled
 [wp] [Alt-Ergo] Goal typed_init_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_init_loop_invariant_Partial_preserved : Valid
 [wp] [Qed] Goal typed_init_loop_invariant_Partial_established : Valid
 [wp] [Alt-Ergo] Goal typed_init_loop_invariant_Range_preserved : Valid
 [wp] [Qed] Goal typed_init_loop_invariant_Range_established : Valid
 [wp] [Qed] Goal typed_init_loop_assigns_part1 : Valid
-[wp] [Alt-Ergo] Goal typed_init_loop_assigns_part2 : Valid
+[wp] [Qed] Goal typed_init_loop_assigns_part2 : Valid
+[wp] [Alt-Ergo] Goal typed_init_loop_assigns_part3 : Valid
 [wp] [Qed] Goal typed_init_assigns : Valid
 [wp] [Qed] Goal typed_init_loop_variant_decrease : Valid
 [wp] [Qed] Goal typed_init_loop_variant_positive : Valid
@@ -29,28 +29,6 @@
 [wp] [Qed] Goal typed_init_t1_assigns_part2 : Valid
 [wp] [Alt-Ergo] Goal typed_init_t1_loop_variant_decrease : Valid
 [wp] [Qed] Goal typed_init_t1_loop_variant_positive : Valid
-[wp] [Alt-Ergo] Goal typed_init_t2_bis_v1_ensures : Valid
-[wp] [Qed] Goal typed_init_t2_bis_v1_exits : Valid
-[wp] [Alt-Ergo] Goal typed_init_t2_bis_v1_loop_invariant_Partial_preserved : Valid
-[wp] [Qed] Goal typed_init_t2_bis_v1_loop_invariant_Partial_established : Valid
-[wp] [Alt-Ergo] Goal typed_init_t2_bis_v1_loop_invariant_Range_preserved : Valid
-[wp] [Qed] Goal typed_init_t2_bis_v1_loop_invariant_Range_established : Valid
-[wp] [Qed] Goal typed_init_t2_bis_v1_assert_Offset : Valid
-[wp] [Alt-Ergo] Goal typed_init_t2_bis_v1_loop_variant_decrease : Valid
-[wp] [Qed] Goal typed_init_t2_bis_v1_loop_variant_positive : Valid
-[wp] [Qed] Goal typed_init_t2_bis_v1_call_init_requires : Valid
-[wp] [Qed] Goal typed_init_t2_bis_v1_call_init_requires_2 : Valid
-[wp] [Alt-Ergo] Goal typed_init_t2_bis_v2_ensures : Valid
-[wp] [Qed] Goal typed_init_t2_bis_v2_exits : Valid
-[wp] [Alt-Ergo] Goal typed_init_t2_bis_v2_loop_invariant_Partial_preserved : Valid
-[wp] [Qed] Goal typed_init_t2_bis_v2_loop_invariant_Partial_established : Valid
-[wp] [Alt-Ergo] Goal typed_init_t2_bis_v2_loop_invariant_Range_preserved : Valid
-[wp] [Qed] Goal typed_init_t2_bis_v2_loop_invariant_Range_established : Valid
-[wp] [Qed] Goal typed_init_t2_bis_v2_assert_Offset_i : Valid
-[wp] [Alt-Ergo] Goal typed_init_t2_bis_v2_loop_variant_decrease : Valid
-[wp] [Qed] Goal typed_init_t2_bis_v2_loop_variant_positive : Valid
-[wp] [Qed] Goal typed_init_t2_bis_v2_call_init_requires : Valid
-[wp] [Qed] Goal typed_init_t2_bis_v2_call_init_requires_2 : Valid
 [wp] [Alt-Ergo] Goal typed_init_t2_v1_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_init_t2_v1_loop_invariant_Partial_i_preserved : Valid
 [wp] [Qed] Goal typed_init_t2_v1_loop_invariant_Partial_i_established : Valid
@@ -100,12 +78,34 @@
 [wp] [Qed] Goal typed_init_t2_v3_loop_variant_positive : Valid
 [wp] [Alt-Ergo] Goal typed_init_t2_v3_loop_variant_2_decrease : Valid
 [wp] [Qed] Goal typed_init_t2_v3_loop_variant_2_positive : Valid
-[wp] Proved goals:   91 / 91
-  Qed:            51 
+[wp] [Alt-Ergo] Goal typed_init_t2_bis_v1_ensures : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v1_exits : Valid
+[wp] [Alt-Ergo] Goal typed_init_t2_bis_v1_loop_invariant_Partial_preserved : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v1_loop_invariant_Partial_established : Valid
+[wp] [Alt-Ergo] Goal typed_init_t2_bis_v1_loop_invariant_Range_preserved : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v1_loop_invariant_Range_established : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v1_assert_Offset : Valid
+[wp] [Alt-Ergo] Goal typed_init_t2_bis_v1_loop_variant_decrease : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v1_loop_variant_positive : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v1_call_init_requires : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v1_call_init_requires_2 : Valid
+[wp] [Alt-Ergo] Goal typed_init_t2_bis_v2_ensures : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v2_exits : Valid
+[wp] [Alt-Ergo] Goal typed_init_t2_bis_v2_loop_invariant_Partial_preserved : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v2_loop_invariant_Partial_established : Valid
+[wp] [Alt-Ergo] Goal typed_init_t2_bis_v2_loop_invariant_Range_preserved : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v2_loop_invariant_Range_established : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v2_assert_Offset_i : Valid
+[wp] [Alt-Ergo] Goal typed_init_t2_bis_v2_loop_variant_decrease : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v2_loop_variant_positive : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v2_call_init_requires : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v2_call_init_requires_2 : Valid
+[wp] Proved goals:   92 / 92
+  Qed:            52 
   Alt-Ergo:       40
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
-  init                      6        4       10       100%
+  init                      7        4       11       100%
   init_t1                   6        4       10       100%
   init_t2_v1                9        8       17       100%
   init_t2_v2                9        8       17       100%
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.res.oracle
index 3a97274559283cd00d6f3e0ee43bc9a0bea53be0..f9f0f2c219867828a57bba71fbce2fade387cf24 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/user_init.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] [CFG] Goal init_exits : Valid (Unreachable)
 [wp] [CFG] Goal init_t1_exits : Valid (Unreachable)
 [wp] [CFG] Goal init_t2_v1_exits : Valid (Unreachable)
@@ -9,29 +8,29 @@
 [wp] [CFG] Goal init_t2_v3_exits : Valid (Unreachable)
 [wp] Warning: Missing RTE guards
 [wp] 23 goals scheduled
-[wp] [Qed] Goal typed_init_t2_bis_v2_loop_assigns_part1 : Valid
-[wp] [Script] Goal typed_init_t2_bis_v2_loop_assigns_part2 : Valid
-[wp] [Script] Goal typed_init_t2_bis_v2_loop_assigns_part3 : Valid
-[wp] [Script] Goal typed_init_t2_bis_v2_assigns_exit_part1 : Valid
-[wp] [Script] Goal typed_init_t2_bis_v2_assigns_exit_part2 : Valid
-[wp] [Qed] Goal typed_init_t2_bis_v2_assigns_exit_part3 : Valid
-[wp] [Script] Goal typed_init_t2_bis_v2_assigns_normal_part1 : Valid
-[wp] [Script] Goal typed_init_t2_bis_v2_assigns_normal_part2 : Valid
 [wp] [Qed] Goal typed_init_t2_v2_loop_assigns_part1 : Valid
 [wp] [Script] Goal typed_init_t2_v2_loop_assigns_part2 : Valid
 [wp] [Script] Goal typed_init_t2_v2_loop_assigns_part3 : Valid
 [wp] [Qed] Goal typed_init_t2_v2_loop_assigns_2_part1 : Valid
 [wp] [Script] Goal typed_init_t2_v2_loop_assigns_2_part2 : Valid
 [wp] [Script] Goal typed_init_t2_v2_loop_assigns_2_part3 : Valid
-[wp] [Script] Goal typed_init_t2_v2_assigns_part1 : Valid
+[wp] [Qed] Goal typed_init_t2_v2_assigns_part1 : Valid
 [wp] [Script] Goal typed_init_t2_v2_assigns_part2 : Valid
 [wp] [Qed] Goal typed_init_t2_v3_loop_assigns_part1 : Valid
 [wp] [Script] Goal typed_init_t2_v3_loop_assigns_part2 : Valid
 [wp] [Script] Goal typed_init_t2_v3_loop_assigns_part3 : Valid
 [wp] [Qed] Goal typed_init_t2_v3_loop_assigns_2_part1 : Valid
-[wp] [Script] Goal typed_init_t2_v3_loop_assigns_2_part2 : Valid
-[wp] [Script] Goal typed_init_t2_v3_assigns_part1 : Valid
+[wp] [Qed] Goal typed_init_t2_v3_loop_assigns_2_part2 : Valid
+[wp] [Qed] Goal typed_init_t2_v3_assigns_part1 : Valid
 [wp] [Script] Goal typed_init_t2_v3_assigns_part2 : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v2_loop_assigns_part1 : Valid
+[wp] [Script] Goal typed_init_t2_bis_v2_loop_assigns_part2 : Valid
+[wp] [Script] Goal typed_init_t2_bis_v2_loop_assigns_part3 : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v2_assigns_exit_part1 : Valid
+[wp] [Script] Goal typed_init_t2_bis_v2_assigns_exit_part2 : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v2_assigns_exit_part3 : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v2_assigns_normal_part1 : Valid
+[wp] [Script] Goal typed_init_t2_bis_v2_assigns_normal_part2 : Valid
 [wp] Proved goals:   23 / 23
   Qed:            11 
   Script:         12 
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 2b58bbe65772fae77872ae36ffdf37979f744566..3a1b937b6ff4108b49bc33d4e58bceb54b322deb 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
@@ -3,8 +3,8 @@
                 "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)",
                 "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.0.0",
-                                  "verdict": "valid", "time": 0.0092,
+                                  "verdict": "valid", "time": 0.0097,
                                   "steps": 12 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.0.0",
-                                  "verdict": "valid", "time": 0.0095,
+                                  "verdict": "valid", "time": 0.0109,
                                   "steps": 16 } ] } } ]
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 2b58bbe65772fae77872ae36ffdf37979f744566..3a1b937b6ff4108b49bc33d4e58bceb54b322deb 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
@@ -3,8 +3,8 @@
                 "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)",
                 "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.0.0",
-                                  "verdict": "valid", "time": 0.0092,
+                                  "verdict": "valid", "time": 0.0097,
                                   "steps": 12 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.0.0",
-                                  "verdict": "valid", "time": 0.0095,
+                                  "verdict": "valid", "time": 0.0109,
                                   "steps": 16 } ] } } ]
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 be4d92c4fe575311109168796c6ef8e276c14999..d177a98c28b67066576c3d38a7a0eff89828cfda 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\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.0.0",
-                                  "verdict": "valid", "time": 0.0106,
+                                  "verdict": "valid", "time": 0.0124,
                                   "steps": 22 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.0.0",
-                                  "verdict": "valid", "time": 0.0128,
+                                  "verdict": "valid", "time": 0.009,
                                   "steps": 28 } ] } } ]
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 b790982cc6596c5dc2467125b52c1e7c8ed2cbd1..f5c72396b7f8ddae811ebc406bbbbdc5fb40e428 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
@@ -3,8 +3,8 @@
                 "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)",
                 "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.0.0",
-                                  "verdict": "valid", "time": 0.0097,
+                                  "verdict": "valid", "time": 0.0133,
                                   "steps": 16 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.0.0",
-                                  "verdict": "valid", "time": 0.0105,
+                                  "verdict": "valid", "time": 0.0081,
                                   "steps": 22 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.2.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.2.res.oracle
index 21d17e27f81061c3125263f7bd5eb704e588d172..41f563dd7bf77dbfd732205c343f841b0bad0caf 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.2.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/user_init.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] [CFG] Goal init_exits : Valid (Unreachable)
 [wp] [CFG] Goal init_t1_exits : Valid (Unreachable)
 [wp] [CFG] Goal init_t2_v1_exits : Valid (Unreachable)
@@ -9,14 +8,6 @@
 [wp] [CFG] Goal init_t2_v3_exits : Valid (Unreachable)
 [wp] Warning: Missing RTE guards
 [wp] 16 goals scheduled
-[wp] [Qed] Goal typed_init_t2_bis_v1_loop_assigns_part1 : Valid
-[wp] [Alt-Ergo] Goal typed_init_t2_bis_v1_loop_assigns_part2 : Unsuccess
-[wp] [Alt-Ergo] Goal typed_init_t2_bis_v1_loop_assigns_part3 : Unsuccess
-[wp] [Qed] Goal typed_init_t2_bis_v1_assigns_exit_part1 : Valid
-[wp] [Alt-Ergo] Goal typed_init_t2_bis_v1_assigns_exit_part2 : Unsuccess
-[wp] [Qed] Goal typed_init_t2_bis_v1_assigns_exit_part3 : Valid
-[wp] [Qed] Goal typed_init_t2_bis_v1_assigns_normal_part1 : Valid
-[wp] [Alt-Ergo] Goal typed_init_t2_bis_v1_assigns_normal_part2 : Unsuccess
 [wp] [Qed] Goal typed_init_t2_v1_loop_assigns_part1 : Valid
 [wp] [Alt-Ergo] Goal typed_init_t2_v1_loop_assigns_part2 : Unsuccess
 [wp] [Alt-Ergo] Goal typed_init_t2_v1_loop_assigns_part3 : Unsuccess
@@ -25,6 +16,14 @@
 [wp] [Alt-Ergo] Goal typed_init_t2_v1_loop_assigns_2_part3 : Unsuccess
 [wp] [Qed] Goal typed_init_t2_v1_assigns_part1 : Valid
 [wp] [Alt-Ergo] Goal typed_init_t2_v1_assigns_part2 : Unsuccess
+[wp] [Qed] Goal typed_init_t2_bis_v1_loop_assigns_part1 : Valid
+[wp] [Alt-Ergo] Goal typed_init_t2_bis_v1_loop_assigns_part2 : Unsuccess
+[wp] [Alt-Ergo] Goal typed_init_t2_bis_v1_loop_assigns_part3 : Unsuccess
+[wp] [Qed] Goal typed_init_t2_bis_v1_assigns_exit_part1 : Valid
+[wp] [Alt-Ergo] Goal typed_init_t2_bis_v1_assigns_exit_part2 : Unsuccess
+[wp] [Qed] Goal typed_init_t2_bis_v1_assigns_exit_part3 : Valid
+[wp] [Qed] Goal typed_init_t2_bis_v1_assigns_normal_part1 : Valid
+[wp] [Alt-Ergo] Goal typed_init_t2_bis_v1_assigns_normal_part2 : Unsuccess
 [wp] Proved goals:    7 / 16
   Qed:             7 
   Alt-Ergo:        0  (unsuccess: 9)
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_injector.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_injector.0.res.oracle
index 1ffe02ced54c4609181c609059e659cd05497f91..20fdb332cff1128c6e165033300ad73bfea348fc 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_injector.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_injector.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/user_injector.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 20 goals scheduled
 [wp] [Qed] Goal typed_job_ensures_SEQ : Valid
@@ -33,7 +32,10 @@
 [wp] Warning: Memory model hypotheses for function 'job':
   /*@
      behavior typed:
-     requires \separated(\union(&seq,&service_cpt,service_id+(..),
-                           service_result+(..)),error);
+       requires
+         \separated(
+           error, (int *)service_id + (..), (int *)service_result + (..), &seq,
+           &service_cpt
+           );
      */
   int job(int a, int b, int *error);
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_injector.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_injector.1.res.oracle
index 6bfb550fb52d960c2682b01bb47ec2387ba8a7a4..93b4fb88899dc8766046ac491738f5ce0f679df6 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_injector.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_injector.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/user_injector.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 16 goals scheduled
 [wp] [Qed] Goal typed_ref_job_ensures_SEQ : Valid
@@ -29,8 +28,11 @@
 [wp] Warning: Memory model hypotheses for function 'job':
   /*@
      behavior typed_ref:
-     requires \separated(error,
-                \union(&seq,&service_cpt,service_id+(..),service_result+(..)));
-     requires \valid(error);
+       requires
+         \separated(
+           error, (int *)service_id + (..), (int *)service_result + (..), &seq,
+           &service_cpt
+           );
+       requires \valid(error);
      */
   int job(int a, int b, int *error);
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_rec.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_rec.res.oracle
index fdc05455b8d85a43d87f1cf9ca2c169e587af022..16e16726067efbf2c05555f8174b25a438697575 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_rec.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_rec.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/user_rec.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 18 goals scheduled
 [wp] [Alt-Ergo] Goal typed_F1_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_string.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_string.res.oracle
index 3b813077d9b1e91220984926ea680f4bb31d9149..48d205c0e686833aab93bed4760f2e6b2b96399a 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_string.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_string.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/user_string.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 13 goals scheduled
 [wp] [Qed] Goal typed_strlen_ensures : Valid
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_swap.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_swap.0.res.oracle
index dd19834fbb20e2b934e559200d0f6a0865845dd0..b02ef572b0c167f0fc0adbda7ddc96eeb1a0002f 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_swap.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_swap.0.res.oracle
@@ -1,16 +1,15 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_typed/user_swap.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 7 goals scheduled
-[wp] [Qed] Goal typed_main_assert : Valid
-[wp] [Qed] Goal typed_main_call_swap_requires : Valid
-[wp] [Qed] Goal typed_main_call_swap_requires_2 : Valid
 [wp] [Alt-Ergo] Goal typed_swap_ensures_A : Valid
 [wp] [Qed] Goal typed_swap_ensures_B : Valid
 [wp] [Qed] Goal typed_swap_assigns_part1 : Valid
 [wp] [Qed] Goal typed_swap_assigns_part2 : Valid
+[wp] [Qed] Goal typed_main_assert : Valid
+[wp] [Qed] Goal typed_main_call_swap_requires : Valid
+[wp] [Qed] Goal typed_main_call_swap_requires_2 : Valid
 [wp] Proved goals:    7 / 7
   Qed:             6 
   Alt-Ergo:        1
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_swap.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_swap.1.res.oracle
index ce020046acf9048667a7c9075e093f25b91b240e..1a4f9fd916dc87ddda1ca6877dad7c9460da89d1 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_swap.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_swap.1.res.oracle
@@ -1,15 +1,14 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_typed/user_swap.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 6 goals scheduled
-[wp] [Qed] Goal typed_ref_main_assert : Valid
-[wp] [Qed] Goal typed_ref_main_call_swap_requires : Valid
-[wp] [Qed] Goal typed_ref_main_call_swap_requires_2 : Valid
 [wp] [Qed] Goal typed_ref_swap_ensures_A : Valid
 [wp] [Qed] Goal typed_ref_swap_ensures_B : Valid
 [wp] [Qed] Goal typed_ref_swap_assigns : Valid
+[wp] [Qed] Goal typed_ref_main_assert : Valid
+[wp] [Qed] Goal typed_ref_main_call_swap_requires : Valid
+[wp] [Qed] Goal typed_ref_main_call_swap_requires_2 : Valid
 [wp] Proved goals:    6 / 6
   Qed:             6
 ------------------------------------------------------------
@@ -20,8 +19,8 @@
 [wp] Warning: Memory model hypotheses for function 'swap':
   /*@
      behavior typed_ref:
-     requires \separated(a,b);
-     requires \valid(a);
-     requires \valid(b);
+       requires \separated(a, b);
+       requires \valid(a);
+       requires \valid(b);
      */
   void swap(int *a, int *b);
diff --git a/src/plugins/wp/tests/wp_usage/oracle/caveat.0.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/caveat.0.res.oracle
index 218d938c66f64884fdc40885b3e6ef021d92727e..3e32676531171339c4abaa8fc6cc16846c252ecc 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/caveat.0.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/caveat.0.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp_usage/caveat.i:41: Warning: 
   parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead.
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function explicit
diff --git a/src/plugins/wp/tests/wp_usage/oracle/caveat.1.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/caveat.1.res.oracle
index bf3ddd5799774b1ac136def68852e3a87dd4d78e..b4a9f732ab57d81a13ed8b594f0a2c991ce7980e 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/caveat.1.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/caveat.1.res.oracle
@@ -11,7 +11,6 @@ Function implicit: { a *r p q }
 Function explicit: { a *r p q }
 Function observer: { a *r p q }
 .................................................
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function explicit
@@ -72,24 +71,24 @@ Prove: P_OBS(x_2, x_3, x_4).
 [wp] Warning: Memory model hypotheses for function 'implicit':
   /*@
      behavior typed_caveat:
-     requires \separated(a,r);
-     requires \valid(a);
-     requires \valid(r);
+       requires \separated(a, r);
+       requires \valid(a);
+       requires \valid(r);
      */
   void implicit(struct S *a, int *r);
 [wp] Warning: Memory model hypotheses for function 'explicit':
   /*@
      behavior typed_caveat:
-     requires \separated(a,r);
-     requires \valid(a);
-     requires \valid(r);
+       requires \separated(a, r);
+       requires \valid(a);
+       requires \valid(r);
      */
   void explicit(struct S *a, int *r);
 [wp] Warning: Memory model hypotheses for function 'observer':
   /*@
      behavior typed_caveat:
-     requires \separated(a,r);
-     requires \valid(a);
-     requires \valid(r);
+       requires \separated(a, r);
+       requires \valid(a);
+       requires \valid(r);
      */
   void observer(struct S *a, int *r);
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 e1c317646d5c3668adc48bea4aed56cf81a2b64c..c4439057d741e22283cc74f24ba42ade076657f5 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/caveat2.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/caveat2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Caveat)' [...]
 [kernel] Parsing tests/wp_usage/caveat2.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_usage/caveat2.i:22: Warning: Undefined array-size (sint32[])
 ------------------------------------------------------------
@@ -101,8 +100,8 @@ Prove: true.
 [wp] Warning: Memory model hypotheses for function 'job':
   /*@
      behavior typed_caveat:
-     requires \separated(p,b+(..));
-     requires \valid(p);
-     requires \valid(b+(..));
+       requires \separated(p, b + (..));
+       requires \valid(b + (..));
+       requires \valid(p);
      */
   void job(struct S *p, int n, int *b);
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 514fab0cd9fcf83dc2cd37d5a5ff18e1057c975c..d15c7f73b49722c9b671268208fb84518250c69e 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
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Caveat)' [...]
 [kernel] Parsing tests/wp_usage/caveat_range.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function reset
@@ -156,5 +155,6 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_caveat: requires \valid(p+(..)); */
+  /*@ behavior typed_caveat:
+        requires \valid(p + (..)); */
   void reset(struct S *p);
diff --git a/src/plugins/wp/tests/wp_usage/oracle/code_spec.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/code_spec.res.oracle
index a812acef1d1948e7e3a67f01b09fdb1b9b3dd2a8..253cb2dea90b13cb88c0b0167a7ba38061fe0693 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/code_spec.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/code_spec.res.oracle
@@ -39,7 +39,6 @@ Function calling_spec:
 Function cup:
 { val *ref &addr array[] &addr_value val_ref array_ref[] value_array }
 .................................................
-[wp] Loading driver 'share/wp.driver'
 [wp] [CFG] Goal by_addr_in_code_annotation_requires : Valid (Unreachable)
 [wp] [CFG] Goal by_reference_in_code_annotation_no_exit_exits : Valid (Unreachable)
 [wp] Warning: Missing RTE guards
diff --git a/src/plugins/wp/tests/wp_usage/oracle/core.0.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/core.0.res.oracle
index d9760199b7edafee3db5caf3b8266efec95afe97..4d1ca598e10b8a792fe8628a767944ef2c5f2477 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/core.0.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/core.0.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp_usage/core.i:11: Warning: 
   parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead.
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_usage/core.i:24: Warning: 
   Missing assigns clause (assigns 'everything' instead)
@@ -18,20 +17,16 @@
 Goal Post-condition (file tests/wp_usage/core.i, line 12) in 'f':
 Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(c) /\ is_sint32(x) /\
-      is_sint32(x_1) /\ is_sint32(x_2) /\ is_sint32(x_3) /\ is_sint32(x_4).
+      is_sint32(x_1) /\ is_sint32(x_2) /\ is_sint32(x_3).
   If a != 0
-  Then { Have: x_4 = x. }
-  Else { Have: x_4 = x. }
+  Then { Have: x_3 = x. }
+  Else { Have: x_3 = x. }
   If b != 0
-  Then { Have: x_4 = x_3. }
-  Else { Have: x_4 = x_3. }
+  Then { Have: x_3 = x_2. }
+  Else { Have: x_3 = x_2. }
   If c != 0
-  Then {
-    Let x_5 = 1 + x_3.
-    Have: x_5 = x_1.
-    Have: (x_2 = x_1) /\ (x_5 = x_2).
-  }
-  Else { Have: x_5 = x_1. }
+  Then { Have: (1 + x_2) = x_1. }
+  Else { Have: (1 + x_2) = x_1. }
 }
 Prove: P_OBS(x, x_1).
 
diff --git a/src/plugins/wp/tests/wp_usage/oracle/core.1.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/core.1.res.oracle
index 68fa444153836b8e1e3dcc5c31e55ab07d584fb4..337bce578f76fa1cfe3acb42bcecbd05b790507f 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/core.1.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/core.1.res.oracle
@@ -3,7 +3,6 @@
 [kernel] tests/wp_usage/core.i:11: Warning: 
   parsing obsolete ACSL construct 'logic declaration'. 'an axiomatic block' should be used instead.
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_usage/core.i:24: Warning: 
   Missing assigns clause (assigns 'everything' instead)
diff --git a/src/plugins/wp/tests/wp_usage/oracle/global.0.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/global.0.res.oracle
index 4535eb5a1311ead4b8eddb9afb7875566b7fb828..6bb95463d0ee683c1a109b51e4217f2d70d8a482 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/global.0.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/global.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Raw)' [...]
 [kernel] Parsing tests/wp_usage/global.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function foo
diff --git a/src/plugins/wp/tests/wp_usage/oracle/global.1.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/global.1.res.oracle
index a6c3906898ab2a46097521bb629c95a4baea45c2..0243fc9b1786ecd5d354be89f6212db6e707dc29 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/global.1.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/global.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed' [...]
 [kernel] Parsing tests/wp_usage/global.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function foo
@@ -21,5 +20,6 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'foo':
-  /*@ behavior typed: requires \separated(&GLOBAL,a); */
+  /*@ behavior typed:
+        requires \separated(a, &GLOBAL); */
   void foo(int *a);
diff --git a/src/plugins/wp/tests/wp_usage/oracle/global.2.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/global.2.res.oracle
index 33647c6dcb46b2e1befed2cb567b45d93b8caea2..6d03c92ee56c2b284a167e6eb2a17091cf840e08 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/global.2.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/global.2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Ref)' [...]
 [kernel] Parsing tests/wp_usage/global.c (with preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function foo
@@ -21,5 +20,7 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'foo':
-  /*@ behavior typed_ref: requires \separated(a,&GLOBAL); requires \valid(a); */
+  /*@ behavior typed_ref:
+        requires \separated(a, &GLOBAL);
+        requires \valid(a); */
   void foo(int *a);
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 c089fb5d1fb06deefe5d4e7ab48e56ea4e0cd0ed..2ed983d3f5f127812a72052978820e43f8fc87ae 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_usage/issue-189-bis.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function memcpy_alias_vars
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 f3a2767ec5c1975e6ce6eb91bc438810cf292e40..71a2cdaccb60d2b018b7d2eaa18b5ce4cbc57b8c 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
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_usage/issue-189-bis.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 
 Goal Post-condition 'memcpy,ok' in 'memcpy_context_vars':
@@ -171,8 +170,8 @@ Prove: true.
 [wp] Warning: Memory model hypotheses for function 'memcpy_context_vars':
   /*@
      behavior typed:
-     requires \separated(src,dst);
-     requires \valid(src);
-     requires \valid(dst);
+       requires \separated(src, dst);
+       requires \valid(dst);
+       requires \valid(src);
      */
   void memcpy_context_vars(unsigned char *src, unsigned char *dst, int len);
diff --git a/src/plugins/wp/tests/wp_usage/oracle/issue-189.0.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/issue-189.0.res.oracle
index b4b1200e289821553a629e8f91d16aca25d4e142..4751ddf0b3fcf7f3884aaab3c3f154dbb485cf11 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/issue-189.0.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/issue-189.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_usage/issue-189.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_usage/oracle/issue-189.1.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/issue-189.1.res.oracle
index 5e33a1a8de186123c1dcd3b9c71a72a600263d41..4b1378e938499df2a55c817f8db964445ad42230 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/issue-189.1.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/issue-189.1.res.oracle
@@ -7,7 +7,6 @@
 Init: { }
 Function f: { *ptr src idx }
 .................................................
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_usage/issue-189.i:17: Warning: 
   forbidden write to variable 'src' considered in an isolated context.
diff --git a/src/plugins/wp/tests/wp_usage/oracle/issue-189.2.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/issue-189.2.res.oracle
index ec41c7f550d2d54273da0404d0e7bc613adf0a0d..0b9c5b7d7e604f10f869d9801c20aba6bed6f7ea 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/issue-189.2.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/issue-189.2.res.oracle
@@ -7,7 +7,6 @@
 Init: { }
 Function f: { *ptr src idx }
 .................................................
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
@@ -26,7 +25,7 @@ Prove: true.
 [wp] Warning: Memory model hypotheses for function 'f':
   /*@
      behavior typed_caveat:
-     requires \separated(ptr,src);
-     requires \valid(ptr);
+       requires \separated(ptr, src);
+       requires \valid(ptr);
      */
   void f(char *ptr, char const *src, unsigned int idx);
diff --git a/src/plugins/wp/tests/wp_usage/oracle/reads.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/reads.res.oracle
index 45812dbfaba6534cad25c4b6c9da7f8e7d899e83..1328bbed17febcccd1e69b411df3b394601a1664 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/reads.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/reads.res.oracle
@@ -15,6 +15,5 @@ Function declared_equals_x: { x p }
 Function defined_equals_x: { x p }
 Function recursive_usage: { x y b }
 .................................................
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] No proof obligations
diff --git a/src/plugins/wp/tests/wp_usage/oracle/ref-usage-lemmas.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/ref-usage-lemmas.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..a22e16a5c310bb1d8147af73a86dcb698042c5d4
--- /dev/null
+++ b/src/plugins/wp/tests/wp_usage/oracle/ref-usage-lemmas.res.oracle
@@ -0,0 +1,19 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_usage/ref-usage-lemmas.i (no preprocessing)
+[wp] Running WP plugin...
+.................................................
+... Ref Usage
+.................................................
+Init: { &a b }
+Function foo: { &a b *x }
+Function main: { &a b __retres }
+.................................................
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function main
+------------------------------------------------------------
+
+Goal Pre-condition (file tests/wp_usage/ref-usage-lemmas.i, line 30) in 'main':
+Prove: true.
+
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_usage/oracle/save_load.1.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/save_load.1.res.oracle
index b335b1e24b1103980e749a710f5bfe71d08d4190..d951b156c9db55025e7330956907cb6ac58d599d 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/save_load.1.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/save_load.1.res.oracle
@@ -1,6 +1,5 @@
 [kernel] Warning: ignoring source files specified on the command line while loading a global initial context.
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 ------------------------------------------------------------
   Function f
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_usage/oracle/save_load.sav.res b/src/plugins/wp/tests/wp_usage/oracle/save_load.sav.res
index 565f6392f5a79b923d1594b58879f692af9a8c59..5271ccf0c21234ee97e3b1d72c5c6138629e2f50 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/save_load.sav.res
+++ b/src/plugins/wp/tests/wp_usage/oracle/save_load.sav.res
@@ -1,6 +1,5 @@
 [kernel] Parsing tests/wp_usage/save_load.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Function f
diff --git a/src/plugins/wp/tests/wp_usage/oracle/valinit.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/valinit.res.oracle
index e7916ad165955c8d41bfb2cd9194a9069f4227cc..d35aef5194bd805fad29893e022944be6393fb76 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/valinit.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/valinit.res.oracle
@@ -9,6 +9,5 @@ Function f:
 { &ly0 lz0 lx1 &ly1 lz1 lq0 lq1 lp1 &la0 la1 ls0 &lv0 lw0 ls1 ls2 ls3 ls4 ls5
   ls6 }
 .................................................
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] No proof obligations
diff --git a/src/plugins/wp/tests/wp_usage/oracle_qualif/caveat2.res.oracle b/src/plugins/wp/tests/wp_usage/oracle_qualif/caveat2.res.oracle
index c46a68ad13b89baae4c0d141b923caf8a188ee10..6c1a2b8821961dcbaf564314c55b39872a1ef6bc 100644
--- a/src/plugins/wp/tests/wp_usage/oracle_qualif/caveat2.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle_qualif/caveat2.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Caveat)' [...]
 [kernel] Parsing tests/wp_usage/caveat2.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] tests/wp_usage/caveat2.i:22: Warning: Undefined array-size (sint32[])
 [wp] 9 goals scheduled
@@ -24,8 +23,8 @@
 [wp] Warning: Memory model hypotheses for function 'job':
   /*@
      behavior typed_caveat:
-     requires \separated(p,b+(..));
-     requires \valid(p);
-     requires \valid(b+(..));
+       requires \separated(p, b + (..));
+       requires \valid(b + (..));
+       requires \valid(p);
      */
   void job(struct S *p, int n, int *b);
diff --git a/src/plugins/wp/tests/wp_usage/oracle_qualif/caveat_range.res.oracle b/src/plugins/wp/tests/wp_usage/oracle_qualif/caveat_range.res.oracle
index cf2d2ab507e212d9026a3324ba1963b03dba4607..050004166a73ac6f66a23eadb0131b5b510a598c 100644
--- a/src/plugins/wp/tests/wp_usage/oracle_qualif/caveat_range.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle_qualif/caveat_range.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp -wp-model 'Typed (Caveat)' [...]
 [kernel] Parsing tests/wp_usage/caveat_range.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 12 goals scheduled
 [wp] [Alt-Ergo] Goal typed_caveat_reset_ensures : Valid
@@ -24,5 +23,6 @@
   reset                     7        5       12       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_caveat: requires \valid(p+(..)); */
+  /*@ behavior typed_caveat:
+        requires \valid(p + (..)); */
   void reset(struct S *p);
diff --git a/src/plugins/wp/tests/wp_usage/oracle_qualif/issue-189-bis.0.res.oracle b/src/plugins/wp/tests/wp_usage/oracle_qualif/issue-189-bis.0.res.oracle
index 1c5952f1a020e452ad9d284b3805e867d99a9321..1aa3a66475c495f732460268228af5de005e9a00 100644
--- a/src/plugins/wp/tests/wp_usage/oracle_qualif/issue-189-bis.0.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle_qualif/issue-189-bis.0.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_usage/issue-189-bis.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 30 goals scheduled
 [wp] [Alt-Ergo] Goal typed_memcpy_alias_vars_ensures_memcpy : Valid
diff --git a/src/plugins/wp/tests/wp_usage/oracle_qualif/issue-189-bis.1.res.oracle b/src/plugins/wp/tests/wp_usage/oracle_qualif/issue-189-bis.1.res.oracle
index e063c170d221248677920e5087360ea1b8fc5798..c2679dccf0ddd1ca3dbebec9e4eb51a652063629 100644
--- a/src/plugins/wp/tests/wp_usage/oracle_qualif/issue-189-bis.1.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle_qualif/issue-189-bis.1.res.oracle
@@ -1,7 +1,6 @@
 # frama-c -wp [...]
 [kernel] Parsing tests/wp_usage/issue-189-bis.i (no preprocessing)
 [wp] Running WP plugin...
-[wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 10 goals scheduled
 [wp] [Alt-Ergo] Goal typed_memcpy_context_vars_ensures_memcpy_ok : Valid
@@ -24,8 +23,8 @@
 [wp] Warning: Memory model hypotheses for function 'memcpy_context_vars':
   /*@
      behavior typed:
-     requires \separated(src,dst);
-     requires \valid(src);
-     requires \valid(dst);
+       requires \separated(src, dst);
+       requires \valid(dst);
+       requires \valid(src);
      */
   void memcpy_context_vars(unsigned char *src, unsigned char *dst, int len);
diff --git a/src/plugins/wp/tests/wp_usage/ref-usage-lemmas.i b/src/plugins/wp/tests/wp_usage/ref-usage-lemmas.i
new file mode 100644
index 0000000000000000000000000000000000000000..77c4c5855222fecd05b80fbedddb39f2758757ed
--- /dev/null
+++ b/src/plugins/wp/tests/wp_usage/ref-usage-lemmas.i
@@ -0,0 +1,34 @@
+/* run.config
+  OPT: -wp-msg-key refusage
+*/
+/* run.config_qualif
+  DONTRUN:
+*/
+
+int a ;
+int b ;
+
+/*@ axiomatic A{
+    logic int* get reads \nothing ;
+    logic int* get_h = &a ;
+
+    axiom a: get_h == get ;
+    }
+
+*/
+
+/*@ axiomatic B{
+  logic integer value reads \nothing ;
+  axiom b: value == b ;
+  }
+*/
+
+void foo(int* x){
+  *x = a = b ;
+}
+
+/*@ requires a <= b ; */
+int main(void){
+  int e ;
+  foo(&e) ;
+}
diff --git a/src/plugins/wp/wpAnnot.ml b/src/plugins/wp/wpAnnot.ml
index b7b5698f643fdcafecc7251c539a7beec9b5ca2d..c27e5f587c1c40a375e52e7aed7d072cc4565844 100644
--- a/src/plugins/wp/wpAnnot.ml
+++ b/src/plugins/wp/wpAnnot.ml
@@ -162,13 +162,6 @@ let is_proved pf =
 let is_invalid pf =
   pf.invalid && not (is_proved pf)
 
-let status pf =
-  try
-    Array.iter (function Complete -> raise Exit | _ -> ()) pf.proved ;
-    `Proved
-  with Exit ->
-    if pf.invalid then `Invalid else `Partial
-
 (* -------------------------------------------------------------------------- *)
 (* --- PID for Functions                                                  --- *)
 (* -------------------------------------------------------------------------- *)
@@ -373,6 +366,9 @@ let kind_to_select config kind id = match kind with
   | WpStrategy.AcallPre(goal,fct) ->
       let goal = goal && goal_to_select config id in
       Some (WpStrategy.AcallPre(goal,fct))
+  | WpStrategy.AcallCheck(fct) ->
+      if goal_to_select config id then Some (WpStrategy.AcallCheck fct)
+      else None
   | WpStrategy.AcallPost _ ->
       if goal_to_select config id then Some kind else None
   | WpStrategy.Ahyp | WpStrategy.AcallHyp _ -> Some kind
@@ -753,7 +749,7 @@ let add_called_post called_kf termination_kind acc =
     let kind = WpStrategy.AcallHyp called_kf in
     let assumes = (Ast_info.behavior_assumes b) in
     let add_post acc (tk, p) =
-      if tk = termination_kind
+      if tk = termination_kind && not p.ip_content.tp_only_check
       then WpStrategy.add_prop_call_post acc kind called_kf b tk ~assumes p
       else acc
     in List.fold_left add_post acc b.b_post_cond
@@ -830,6 +826,8 @@ let add_variant_annot config s ca var_exp loop_entry loop_back =
   in loop_entry, loop_back
 
 let add_loop_invariant_annot config vloop s ca b_list inv acc =
+  let only_check = inv.tp_only_check in
+  let inv = inv.tp_statement in
   let assigns, loop_entry, loop_back , loop_core = acc in
   (* we have to prove that inv is true for each edge that goes
    * in the loop, so we can assume that inv is true for each edge
@@ -843,15 +841,18 @@ let add_loop_invariant_annot config vloop s ca b_list inv acc =
             WpStrategy.Agoal s ca inv in
         let loop_back = add_prop_loop_inv ~established:false config loop_back
             WpStrategy.Agoal s ca inv in
-        let loop_core = add_prop_inv_fixpoint config loop_core
-            WpStrategy.Ahyp s ca inv in
+        let loop_core =
+          if only_check then loop_core
+          else
+            add_prop_inv_fixpoint config loop_core WpStrategy.Ahyp s ca inv
+        in
         assigns, loop_entry , loop_back , loop_core
       end
-  | TBRhyp ->
+  | TBRhyp when not only_check ->
       let kind = WpStrategy.Ahyp in
       let loop_core = add_prop_inv_fixpoint config loop_core kind s ca inv
       in assigns, loop_entry , loop_back , loop_core
-  | TBRno -> acc
+  | TBRhyp | TBRno -> acc
 
 (** Returns the annotations for the three edges of the loop node:
  * - loop_entry : goals for the edge entering in the loop
@@ -934,24 +935,28 @@ let get_stmt_annots config v s =
               Printer.pp_code_annotation a;
             acc
           end
-    | AAssert (b_list, kind, p) ->
+    | AAssert (b_list, p) ->
         let kf = config.kf in
         let acc = match is_annot_for_config config v s b_list with
           | TBRno -> acc
           | TBRhyp ->
-              if kind = Check then acc
+              if p.tp_only_check then acc
               else
                 let b_acc =
-                  WpStrategy.add_prop_assert b_acc WpStrategy.Ahyp kf s a p
+                  WpStrategy.add_prop_assert
+                    b_acc WpStrategy.Ahyp kf s a p.tp_statement
                 in (b_acc, (a_acc, e_acc))
           | TBRok | TBRpart ->
               let id = WpPropId.mk_assert_id config.kf s a in
-              let check = kind = Check
-              and goal = goal_to_select config id in
-              if check && not goal then acc
+              let goal = goal_to_select config id in
+              if p.tp_only_check && not goal then acc
               else
-                let kind = WpStrategy.(if check then Agoal else Aboth goal) in
-                let b_acc = WpStrategy.add_prop_assert b_acc kind kf s a p in
+                let kind =
+                  WpStrategy.(if p.tp_only_check then Agoal else Aboth goal)
+                in
+                let b_acc =
+                  WpStrategy.add_prop_assert b_acc kind kf s a p.tp_statement
+                in
                 (b_acc, (a_acc, e_acc))
         in acc
     | AAllocation (_b_list, _frees_allocates) ->
@@ -1044,7 +1049,7 @@ let get_behavior_annots config =
         let post = get_fct_post_annots config Normal spec in
         WpStrategy.add_on_edges annots post (Cil2cfg.succ_e cfg v)
 
-    | Cil2cfg.Vexit ->
+    | Cil2cfg.VfctErr ->
         let post = get_fct_post_annots config Exits spec in
         WpStrategy.add_on_edges annots post (Cil2cfg.succ_e cfg v)
 
@@ -1118,8 +1123,9 @@ let add_global_annotations annots =
           "Global invariant not handled yet ('%s' ignored)"
           linfo.l_var_info.lv_name;
         ()
-    | Dlemma (name,_,_,_,_,_,_) ->
-        WpStrategy.add_axiom annots (LogicUsage.logic_lemma name)
+    | Dlemma (name,_,_,_,p,_,_) ->
+        if not (p.tp_only_check) then
+          WpStrategy.add_axiom annots (LogicUsage.logic_lemma name)
 
   and do_globals gs = List.iter do_global gs in
   (*[LC]: forcing order of iteration: hash is not the same on 32 and 64 bits *)
@@ -1300,7 +1306,7 @@ let process_unreached_annots cfg =
     | Cil2cfg.Vstart -> Wp_parameters.fatal "Start must be reachable"
     | Cil2cfg.VfctIn -> Wp_parameters.fatal "FctIn must be reachable"
     | Cil2cfg.VfctOut  -> List.fold_left (do_bhv Normal) acc spec.spec_behavior
-    | Cil2cfg.Vexit  ->
+    | Cil2cfg.VfctErr  ->
         let acc = List.fold_left (do_bhv Exits) acc spec.spec_behavior in
         let visitor = new vexit kf acc in
         ignore Visitor.(visitFramacKf (visitor :> frama_c_visitor) kf) ;
@@ -1425,7 +1431,7 @@ let get_id_prop_strategies ~model ?(assigns=WithAssigns) p =
   let open Property in match p with
   | IPCodeAnnot {ica_kf; ica_ca} ->
       let bhvs = match ica_ca.annot_content with
-        | AAssert (l, _, _) | AInvariant (l, _, _) | AAssigns (l, _) -> l
+        | AAssert (l, _) | AInvariant (l, _, _) | AAssigns (l, _) -> l
         | _ -> []
       in get_strategies assigns ica_kf model bhvs None (IdProp p)
   | IPAssigns {ias_kf = kf; ias_bhv = Id_loop _}
diff --git a/src/plugins/wp/wpAnnot.mli b/src/plugins/wp/wpAnnot.mli
index b08aa379c686030edbaabe947a8671f18428f2f4..fdd66f1de807146ead86fec1bf891ca75b0ebd5c 100644
--- a/src/plugins/wp/wpAnnot.mli
+++ b/src/plugins/wp/wpAnnot.mli
@@ -49,8 +49,6 @@ val is_proved : proof -> bool
 val is_invalid : proof -> bool
 (** whether an invalid proof result has been registered or not *)
 
-val status : proof -> [ `Proved | `Invalid | `Partial ]
-
 val target : proof -> Property.t
 val dependencies : proof -> Property.t list
 
diff --git a/src/plugins/wp/wpContext.ml b/src/plugins/wp/wpContext.ml
index b37368f1378ab00324b27263dec554cf50b2aa52..acc32631cad27c54f7759b625abc66d6cde26b94 100644
--- a/src/plugins/wp/wpContext.ml
+++ b/src/plugins/wp/wpContext.ml
@@ -34,11 +34,11 @@ type model = {
 
 and rollback = (unit -> unit)
 and scope = Global | Kf of Kernel_function.t
-and hypotheses = unit -> MemoryContext.clause list
+and hypotheses = MemoryContext.partition -> MemoryContext.partition
 and context = model * scope
 and t = context
 
-let nohyp (_kf) = []
+let nohyp (_kf) = MemoryContext.empty
 
 module MODEL =
 struct
@@ -149,7 +149,8 @@ let get_context () = Context.get context |> snd
 let get_model () = get_context () |> fst
 let get_scope () = get_context () |> snd
 
-let compute_hypotheses m f = on_context (m,Kf f) m.hypotheses ()
+let compute_hypotheses m f =
+  on_context (m,Kf f) m.hypotheses MemoryContext.empty
 
 let directory () = get_model () |> MODEL.id |> Wp_parameters.get_output_dir
 
diff --git a/src/plugins/wp/wpContext.mli b/src/plugins/wp/wpContext.mli
index 7693815595f66aa61dc739c8059173b0a812c50f..a52c5af5f7fbde050c2b4f0b6ec0fb65e5177a89 100644
--- a/src/plugins/wp/wpContext.mli
+++ b/src/plugins/wp/wpContext.mli
@@ -25,7 +25,7 @@
 type model
 type scope = Global | Kf of Kernel_function.t
 type rollback = unit -> unit
-type hypotheses = unit -> MemoryContext.clause list
+type hypotheses = MemoryContext.partition -> MemoryContext.partition
 
 val register :
   id:string ->
@@ -44,7 +44,7 @@ val register :
 val get_descr : model -> string
 val get_emitter : model -> Emitter.t
 
-val compute_hypotheses : model -> Kernel_function.t -> MemoryContext.clause list
+val compute_hypotheses : model -> Kernel_function.t -> MemoryContext.partition
 
 type context = model * scope
 type t = context
diff --git a/src/plugins/wp/wpPropId.ml b/src/plugins/wp/wpPropId.ml
index 7b694b72a677719f0c8bd1f6334bd8c24ceeb5d3..441d8cbfb9a77ad409cac7eaec0ee71afb1318db 100644
--- a/src/plugins/wp/wpPropId.ml
+++ b/src/plugins/wp/wpPropId.ml
@@ -230,7 +230,7 @@ let compare_prop_id pid1 pid2 =
     else
       Stdlib.compare pid1.p_part pid2.p_part
 
-module PropId =
+module PropIdRaw =
   Datatype.Make_with_collections(
   struct
     type t = prop_id
@@ -356,7 +356,7 @@ end = struct
     in normalize_basename basename
 
 
-  module UniquifyPropId = NameUniquify(PropId)(struct
+  module UniquifyPropId = NameUniquify(PropIdRaw)(struct
       let name = "WpProperty"
       let basename = get_prop_id_basename
     end)
@@ -435,7 +435,7 @@ struct
         if n < 1000 then Printf.sprintf "%s_part%03d" basename (succ k) else
           Printf.sprintf "%s_part%06d" basename (succ k)
 
-  module Uniquify2 = NameUniquify(PropId)(struct
+  module Uniquify2 = NameUniquify(PropIdRaw)(struct
       let name = "Wp.WpPropId.Names2."
       let basename = get_prop_id_basename
     end)
@@ -458,17 +458,23 @@ let get_propid = Names.get_prop_id_name
 let pp_propid fmt pid =
   Format.pp_print_string fmt (get_propid pid)
 
-let pp_names fmt l =  match l with [] -> () | _ ->
-  Format.fprintf fmt "_%a" (Wp_error.pp_string_list ~empty:"" ~sep:"_") l
+let pp_names fmt l =
+  let l = Datatype.String.Set.elements l in
+  match l with
+  | [] -> ()
+  | _ -> Format.fprintf fmt "_%a" (Wp_error.pp_string_list ~empty:"" ~sep:"_") l
 
 let ident_names names =
   List.filter (function "" -> true
                       | _ as n -> '\"' <> (String.get n 0) ) names
 
+let pred_names p =
+  let p_names = ident_names p.tp_statement.pred_name in
+  if p.tp_only_check then "@check"::p_names else p_names
+
 let code_annot_names ca = match ca.annot_content with
-  | AAssert (_, Check, named_pred)  -> "@check"::(ident_names named_pred.pred_name)
-  | AAssert (_, Assert, named_pred)  -> "@assert"::(ident_names named_pred.pred_name)
-  | AInvariant (_,_,named_pred) -> "@invariant"::(ident_names named_pred.pred_name)
+  | AAssert (_, pred)  -> "@assert" :: pred_names pred
+  | AInvariant (_,_,pred) -> "@invariant":: pred_names pred
   | AVariant (term, _) -> "@variant"::(ident_names term.term_name)
   | AExtended(_,_,{ext_name}) -> [Printf.sprintf "@%s" ext_name]
   | _ -> [] (* TODO : add some more names ? *)
@@ -479,7 +485,7 @@ let user_prop_names p =
   let open Property in match p with
   | IPPredicate {ip_kind; ip_pred} ->
       Format.asprintf  "@@%a" Property.pretty_predicate_kind ip_kind ::
-      ip_pred.ip_content.pred_name
+      pred_names ip_pred.ip_content
   | IPExtended {ie_ext={ext_name}} -> [ Printf.sprintf "@%s" ext_name ]
   | IPCodeAnnot {ica_ca} -> code_annot_names ica_ca
   | IPComplete {ic_bhvs} ->
@@ -497,8 +503,8 @@ let user_prop_names p =
   | IPDecrease {id_ca=Some ca} -> "@decreases"::code_annot_names ca
   | IPDecrease _ -> [ "@decreases" ]
   | IPLemma {il_name = a; il_pred = l} ->
-      let names = "@lemma"::a::(ident_names l.pred_name)
-      in begin
+      let names = "@lemma"::a::pred_names l in
+      begin
         match LogicUsage.section_of_lemma a with
         | LogicUsage.Toplevel _ -> names
         | LogicUsage.Axiomatic ax -> ax.LogicUsage.ax_name::names
@@ -570,6 +576,16 @@ end
 
 let pretty_local = Pretty.pp_local
 
+(* -------------------------------------------------------------------------- *)
+(* --- Datatype                                                           --- *)
+(* -------------------------------------------------------------------------- *)
+
+module PropId =
+struct
+  include PropIdRaw
+  let pretty = pp_propid
+end
+
 (* -------------------------------------------------------------------------- *)
 (* --- Hints                                                              --- *)
 (* -------------------------------------------------------------------------- *)
@@ -641,8 +657,8 @@ let assigns_hints hs froms =
   List.iter (fun ({it_content=t},_) -> term_hints hs t) froms
 
 let annot_hints hs = function
-  | AAssert(bs,_,ipred) | AInvariant(bs,_,ipred) ->
-      List.iter (add_hint hs) (ident_names ipred.pred_name) ;
+  | AAssert(bs,ipred) | AInvariant(bs,_,ipred) ->
+      List.iter (add_hint hs) (ident_names ipred.tp_statement.pred_name) ;
       List.iter (add_hint hs) bs
   | AAssigns(bs,Writes froms) ->
       List.iter (add_hint hs) bs ;
@@ -654,12 +670,12 @@ let property_hints hs =
   let open Property in function
     | IPAxiom  {il_name; il_pred}
     | IPLemma  {il_name; il_pred} ->
-        List.iter (add_required hs) (il_name::il_pred.pred_name)
+        List.iter (add_required hs) (il_name::il_pred.tp_statement.pred_name)
     | IPBehavior _ -> ()
     | IPComplete {ic_bhvs} | IPDisjoint {ic_bhvs} ->
-        List.iter (add_required hs) ic_bhvs
+        Datatype.String.Set.iter (add_required hs) ic_bhvs
     | IPPredicate {ip_pred} ->
-        List.iter (add_hint hs) ip_pred.ip_content.pred_name
+        List.iter (add_hint hs) ip_pred.ip_content.tp_statement.pred_name
     | IPExtended {ie_ext={ext_name}} -> List.iter (add_hint hs) [ext_name]
     | IPCodeAnnot {ica_ca} -> annot_hints hs ica_ca.annot_content
     | IPAssigns {ias_froms} -> assigns_hints hs ias_froms
diff --git a/src/plugins/wp/wpReached.ml b/src/plugins/wp/wpReached.ml
index 98acfad8ecbdd9dcf19e600ffe29b1efa795a5b6..b21fa463f9fdd3b9aae169f4c37799a80600c8d0 100644
--- a/src/plugins/wp/wpReached.ml
+++ b/src/plugins/wp/wpReached.ml
@@ -84,8 +84,9 @@ let is_dead_annot ca =
   match ca.annot_content with
   | APragma (Loop_pragma (Unroll_specs [ spec ; _ ])) ->
       false && is_unrolled_completely spec
-  | AAssert([],Assert,p) -> is_predicate false p
-  | AInvariant([],_,p) -> is_predicate false p
+  | AAssert([],p)
+  | AInvariant([],_,p) ->
+      not p.tp_only_check && is_predicate false p.tp_statement
   | _ -> false
 
 let is_dead_code stmt =
diff --git a/src/plugins/wp/wpReport.ml b/src/plugins/wp/wpReport.ml
index be5b8151c1363541716bd1ebf093eb147be42926..6bdd9397a04e55018e96370fa42afd2ce900c248 100644
--- a/src/plugins/wp/wpReport.ml
+++ b/src/plugins/wp/wpReport.ml
@@ -609,7 +609,7 @@ let pstats ~config fmt s cmd arg =
   | "wp" | "qed" -> stat ~config fmt (get_prover s VCS.Qed) arg
   | cmd when is_stat_name cmd -> stat ~config fmt s.main cmd
   | prover ->
-      match (VCS.prover_of_name prover) with
+      match (VCS.parse_prover prover) with
       | None -> Wp_parameters.error ~once:true "Unknown prover name %s" prover
       | Some prover -> stat ~config fmt (get_prover s prover) arg
 
diff --git a/src/plugins/wp/wpStrategy.ml b/src/plugins/wp/wpStrategy.ml
index ee31dab55e746eef3b68c77901182615c54cffce..96f589da256b9329369a41a49b171e172f687230 100644
--- a/src/plugins/wp/wpStrategy.ml
+++ b/src/plugins/wp/wpStrategy.ml
@@ -48,10 +48,15 @@ type annot_kind =
   | AcallPre of bool * kernel_function
   (* annotation is a called function precondition :
      to be considered as hyp, and goal if bool=true *)
+  | AcallCheck of kernel_function
+  (* annotation is a called function check-only precondition.
+     to be considered as goal only. *)
   | AcallPost of kernel_function
   (* annotation is a called function post check :
      to be considered as goal only *)
 
+type call_pre_kind = CPhyp | CPgoal | CPboth
+
 (* -------------------------------------------------------------------------- *)
 (* --- Annotations for one program point.                                 --- *)
 (* -------------------------------------------------------------------------- *)
@@ -68,7 +73,7 @@ type annots = {
   p_both : (bool * WpPropId.pred_info) list;
   p_cut : (bool * WpPropId.pred_info) list;
   call_hyp : WpPropId.pred_info list ForCall.t; (* post and pre *)
-  call_pre : (bool * WpPropId.pred_info) list ForCall.t; (* goal only *)
+  call_pre : (call_pre_kind * WpPropId.pred_info) list ForCall.t;
   call_post : WpPropId.pred_info list ForCall.t; (* post goals only (not hyp) *)
   call_asgn : WpPropId.assigns_full_info ForCall.t;
   a_goal : WpPropId.assigns_full_info;
@@ -112,10 +117,20 @@ let add_prop acc kind id p =
                          | Some p -> Some(WpPropId.mk_pred_info id p) in
   let add_hyp l = match get_p with None -> l | Some p -> p::l in
   let add_goal l = match get_p with None -> l | Some p -> p::l in
+  let add_both_std goal l =
+    match get_p with None -> l | Some p -> (goal,p) :: l
+  in
   let add_both goal l =
     match get_p with
     | None -> l
-    | Some p -> (goal, p)::l
+    | Some p ->
+        let kind = if goal then CPboth else CPhyp in
+        (kind, p)::l
+  in
+  let add_pre l =
+    match get_p with
+    | None -> l
+    | Some p -> (CPgoal, p) :: l
   in
   let add_for_call fct calls =
     let l = try ForCall.find fct calls with Not_found -> [] in
@@ -123,6 +138,10 @@ let add_prop acc kind id p =
   let add_both_call fct goal calls =
     let l = try ForCall.find fct calls with Not_found -> [] in
     ForCall.add fct (add_both goal l) calls in
+  let add_pre_call fct calls =
+    let l = try ForCall.find fct calls with Not_found -> [] in
+    ForCall.add fct (add_pre l) calls
+  in
   let info = acc.info in
   let goal, info = match kind with
     | Ahyp ->
@@ -130,13 +149,15 @@ let add_prop acc kind id p =
     | Agoal ->
         true, { info with p_goal = add_goal info.p_goal }
     | Aboth goal ->
-        goal, { info with p_both = add_both goal info.p_both }
+        goal, { info with p_both = add_both_std goal info.p_both }
     | AcutB goal ->
-        goal, { info with p_cut = add_both goal info.p_cut }
+        goal, { info with p_cut = add_both_std goal info.p_cut }
     | AcallHyp fct ->
         false, { info with call_hyp = add_for_call fct info.call_hyp }
     | AcallPre (goal,fct) ->
         goal, { info with call_pre = add_both_call fct goal info.call_pre }
+    | AcallCheck fct ->
+        true, { info with call_pre = add_pre_call fct info.call_pre }
     | AcallPost fct ->
         true, { info with call_post = add_for_call fct info.call_post }
   in let acc = { acc with info = info } in
@@ -149,7 +170,10 @@ let add_prop_fct_pre_bhv acc kind kf bhv =
     let p = Logic_const.pred_of_id_pred pred in
     Logic_const.(pat (p,pre_label))
   in
-  let requires = Logic_const.pands (List.map norm_pred bhv.b_requires) in
+  let requires =
+    List.filter (fun x -> not x.ip_content.tp_only_check) bhv.b_requires
+  in
+  let requires = Logic_const.pands (List.map norm_pred requires) in
   let assumes = Logic_const.pands (List.map norm_pred bhv.b_assumes) in
   let precond = Logic_const.pimplies (assumes, requires) in
   let precond_id = Logic_const.new_predicate precond in
@@ -159,12 +183,14 @@ let add_prop_fct_pre_bhv acc kind kf bhv =
   add_prop acc kind id p
 
 let add_prop_fct_pre acc kind kf bhv ~assumes pre =
-  let id = WpPropId.mk_pre_id kf Kglobal bhv pre in
-  let labels = NormAtLabels.labels_fct_pre in
-  let p = Logic_const.pred_of_id_pred pre in
-  let p = Logic_const.(pat (p,pre_label)) in
-  let p = normalize id ?assumes labels p in
-  add_prop acc kind id p
+  if pre.ip_content.tp_only_check then acc else begin
+    let id = WpPropId.mk_pre_id kf Kglobal bhv pre in
+    let labels = NormAtLabels.labels_fct_pre in
+    let p = Logic_const.pred_of_id_pred pre in
+    let p = Logic_const.(pat (p,pre_label)) in
+    let p = normalize id ?assumes labels p in
+    add_prop acc kind id p
+  end
 
 let add_prop_fct_post acc kind kf  bhv tkind post =
   let id = WpPropId.mk_fct_post_id kf bhv (tkind, post) in
@@ -207,13 +233,24 @@ let add_prop_stmt_post acc kind kf s bhv tkind l_post ~assumes post =
   let p = normalize id labels ?assumes p in
   add_prop acc kind id p
 
+let update_kind kind pre =
+  if pre.ip_content.tp_only_check then begin
+    match kind with
+    | AcallPre(false,_) -> None
+    | AcallPre(true, kf) -> Some (AcallCheck kf)
+    | _ -> Some kind
+  end else Some kind
+
 let add_prop_call_pre acc kind id ~assumes pre =
-  let labels = NormAtLabels.labels_fct_pre in
-  let p = Logic_const.pred_of_id_pred pre in
-  (* assumes can be normalized in the same time *)
-  let p = Logic_const.pimplies (assumes, p) in
-  let p = normalize id labels p in
-  add_prop acc kind id p
+  match update_kind kind pre with
+  | None -> acc
+  | Some kind ->
+      let labels = NormAtLabels.labels_fct_pre in
+      let p = Logic_const.pred_of_id_pred pre in
+      (* assumes can be normalized in the same time *)
+      let p = Logic_const.pimplies (assumes, p) in
+      let p = normalize id labels p in
+      add_prop acc kind id p
 
 let add_prop_call_post acc kind called_kf bhv tkind ~assumes post =
   let id = WpPropId.mk_fct_post_id called_kf bhv (tkind, post) in
@@ -439,6 +476,14 @@ let filter_both l =
     p::h_acc, if goal then p::g_acc else g_acc
   in List.fold_left add ([], []) l
 
+let filter_both_call l =
+  let add (h_acc, g_acc) (goal, p) =
+    match goal with
+    | CPboth -> p :: h_acc, p :: g_acc
+    | CPhyp -> p :: h_acc, g_acc
+    | CPgoal -> h_acc, p :: g_acc
+  in List.fold_left add ([], []) l
+
 let get_both_hyp_goals annots = filter_both annots.info.p_both
 
 let get_call_hyp annots fct =
@@ -446,7 +491,7 @@ let get_call_hyp annots fct =
   with Not_found -> []
 
 let get_call_pre annots fct =
-  try filter_both (ForCall.find fct annots.info.call_pre)
+  try filter_both_call (ForCall.find fct annots.info.call_pre)
   with Not_found -> [],[]
 
 let get_call_post annots fct =
@@ -473,8 +518,14 @@ let pp_annots fmt acc =
     Format.fprintf fmt "%s%s: %a@."
       k (if b then "" else " (h)") WpPropId.pp_pred_of_pred_info p
   in
+  let pp_pred_c k c p =
+    let kind = match c with CPboth -> "(h+g)" | CPgoal -> "g" | CPhyp -> "h" in
+    Format.fprintf fmt "%s%s: %a@."
+      k kind WpPropId.pp_pred_of_pred_info p
+  in
   let pp_pred_list k l = List.iter (fun p -> pp_pred k true p) l in
   let pp_pred_b_list k l = List.iter (fun (b, p) -> pp_pred k b p) l in
+  let pp_pred_c_list k l = List.iter (fun (c, p) -> pp_pred_c k c p) l in
   begin
     pp_pred_list "H" acc.p_hyp;
     pp_pred_list "G" acc.p_goal;
@@ -488,7 +539,7 @@ let pp_annots fmt acc =
     ForCall.iter
       (fun kf bhs ->
          let name = "CallPre:" ^ (Kernel_function.get_name kf) in
-         pp_pred_b_list name bhs)
+         pp_pred_c_list name bhs)
       acc.call_pre;
     ForCall.iter
       (fun kf asgn ->
diff --git a/src/plugins/wp/wpStrategy.mli b/src/plugins/wp/wpStrategy.mli
index 9177f1fe53676af44dc9d2ed1345dd6cbc64234d..8f30ea928ce13ce88e7d6f240dc2f4905fe0df8e 100644
--- a/src/plugins/wp/wpStrategy.mli
+++ b/src/plugins/wp/wpStrategy.mli
@@ -58,6 +58,9 @@ type annot_kind =
   | AcallPre of bool * kernel_function
   (** annotation is a called function precondition :
       to be considered as hyp, and goal if bool=true *)
+  | AcallCheck of kernel_function
+  (** annotation is check-only called function precondition.
+      handled internally by {!add_prop_call_pre} below. *)
   | AcallPost of kernel_function
   (** annotation is a called function post check :
       to be considered as goal only (no hyp) *)
diff --git a/src/plugins/wp/wp_parameters.ml b/src/plugins/wp/wp_parameters.ml
index 78ebfb90fbfa624d08c286714ab4428231b44781..acf0b19a2c60799cb298f3796e47c8058d96e152 100644
--- a/src/plugins/wp/wp_parameters.ml
+++ b/src/plugins/wp/wp_parameters.ml
@@ -84,7 +84,7 @@ module Behaviors =
     (struct
       let option_name = "-wp-bhv"
       let arg_name = "b,..."
-      let help = "Select properties of the given behaviors (defaults to all behaviors) of the selected functions."
+      let help = "Select only properties belonging to listed behaviors."
     end)
 let () = on_reset Behaviors.clear
 
@@ -96,10 +96,14 @@ module Properties =
     (struct
       let option_name = "-wp-prop"
       let arg_name = "p,..."
-      let help = "Select properties having the one of the given tagnames (defaults to all properties).\n\
-                  You may also replace the tagname by '@category' for the selection of all properties of the given category.\n\
-                  Accepted categories are: lemmas, requires, assigns, ensures, exits, complete_behaviors, disjoint_behaviors, assert, check, invariant, variant, breaks, continues, returns.\n\
-                  Starts by a minus character to remove properties from the selection."
+      let help =
+        "Select properties based names and category.\n\
+         Use +name or +category to select properties and -name or -category\n\
+         to remove them from the selection. The '+' sign can be omitted.\n\
+         Categories are: @lemma, @requires, @assigns, @ensures, @exits,\n\
+         @assert, @invariant, @variant, @breaks, @continues, @returns,\n\
+         @complete_behaviors, @disjoint_behaviors and\n\
+         @check (which includes all check clauses)."
     end)
 let () = on_reset Properties.clear
 
@@ -617,6 +621,20 @@ module Provers = String_list
         "
     end)
 
+let () = Parameter_customize.set_group wp_prover
+module Interactive = String
+    (struct
+      let option_name = "-wp-interactive"
+      let arg_name = "mode"
+      let default = "batch"
+      let help =
+        "WP mode for interactive provers:\n\
+         - 'batch': use script only (default)\n\
+         - 'edit': run editor on every goal\n\
+         - 'fix': run editor for unproved goal\n\
+        "
+    end)
+
 let () = Parameter_customize.set_group wp_prover
 module RunAllProvers =
   False(struct
@@ -728,6 +746,18 @@ module SmokeTimeout =
         "Set the timeout (in seconds) for provers (default: %d)." default
   end)
 
+let () = Parameter_customize.set_group wp_prover
+module InteractiveTimeout =
+  Int(struct
+    let option_name = "-wp-interactive-timeout"
+    let default = 30
+    let arg_name = "n"
+    let help =
+      Printf.sprintf
+        "Set the timeout (in seconds) for checking scripts\n\
+         of interactive provers (default: %d)." default
+  end)
+
 let () = Parameter_customize.set_group wp_prover
 module TimeExtra =
   Int(struct
@@ -1040,6 +1070,25 @@ module MemoryContext =
       let help = "Warn Against Memory Model Hypotheses"
     end)
 
+let wkey_imprecise_hypotheses_assigns =
+  register_warn_category "hypotheses:assigns"
+let () = set_warn_status wkey_imprecise_hypotheses_assigns Log.Winactive
+
+let () = Parameter_customize.set_group wp_po
+let () = Parameter_customize.do_not_save ()
+
+module CheckModelHypotheses =
+  False
+    (struct
+      let option_name = "-wp-check-model-hypotheses"
+      let help = "Insert memory model hypotheses in function contracts and \
+                  check them on call. (experimental)"
+    end)
+
+let wkey_imprecise_hypotheses_assigns =
+  register_warn_category "hypotheses:assigns"
+let () = set_warn_status wkey_imprecise_hypotheses_assigns Log.Winactive
+
 let () = Parameter_customize.set_group wp_po
 module OutputDir =
   String(struct
diff --git a/src/plugins/wp/wp_parameters.mli b/src/plugins/wp/wp_parameters.mli
index f998977a9af312b4433ba49926a80b811f21a275..236c418e01883ea1690ca1a4961af637dd808464 100644
--- a/src/plugins/wp/wp_parameters.mli
+++ b/src/plugins/wp/wp_parameters.mli
@@ -108,6 +108,7 @@ module PrecondWeakening : Parameter_sig.Bool
 module Detect: Parameter_sig.Bool
 module Generate:Parameter_sig.Bool
 module Provers: Parameter_sig.String_list
+module Interactive: Parameter_sig.String
 module RunAllProvers: Parameter_sig.Bool
 module Cache: Parameter_sig.String
 module CacheEnv: Parameter_sig.Bool
@@ -118,6 +119,7 @@ module Script: Parameter_sig.String
 module UpdateScript: Parameter_sig.Bool
 module Timeout: Parameter_sig.Int
 module SmokeTimeout: Parameter_sig.Int
+module InteractiveTimeout: Parameter_sig.Int
 module TimeExtra: Parameter_sig.Int
 module TimeMargin: Parameter_sig.Int
 module CoqTimeout: Parameter_sig.Int
@@ -150,11 +152,14 @@ module Report: Parameter_sig.String_list
 module ReportJson: Parameter_sig.String
 module ReportName: Parameter_sig.String
 module MemoryContext: Parameter_sig.Bool
+module CheckModelHypotheses: Parameter_sig.Bool
 module SmokeTests: Parameter_sig.Bool
 module SmokeDeadloop: Parameter_sig.Bool
 module SmokeDeadcode: Parameter_sig.Bool
 module SmokeDeadcall: Parameter_sig.Bool
 
+val wkey_imprecise_hypotheses_assigns: warn_category
+
 (** {2 Getters} *)
 
 val has_out : unit -> bool
diff --git a/src/plugins/wp/wpo.ml b/src/plugins/wp/wpo.ml
index 1d6649a3de7511c3c8a26c798fa5d9a90c25877d..a36b16398193812618864a7ab292f6d1d012b751 100644
--- a/src/plugins/wp/wpo.ml
+++ b/src/plugins/wp/wpo.ml
@@ -283,8 +283,8 @@ struct
       List.iter
         (fun (prover,result) ->
            if result.verdict <> NoResult then
-             Format.fprintf fmt "Prover %a returns %a@\n"
-               pp_prover prover (pp_result_qualif prover) result
+             Format.fprintf fmt "Prover %a returns %t@\n"
+               pp_prover prover (pp_result_qualif prover result)
         ) results ;
     end
 
@@ -347,9 +347,9 @@ struct
       List.iter
         (fun (prover,result) ->
            if result.verdict <> NoResult then
-             Format.fprintf fmt "Prover %a returns %a@\n"
+             Format.fprintf fmt "Prover %a returns %t@\n"
                pp_prover prover
-               (pp_result_qualif prover) result
+               (pp_result_qualif prover result)
         ) results ;
     end
 
@@ -723,7 +723,8 @@ let set_doomed emitter pid =
             let pred_loc = Stmt.loc stmt in
             let pred_name = [ "Wp" ; "SmokeTest" ] in
             let pf = { Logic_const.pfalse with pred_loc ; pred_name } in
-            let ca = Logic_const.new_code_annotation (AAssert ([],Assert,pf)) in
+            let pf = Logic_const.toplevel_predicate pf in
+            let ca = Logic_const.new_code_annotation (AAssert ([],pf)) in
             Annotations.add_code_annot emitter ~kf stmt ca ; ca
       in
       List.iter (set_invalid emitter) (Property.ip_of_code_annot kf stmt ca)
@@ -804,7 +805,6 @@ let is_trivial g =
   | GoalLemma vc -> VC_Lemma.is_trivial vc
   | GoalAnnot vc -> VC_Annot.is_trivial vc
 
-
 let reduce g =
   match g.po_formula with
   | GoalLemma vc -> WpContext.on_context (get_context g) VC_Lemma.is_trivial vc
@@ -814,8 +814,7 @@ let resolve g =
   let valid = reduce g in
   if valid then
     let result = VCS.result ~solver:(qed_time g) VCS.Valid in
-    ignore (set_result g VCS.Qed result) ;
-    true
+    ( set_result g VCS.Qed result ; true )
   else false
 
 let compute g =
@@ -835,6 +834,12 @@ let is_unknown g = List.exists
     (fun (_,r) -> VCS.is_verdict r && not (VCS.is_valid r))
     ( get_results g )
 
+let is_passed g =
+  if is_smoke_test g then
+    not (is_proved g)
+  else
+    is_proved g
+
 let get_result =
   Dynamic.register ~plugin:"Wp" "Wpo.get_result" ~journalize:false
     (Datatype.func2 WpoType.ty ProverType.ty ResultType.ty)
@@ -949,7 +954,7 @@ let goals_of_property =
 let prover_of_name =
   Dynamic.register ~plugin:"Wp" "Wpo.prover_of_name" ~journalize:false
     (Datatype.func Datatype.string (Datatype.option ProverType.ty))
-    VCS.prover_of_name
+    VCS.parse_prover
 
 (* -------------------------------------------------------------------------- *)
 (* --- Prover and Files                                                   --- *)
diff --git a/src/plugins/wp/wpo.mli b/src/plugins/wp/wpo.mli
index 4c1981c0fa00a92b0237d4eb63fd4af5556cd6fc..fa6d1c337f4055a02c22da886ac0b2e353334be4 100644
--- a/src/plugins/wp/wpo.mli
+++ b/src/plugins/wp/wpo.mli
@@ -159,7 +159,8 @@ val get_proof : t -> [`Passed|`Failed|`Unknown] * Property.t
 val get_target : t -> Property.t
 val is_trivial : t -> bool (** do not tries simplification, do not check prover results *)
 val is_proved : t -> bool (** do not tries simplification, check prover results *)
-val is_unknown : t -> bool
+val is_unknown : t -> bool (** at least one prover returns « Unknown » *)
+val is_passed : t -> bool (** proved, or unknown for smoke tests *)
 val warnings : t -> Warning.t list
 
 (** [true] if the result is valid. Dynamically exported.
diff --git a/tests/builtins/allocated.c b/tests/builtins/allocated.c
index b09b532881c9ef6a322b5ad7292035bbdfd3d66e..3015ea59f137e0993b6a6c5d782d1c38e07fb3c3 100644
--- a/tests/builtins/allocated.c
+++ b/tests/builtins/allocated.c
@@ -1,6 +1,6 @@
 /* run.config*
-   STDOPT: +"-slevel 1 -eva-mlevel 0"
-   STDOPT: +"-slevel 999 -eva-alloc-builtin fresh"
+   STDOPT: +"-eva-slevel 1 -eva-mlevel 0"
+   STDOPT: +"-eva-slevel 999 -eva-alloc-builtin fresh"
 */
 #define assert_bottom(exp) if (nondet) {exp; Frama_C_show_each_unreachable();}
 
diff --git a/tests/builtins/gcc_zero_length_array.c b/tests/builtins/gcc_zero_length_array.c
index b990a598b0e4f9c25888f70e5a482fa9dfc4757f..18d39c75f5f6b3902363c7cbff8fb3da2689e321 100644
--- a/tests/builtins/gcc_zero_length_array.c
+++ b/tests/builtins/gcc_zero_length_array.c
@@ -1,5 +1,5 @@
 /* run.config*
-  STDOPT: +"-machdep gcc_x86_32 -eva-alloc-builtin fresh -slevel 11"
+  STDOPT: +"-machdep gcc_x86_32 -eva-alloc-builtin fresh -eva-slevel 11"
  */
 #include <stdlib.h>
 
diff --git a/tests/builtins/linked_list.c b/tests/builtins/linked_list.c
index 8ae291e74744e1efa73304be82e7569309ae407f..dfa85bbfb98d8203d21c9e88aef1012bfc63a6f1 100644
--- a/tests/builtins/linked_list.c
+++ b/tests/builtins/linked_list.c
@@ -1,7 +1,7 @@
 /* run.config*
    STDOPT: #"-load-module variadic -eva-no-builtins-auto"
-   STDOPT: #"-load-module variadic -plevel 100 -big-ints-hex 257 -eva-no-builtins-auto"
-   STDOPT: #"-load-module variadic -slevel 12 -big-ints-hex 257 -eva-no-builtins-auto"
+   STDOPT: #"-load-module variadic -eva-plevel 100 -big-ints-hex 257 -eva-no-builtins-auto"
+   STDOPT: #"-load-module variadic -eva-slevel 12 -big-ints-hex 257 -eva-no-builtins-auto"
 */
 
 #include "__fc_define_size_t.h"
diff --git a/tests/builtins/malloc-deps.c b/tests/builtins/malloc-deps.c
index 312e2534df54f1c9d390c49abe5465673dc598cb..1bb43e5021c1eb4b3d88ff639219613a9f099871 100644
--- a/tests/builtins/malloc-deps.c
+++ b/tests/builtins/malloc-deps.c
@@ -1,5 +1,5 @@
 /* run.config*
-   OPT: -eva @EVA_CONFIG@ -deps -calldeps -inout -slevel 5 -eva-msg-key malloc
+   OPT: -eva @EVA_CONFIG@ -deps -calldeps -inout -eva-slevel 5 -eva-msg-key malloc
 */
 #include <stdlib.h>
 
diff --git a/tests/builtins/malloc-optimistic.c b/tests/builtins/malloc-optimistic.c
index d5a922355cef26fc4fd6fd482771381ce6dea6ba..8b2a9551ec09b64cec7500533acb4043d6d4df68 100644
--- a/tests/builtins/malloc-optimistic.c
+++ b/tests/builtins/malloc-optimistic.c
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: +"-slevel 30 -eva-slevel-merge-after-loop @all -eva-memexec"
+   STDOPT: +"-eva-slevel 30 -eva-slevel-merge-after-loop @all -eva-memexec"
 */
 #include <stddef.h>
 //@ assigns \result \from \nothing;
diff --git a/tests/builtins/malloc.c b/tests/builtins/malloc.c
index fb9377fa0041f543e133230dab5ca534fcc32b61..989d36b908624a16151ca3120929f4bce1961862 100644
--- a/tests/builtins/malloc.c
+++ b/tests/builtins/malloc.c
@@ -1,5 +1,5 @@
 /* run.config*
-   OPT: -eva @EVA_CONFIG@ -slevel 10 -eva-mlevel 0 -eva-alloc-builtin by_stack
+   OPT: -eva @EVA_CONFIG@ -eva-slevel 10 -eva-mlevel 0 -eva-alloc-builtin by_stack
 */
 #include <stdlib.h>
 
diff --git a/tests/builtins/malloc_multiple.c b/tests/builtins/malloc_multiple.c
index 6c807d486a22e8a16f05c7447c7342a1fe0d8f18..81e2a9cc9f717679e7e98ff2047b2c5360f23bdc 100644
--- a/tests/builtins/malloc_multiple.c
+++ b/tests/builtins/malloc_multiple.c
@@ -1,5 +1,5 @@
 /* run.config*
-   OPT: -eva @EVA_CONFIG@ -slevel 50 -eva-mlevel 5
+   OPT: -eva @EVA_CONFIG@ -eva-slevel 50 -eva-mlevel 5
 */
 #include<stdlib.h>
 #define MAX 10
diff --git a/tests/builtins/memcpy.c b/tests/builtins/memcpy.c
index 3b438a803377db9cfbd9a59047e0389b70807c0d..97d2feee02e28b3480fb59d201ccdef64954943e 100644
--- a/tests/builtins/memcpy.c
+++ b/tests/builtins/memcpy.c
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: +"-calldeps -slevel-function init:2000 -eva-msg-key imprecision -plevel 150 -main main_all -inout -no-deps -absolute-valid-range 100000-100001 -then -load-module report -report"
+   STDOPT: +"-calldeps -eva-slevel-function init:2000 -eva-msg-key imprecision -eva-plevel 150 -main main_all -inout -no-deps -absolute-valid-range 100000-100001 -then -load-module report -report"
 */
 #include "string.h"
 
diff --git a/tests/builtins/memset.c b/tests/builtins/memset.c
index 2cbdd6386c6b0dddcd8e89164c9bc57d1e9d6e1b..bb8f0dfe496fc13e55f5da853a8c84c7c4f858f1 100644
--- a/tests/builtins/memset.c
+++ b/tests/builtins/memset.c
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: #"-calldeps -eva-msg-key imprecision -plevel 500" +"-inout -no-deps"
+   STDOPT: #"-calldeps -eva-msg-key imprecision -eva-plevel 500" +"-inout -no-deps"
 */
 
 #include "string.h"
diff --git a/tests/builtins/oracle/wcslen.res.oracle b/tests/builtins/oracle/wcslen.res.oracle
index ab87c6950567d2ac828a6ef681fd5e09ffa24829..00a752d3a13c96865b01c5993f4439c578fb0b19 100644
--- a/tests/builtins/oracle/wcslen.res.oracle
+++ b/tests/builtins/oracle/wcslen.res.oracle
@@ -1,4 +1,4 @@
-[kernel] Parsing wcslen.c (with preprocessing)
+[kernel] Parsing tests/builtins/wcslen.c (with preprocessing)
 [eva] Analyzing a complete application starting at main
 [eva] Computing initial state
 [eva] Initial state computed
@@ -31,335 +31,365 @@
                      [11] ∈ {100}
   nondet ∈ [--..--]
 [eva] computing for function small_sets <- main.
-  Called from wcslen.c:339.
-[eva] wcslen.c:60: Call to builtin wcslen
-[eva] wcslen.c:60: 
+  Called from tests/builtins/wcslen.c:370.
+[eva] tests/builtins/wcslen.c:60: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:60: 
   function wcslen: precondition 'valid_string_s' got status valid.
-[eva] wcslen.c:61: assertion got status valid.
-[eva] wcslen.c:65: Call to builtin wcslen
-[eva] wcslen.c:65: 
+[eva] tests/builtins/wcslen.c:61: assertion got status valid.
+[eva] tests/builtins/wcslen.c:65: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:65: 
   function wcslen: precondition 'valid_string_s' got status valid.
-[eva] wcslen.c:66: assertion got status valid.
-[eva] wcslen.c:70: Call to builtin wcslen
-[eva] wcslen.c:70: 
+[eva] tests/builtins/wcslen.c:66: assertion got status valid.
+[eva] tests/builtins/wcslen.c:70: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:70: 
   function wcslen: precondition 'valid_string_s' got status valid.
-[eva] wcslen.c:71: assertion got status valid.
-[eva] wcslen.c:75: Call to builtin wcslen
-[eva] wcslen.c:75: 
+[eva] tests/builtins/wcslen.c:71: assertion got status valid.
+[eva] tests/builtins/wcslen.c:75: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:75: 
   function wcslen: precondition 'valid_string_s' got status valid.
-[eva] wcslen.c:76: assertion got status valid.
-[eva] wcslen.c:81: Call to builtin wcslen
-[eva:alarm] wcslen.c:81: Warning: 
+[eva] tests/builtins/wcslen.c:76: assertion got status valid.
+[eva] tests/builtins/wcslen.c:81: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:81: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:82: assertion got status valid.
+[eva] tests/builtins/wcslen.c:82: assertion got status valid.
 [eva] Recording results for small_sets
 [eva] Done for function small_sets
 [eva] computing for function zero_termination <- main.
-  Called from wcslen.c:340.
-[eva] wcslen.c:89: Call to builtin wcslen
-[eva:alarm] wcslen.c:89: Warning: 
+  Called from tests/builtins/wcslen.c:371.
+[eva] tests/builtins/wcslen.c:89: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:89: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:90: assertion got status valid.
-[eva] wcslen.c:93: Call to builtin wcslen
-[eva:alarm] wcslen.c:93: Warning: 
+[eva] tests/builtins/wcslen.c:90: assertion got status valid.
+[eva] tests/builtins/wcslen.c:93: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:93: Warning: 
   function wcslen: precondition 'valid_string_s' got status invalid.
-[eva] wcslen.c:97: Call to builtin wcslen
-[eva:alarm] wcslen.c:97: Warning: 
+[eva] tests/builtins/wcslen.c:97: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:97: Warning: 
   function wcslen: precondition 'valid_string_s' got status invalid.
 [eva] Recording results for zero_termination
 [eva] Done for function zero_termination
 [eva] computing for function wcslen_initialization <- main.
-  Called from wcslen.c:341.
-[eva] wcslen.c:105: Call to builtin wcslen
-[eva:alarm] wcslen.c:105: Warning: 
+  Called from tests/builtins/wcslen.c:372.
+[eva] tests/builtins/wcslen.c:105: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:105: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:106: assertion got status valid.
-[eva] wcslen.c:109: Call to builtin wcslen
-[eva:alarm] wcslen.c:109: Warning: 
+[eva] tests/builtins/wcslen.c:106: assertion got status valid.
+[eva] tests/builtins/wcslen.c:109: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:109: Warning: 
   function wcslen: precondition 'valid_string_s' got status invalid.
-[eva] wcslen.c:116: Call to builtin wcslen
-[eva:alarm] wcslen.c:116: Warning: 
+[eva] tests/builtins/wcslen.c:116: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:116: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:117: assertion got status valid.
-[eva] wcslen.c:124: Call to builtin wcslen
-[eva:alarm] wcslen.c:124: Warning: 
+[eva] tests/builtins/wcslen.c:117: assertion got status valid.
+[eva] tests/builtins/wcslen.c:124: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:124: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:125: assertion got status valid.
+[eva] tests/builtins/wcslen.c:125: assertion got status valid.
 [eva] Recording results for wcslen_initialization
 [eva] Done for function wcslen_initialization
 [eva] computing for function wcslen_large <- main.
-  Called from wcslen.c:342.
+  Called from tests/builtins/wcslen.c:373.
 [eva] computing for function init_array_nondet <- wcslen_large <- main.
-  Called from wcslen.c:168.
-[eva] wcslen.c:161: Call to builtin memset
-[eva] wcslen.c:161: function memset: precondition 'valid_s' got status valid.
-[eva] FRAMAC_SHARE/libc/string.h:118: 
+  Called from tests/builtins/wcslen.c:168.
+[eva] tests/builtins/wcslen.c:161: Call to builtin memset
+[eva] tests/builtins/wcslen.c:161: 
+  function memset: precondition 'valid_s' got status valid.
+[eva] share/libc/string.h:118: 
   cannot evaluate ACSL term, unsupported ACSL construct: logic function memset
 [eva] Recording results for init_array_nondet
 [eva] Done for function init_array_nondet
 [eva] computing for function Frama_C_interval <- wcslen_large <- main.
-  Called from wcslen.c:171.
+  Called from tests/builtins/wcslen.c:171.
 [eva] using specification for function Frama_C_interval
-[eva] wcslen.c:171: 
+[eva] tests/builtins/wcslen.c:171: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] wcslen.c:172: Call to builtin wcslen
-[eva] wcslen.c:172: 
+[eva] tests/builtins/wcslen.c:172: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:172: 
   function wcslen: precondition 'valid_string_s' got status valid.
-[eva] wcslen.c:173: assertion got status valid.
+[eva] tests/builtins/wcslen.c:173: assertion got status valid.
 [eva] computing for function Frama_C_interval <- wcslen_large <- main.
-  Called from wcslen.c:175.
-[eva] wcslen.c:175: 
+  Called from tests/builtins/wcslen.c:175.
+[eva] tests/builtins/wcslen.c:175: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] wcslen.c:176: Call to builtin wcslen
-[eva] wcslen.c:176: 
+[eva] tests/builtins/wcslen.c:176: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:176: 
   function wcslen: precondition 'valid_string_s' got status valid.
-[eva] wcslen.c:177: assertion got status valid.
+[eva] tests/builtins/wcslen.c:177: assertion got status valid.
 [eva] computing for function Frama_C_interval <- wcslen_large <- main.
-  Called from wcslen.c:179.
-[eva] wcslen.c:179: 
+  Called from tests/builtins/wcslen.c:179.
+[eva] tests/builtins/wcslen.c:179: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] wcslen.c:180: Call to builtin wcslen
-[eva] wcslen.c:180: 
+[eva] tests/builtins/wcslen.c:180: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:180: 
   function wcslen: precondition 'valid_string_s' got status valid.
-[eva] wcslen.c:181: assertion got status valid.
+[eva] tests/builtins/wcslen.c:181: assertion got status valid.
 [eva] computing for function Frama_C_interval <- wcslen_large <- main.
-  Called from wcslen.c:183.
-[eva] wcslen.c:183: 
+  Called from tests/builtins/wcslen.c:183.
+[eva] tests/builtins/wcslen.c:183: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] wcslen.c:184: Call to builtin wcslen
-[eva:alarm] wcslen.c:184: Warning: 
+[eva] tests/builtins/wcslen.c:184: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:184: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:185: assertion got status valid.
+[eva] tests/builtins/wcslen.c:185: assertion got status valid.
 [eva] computing for function init_array_nondet <- wcslen_large <- main.
-  Called from wcslen.c:187.
-[eva] wcslen.c:161: Call to builtin memset
+  Called from tests/builtins/wcslen.c:187.
+[eva] tests/builtins/wcslen.c:161: Call to builtin memset
 [eva] Recording results for init_array_nondet
 [eva] Done for function init_array_nondet
 [eva] computing for function Frama_C_interval <- wcslen_large <- main.
-  Called from wcslen.c:188.
-[eva] wcslen.c:188: 
+  Called from tests/builtins/wcslen.c:188.
+[eva] tests/builtins/wcslen.c:188: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] wcslen.c:189: Call to builtin wcslen
-[eva:alarm] wcslen.c:189: Warning: 
+[eva] tests/builtins/wcslen.c:189: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:189: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:190: assertion got status valid.
+[eva] tests/builtins/wcslen.c:190: assertion got status valid.
 [eva] Recording results for wcslen_large
 [eva] Done for function wcslen_large
 [eva] computing for function wcslen_large_uninit <- main.
-  Called from wcslen.c:343.
+  Called from tests/builtins/wcslen.c:374.
 [eva] computing for function init_array_nondet <- wcslen_large_uninit <- main.
-  Called from wcslen.c:197.
-[eva] wcslen.c:161: Call to builtin memset
+  Called from tests/builtins/wcslen.c:197.
+[eva] tests/builtins/wcslen.c:161: Call to builtin memset
 [eva] Recording results for init_array_nondet
 [eva] Done for function init_array_nondet
 [eva] computing for function init_array_nondet <- wcslen_large_uninit <- main.
-  Called from wcslen.c:198.
-[eva] wcslen.c:161: Call to builtin memset
+  Called from tests/builtins/wcslen.c:198.
+[eva] tests/builtins/wcslen.c:161: Call to builtin memset
 [eva] Recording results for init_array_nondet
 [eva] Done for function init_array_nondet
 [eva] computing for function Frama_C_interval <- wcslen_large_uninit <- main.
-  Called from wcslen.c:202.
-[eva] wcslen.c:202: 
+  Called from tests/builtins/wcslen.c:202.
+[eva] tests/builtins/wcslen.c:202: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] wcslen.c:203: Call to builtin wcslen
-[eva:alarm] wcslen.c:203: Warning: 
+[eva] tests/builtins/wcslen.c:203: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:203: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:204: assertion got status valid.
+[eva] tests/builtins/wcslen.c:204: assertion got status valid.
 [eva] computing for function Frama_C_interval <- wcslen_large_uninit <- main.
-  Called from wcslen.c:207.
-[eva] wcslen.c:207: 
+  Called from tests/builtins/wcslen.c:207.
+[eva] tests/builtins/wcslen.c:207: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] wcslen.c:208: Call to builtin wcslen
-[eva:alarm] wcslen.c:208: Warning: 
+[eva] tests/builtins/wcslen.c:208: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:208: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:209: assertion got status valid.
+[eva] tests/builtins/wcslen.c:209: assertion got status valid.
 [eva] computing for function Frama_C_interval <- wcslen_large_uninit <- main.
-  Called from wcslen.c:211.
-[eva] wcslen.c:211: 
+  Called from tests/builtins/wcslen.c:211.
+[eva] tests/builtins/wcslen.c:211: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] wcslen.c:212: Call to builtin wcslen
-[eva:alarm] wcslen.c:212: Warning: 
+[eva] tests/builtins/wcslen.c:212: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:212: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:213: assertion got status valid.
+[eva] tests/builtins/wcslen.c:213: assertion got status valid.
 [eva] Recording results for wcslen_large_uninit
 [eva] Done for function wcslen_large_uninit
 [eva] computing for function misc <- main.
-  Called from wcslen.c:344.
-[eva] wcslen.c:241: Call to builtin wcslen
-[eva:alarm] wcslen.c:241: Warning: 
+  Called from tests/builtins/wcslen.c:375.
+[eva] tests/builtins/wcslen.c:241: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:241: Warning: 
   function wcslen: precondition 'valid_string_s' got status invalid.
-[eva] wcslen.c:244: Call to builtin wcslen
-[eva] wcslen.c:244: 
+[eva] tests/builtins/wcslen.c:244: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:244: 
   function wcslen: precondition 'valid_string_s' got status valid.
-[eva] wcslen.c:245: assertion got status valid.
-[eva] wcslen.c:248: Call to builtin wcslen
-[eva:alarm] wcslen.c:248: Warning: 
+[eva] tests/builtins/wcslen.c:245: assertion got status valid.
+[eva] tests/builtins/wcslen.c:248: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:248: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:249: assertion got status valid.
+[eva] tests/builtins/wcslen.c:249: assertion got status valid.
 [eva] computing for function Frama_C_interval <- misc <- main.
-  Called from wcslen.c:250.
-[eva] wcslen.c:250: 
+  Called from tests/builtins/wcslen.c:250.
+[eva] tests/builtins/wcslen.c:250: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] wcslen.c:252: Call to builtin wcslen
-[eva] wcslen.c:252: 
+[eva] tests/builtins/wcslen.c:252: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:252: 
   function wcslen: precondition 'valid_string_s' got status valid.
-[eva] wcslen.c:253: assertion got status valid.
-[eva] wcslen.c:255: Call to builtin wcslen
-[eva:alarm] wcslen.c:255: Warning: 
+[eva] tests/builtins/wcslen.c:253: assertion got status valid.
+[eva] tests/builtins/wcslen.c:255: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:255: Warning: 
   function wcslen: precondition 'valid_string_s' got status invalid.
-[eva] wcslen.c:256: Call to builtin wcslen
-[eva] wcslen.c:256: 
+[eva] tests/builtins/wcslen.c:256: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:256: 
   function wcslen: precondition 'valid_string_s' got status valid.
-[eva] wcslen.c:257: assertion got status valid.
-[eva] wcslen.c:260: Call to builtin wcslen
-[eva] wcslen.c:260: 
+[eva] tests/builtins/wcslen.c:257: assertion got status valid.
+[eva] tests/builtins/wcslen.c:260: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:260: 
   function wcslen: precondition 'valid_string_s' got status valid.
-[eva] wcslen.c:261: assertion got status valid.
-[eva] wcslen.c:265: Call to builtin wcslen
-[eva] wcslen.c:265: 
+[eva] tests/builtins/wcslen.c:261: assertion got status valid.
+[eva] tests/builtins/wcslen.c:265: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:265: 
   function wcslen: precondition 'valid_string_s' got status valid.
-[eva] wcslen.c:266: assertion got status valid.
-[eva] wcslen.c:270: Call to builtin wcslen
-[eva] wcslen.c:270: 
+[eva] tests/builtins/wcslen.c:266: assertion got status valid.
+[eva] tests/builtins/wcslen.c:270: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:270: 
   function wcslen: precondition 'valid_string_s' got status valid.
-[eva] wcslen.c:271: assertion got status valid.
-[eva] wcslen.c:269: starting to merge loop iterations
-[eva] wcslen.c:270: Call to builtin wcslen
-[eva] wcslen.c:270: Call to builtin wcslen
-[eva] wcslen.c:270: Call to builtin wcslen
-[eva] wcslen.c:270: Call to builtin wcslen
-[eva] wcslen.c:277: Call to builtin wcslen
-[eva:alarm] wcslen.c:277: Warning: 
+[eva] tests/builtins/wcslen.c:271: assertion got status valid.
+[eva] tests/builtins/wcslen.c:269: starting to merge loop iterations
+[eva] tests/builtins/wcslen.c:270: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:270: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:270: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:270: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:277: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:277: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:278: assertion got status valid.
+[eva] tests/builtins/wcslen.c:278: assertion got status valid.
 [eva] Recording results for misc
 [eva] Done for function misc
 [eva] computing for function bitfields <- main.
-  Called from wcslen.c:345.
-[eva] wcslen.c:140: Call to builtin wcslen
-[eva:alarm] wcslen.c:140: Warning: 
+  Called from tests/builtins/wcslen.c:376.
+[eva] tests/builtins/wcslen.c:140: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:140: Warning: 
   function wcslen: precondition 'valid_string_s' got status invalid.
 [eva] Recording results for bitfields
 [eva] Done for function bitfields
 [eva] computing for function bitfields2 <- main.
-  Called from wcslen.c:346.
-[eva] wcslen.c:155: Call to builtin wcslen
-[eva] wcslen.c:155: 
+  Called from tests/builtins/wcslen.c:377.
+[eva] tests/builtins/wcslen.c:155: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:155: 
   function wcslen: precondition 'valid_string_s' got status valid.
-[eva] wcslen.c:156: assertion got status valid.
+[eva] tests/builtins/wcslen.c:156: assertion got status valid.
 [eva] Recording results for bitfields2
 [eva] Done for function bitfields2
 [eva] computing for function escaping <- main.
-  Called from wcslen.c:347.
-[eva:alarm] wcslen.c:222: Warning: 
+  Called from tests/builtins/wcslen.c:378.
+[eva:alarm] tests/builtins/wcslen.c:222: Warning: 
   pointer downcast. assert (unsigned int)(&x) ≤ 2147483647;
-[eva:alarm] wcslen.c:222: Warning: 
+[eva:alarm] tests/builtins/wcslen.c:222: Warning: 
   pointer downcast. assert (unsigned int)(&x) ≤ 2147483647;
-[eva:alarm] wcslen.c:222: Warning: 
+[eva:alarm] tests/builtins/wcslen.c:222: Warning: 
   pointer downcast. assert (unsigned int)(&x) ≤ 2147483647;
-[eva:alarm] wcslen.c:222: Warning: 
+[eva:alarm] tests/builtins/wcslen.c:222: Warning: 
   pointer downcast. assert (unsigned int)(&x) ≤ 2147483647;
-[eva:locals-escaping] wcslen.c:222: Warning: 
+[eva:locals-escaping] tests/builtins/wcslen.c:222: Warning: 
   locals {x} escaping the scope of a block of escaping through s
-[eva] wcslen.c:225: Call to builtin wcslen
-[eva:alarm] wcslen.c:225: Warning: 
+[eva] tests/builtins/wcslen.c:225: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:225: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:226: assertion got status valid.
-[eva] wcslen.c:228: Call to builtin wcslen
-[eva] wcslen.c:228: 
+[eva] tests/builtins/wcslen.c:226: assertion got status valid.
+[eva] tests/builtins/wcslen.c:228: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:228: 
   function wcslen: precondition 'valid_string_s' got status valid.
-[eva] wcslen.c:229: assertion got status valid.
+[eva] tests/builtins/wcslen.c:229: assertion got status valid.
 [eva] Recording results for escaping
 [eva] Done for function escaping
 [eva] computing for function big_array <- main.
-  Called from wcslen.c:348.
-[eva:alarm] wcslen.c:287: Warning: out of bounds write. assert \valid(p);
-[eva:alarm] wcslen.c:291: Warning: out of bounds write. assert \valid(p);
-[eva:alarm] wcslen.c:294: Warning: out of bounds write. assert \valid(p);
-[eva] wcslen.c:301: Call to builtin wcslen
-[eva:alarm] wcslen.c:301: Warning: 
+  Called from tests/builtins/wcslen.c:379.
+[eva:alarm] tests/builtins/wcslen.c:287: Warning: 
+  out of bounds write. assert \valid(p);
+[eva:alarm] tests/builtins/wcslen.c:291: Warning: 
+  out of bounds write. assert \valid(p);
+[eva:alarm] tests/builtins/wcslen.c:294: Warning: 
+  out of bounds write. assert \valid(p);
+[eva] tests/builtins/wcslen.c:301: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:301: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:302: Call to builtin wcslen
-[eva:alarm] wcslen.c:302: Warning: 
+[eva] tests/builtins/wcslen.c:302: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:302: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:303: Call to builtin wcslen
-[eva:alarm] wcslen.c:303: Warning: 
+[eva] tests/builtins/wcslen.c:303: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:303: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:304: Frama_C_show_each: {0}, {0}, {0}
-[eva] wcslen.c:306: Call to builtin wcslen
-[eva:alarm] wcslen.c:306: Warning: 
+[eva] tests/builtins/wcslen.c:304: Frama_C_show_each: {0}, {0}, {0}
+[eva] tests/builtins/wcslen.c:306: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:306: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:307: Call to builtin wcslen
-[eva:alarm] wcslen.c:307: Warning: 
+[eva] tests/builtins/wcslen.c:307: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:307: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:308: Call to builtin wcslen
-[eva:alarm] wcslen.c:308: Warning: 
+[eva] tests/builtins/wcslen.c:308: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:308: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
-[eva] wcslen.c:309: Frama_C_show_each: {0}, {0}, {0}
+[eva] tests/builtins/wcslen.c:309: Frama_C_show_each: {0}, {0}, {0}
 [eva] Recording results for big_array
 [eva] Done for function big_array
 [eva] computing for function negative_offsets <- main.
-  Called from wcslen.c:349.
-[eva] wcslen.c:314: starting to merge loop iterations
+  Called from tests/builtins/wcslen.c:380.
+[eva] tests/builtins/wcslen.c:314: starting to merge loop iterations
 [eva] computing for function Frama_C_interval <- negative_offsets <- main.
-  Called from wcslen.c:318.
-[eva] wcslen.c:318: 
+  Called from tests/builtins/wcslen.c:318.
+[eva] tests/builtins/wcslen.c:318: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] wcslen.c:319: Call to builtin wcslen
-[eva:alarm] wcslen.c:319: Warning: 
+[eva] tests/builtins/wcslen.c:319: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:319: Warning: 
   function wcslen: precondition 'valid_string_s' got status invalid.
 [eva] computing for function Frama_C_interval <- negative_offsets <- main.
-  Called from wcslen.c:322.
-[eva] wcslen.c:322: 
+  Called from tests/builtins/wcslen.c:322.
+[eva] tests/builtins/wcslen.c:322: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] wcslen.c:323: Call to builtin wcslen
-[eva:alarm] wcslen.c:323: Warning: 
+[eva] tests/builtins/wcslen.c:323: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:323: Warning: 
   function wcslen: precondition 'valid_string_s' got status invalid.
 [eva] computing for function Frama_C_interval <- negative_offsets <- main.
-  Called from wcslen.c:325.
-[eva] wcslen.c:325: 
+  Called from tests/builtins/wcslen.c:325.
+[eva] tests/builtins/wcslen.c:325: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] wcslen.c:326: Call to builtin wcslen
-[eva:alarm] wcslen.c:326: Warning: 
+[eva] tests/builtins/wcslen.c:326: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:326: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
 [eva] computing for function Frama_C_interval <- negative_offsets <- main.
-  Called from wcslen.c:327.
-[eva] wcslen.c:327: 
+  Called from tests/builtins/wcslen.c:327.
+[eva] tests/builtins/wcslen.c:327: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] wcslen.c:328: Call to builtin wcslen
-[eva:alarm] wcslen.c:328: Warning: 
+[eva] tests/builtins/wcslen.c:328: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:328: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
 [eva] computing for function Frama_C_interval <- negative_offsets <- main.
-  Called from wcslen.c:329.
-[eva] wcslen.c:329: 
+  Called from tests/builtins/wcslen.c:329.
+[eva] tests/builtins/wcslen.c:329: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] wcslen.c:330: Call to builtin wcslen
-[eva:alarm] wcslen.c:330: Warning: 
+[eva] tests/builtins/wcslen.c:330: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:330: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
 [eva] computing for function Frama_C_interval <- negative_offsets <- main.
-  Called from wcslen.c:331.
-[eva] wcslen.c:331: 
+  Called from tests/builtins/wcslen.c:331.
+[eva] tests/builtins/wcslen.c:331: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] wcslen.c:333: Call to builtin wcslen
-[eva:alarm] wcslen.c:333: Warning: 
+[eva] tests/builtins/wcslen.c:333: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:333: Warning: 
   function wcslen: precondition 'valid_string_s' got status unknown.
 [eva] Recording results for negative_offsets
 [eva] Done for function negative_offsets
+[eva] computing for function misaligned_string <- main.
+  Called from tests/builtins/wcslen.c:381.
+[eva] tests/builtins/wcslen.c:345: assertion got status valid.
+[eva] tests/builtins/wcslen.c:346: Call to builtin wcslen
+[eva] tests/builtins/wcslen.c:346: 
+  function wcslen: precondition 'valid_string_s' got status valid.
+[eva] computing for function Frama_C_interval <- misaligned_string <- main.
+  Called from tests/builtins/wcslen.c:350.
+[eva] tests/builtins/wcslen.c:350: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva:alarm] tests/builtins/wcslen.c:351: Warning: 
+  out of bounds write. assert \valid((char *)((wchar_t *)b) + i);
+[eva:alarm] tests/builtins/wcslen.c:352: Warning: assertion got status unknown.
+[eva] tests/builtins/wcslen.c:353: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:353: Warning: 
+  function wcslen: precondition 'valid_string_s' got status unknown.
+[eva:alarm] tests/builtins/wcslen.c:361: Warning: assertion got status unknown.
+[eva] tests/builtins/wcslen.c:362: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:362: Warning: 
+  function wcslen: precondition 'valid_string_s' got status unknown.
+[eva] tests/builtins/wcslen.c:365: Call to builtin wcslen
+[eva:alarm] tests/builtins/wcslen.c:365: Warning: 
+  function wcslen: precondition 'valid_string_s' got status invalid.
+[eva] Recording results for misaligned_string
+[eva] Done for function misaligned_string
 [eva] Recording results for main
 [eva] done for function main
 [scope:rm_asserts] removing 3 assertion(s)
@@ -401,6 +431,24 @@
    [1..3] ∈ ESCAPINGADDR
   z1 ∈ {0}
   z2 ∈ {0}
+[eva:final-states] Values at end of function misaligned_string:
+  Frama_C_entropy_source ∈ [--..--]
+  a[0][bits 0 to 7] ∈ {1}
+   [0][bits 8 to 31] ∈ {0}
+   [1] ∈ {1}
+   [2] ∈ {0}
+  a_length ∈ {2}
+  b[0..9999999]# ∈ {0; 17} repeated %8 
+  i ∈ [0..39999999]
+  b_length ∈ [0..9999999]
+  c[0][bits 0 to 7] ∈ {0}
+   {[0][bits 8 to 31]#; [1][bits 0 to 7]#} ∈ {1}
+   {[1][bits 8 to 31]#; [2][bits 0 to 7]#} ∈ {2}
+   {[2][bits 8 to 31]; [3][bits 0 to 7]} ∈ {0}
+   {[3][bits 8 to 31]#; [4][bits 0 to 7]#} ∈ {4}
+   [4][bits 8 to 31] ∈ {0}
+  p ∈ {{ &c + {1} }}
+  c_length ∈ {2}
 [eva:final-states] Values at end of function misc:
   Frama_C_entropy_source ∈ [--..--]
   loc_str ∈ {{ L"Bonjour Monde\n" }}
@@ -520,9 +568,11 @@
 [from] Done for function bitfields2
 [from] Computing for function escaping
 [from] Done for function escaping
-[from] Computing for function misc
-[from] Computing for function Frama_C_interval <-misc
+[from] Computing for function misaligned_string
+[from] Computing for function Frama_C_interval <-misaligned_string
 [from] Done for function Frama_C_interval
+[from] Done for function misaligned_string
+[from] Computing for function misc
 [from] Done for function misc
 [from] Computing for function negative_offsets
 [from] Done for function negative_offsets
@@ -556,7 +606,8 @@
                non_terminated2[2..3]; empty_or_uninitialized[0];
                uninitialized[0]; s[0..1]; t[0..3]; s; s; a[3..99]; a[3..99];
                s[0..3]; loc_char_array[0..4]; x[0..3]; maybe_init[0..1];
-               t[0..999999]; u[0..199]; r[0..200]; buf[0..99];
+               t[0..999999]; u[0..199]; r[0..200]; buf[0..99]; a[0..2];
+               b[0..9999999]; c{[0][bits 8 to 31]; [1..3]; [4][bits 0 to 7]};
                L"Hello World\n"[bits 0 to 415];
                L"abc\000\000\000abc"[bits 0 to 319]; L""; L"a"[bits 0 to 63];
                L"aa"[bits 0 to 95]; L"aaa"[bits 0 to 127];
@@ -578,6 +629,8 @@
   NO EFFECTS
 [from] Function escaping:
   NO EFFECTS
+[from] Function misaligned_string:
+  Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
 [from] Function misc:
   Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
 [from] Function negative_offsets:
@@ -616,6 +669,11 @@
     s[0..3]; z1; tmp; z2; tmp_0
 [inout] Inputs for function escaping:
     nondet
+[inout] Out (internal) for function misaligned_string:
+    Frama_C_entropy_source; a[0..2]; a_length; b[0..9999999]; i; b_length;
+    c[0..4]; p; c_length
+[inout] Inputs for function misaligned_string:
+    Frama_C_entropy_source; nondet
 [inout] Out (internal) for function misc:
     Frama_C_entropy_source; loc_str; loc_char_array[3]; sz1; sz2; sz3; 
     sz4; sz5; sz6; sz7; sz8; x[0..3]; z[0..3]; i; str; s1; tmp; s2; tmp_0; 
diff --git a/tests/builtins/realloc.c b/tests/builtins/realloc.c
index 77b69e12e8cb4c541f63607aa0e74f438c74bb10..bb11b50a7a742bc565e774e73a1fb06614a3c025 100644
--- a/tests/builtins/realloc.c
+++ b/tests/builtins/realloc.c
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: +"-slevel 10 -eva-alloc-builtin by_stack -eva-warn-copy-indeterminate @all"
+   STDOPT: +"-eva-slevel 10 -eva-alloc-builtin by_stack -eva-warn-copy-indeterminate @all"
 */
 
 #include <stdlib.h>
diff --git a/tests/builtins/realloc2.c b/tests/builtins/realloc2.c
index 6614f80f06f487e9e7e554c4f8bbb3651c1ccb46..3636bd1ea2aabd007dea12859d0cdc44c069b87e 100644
--- a/tests/builtins/realloc2.c
+++ b/tests/builtins/realloc2.c
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: #"-eva-mlevel 0 -inout-callwise -inout-no-print "
+   STDOPT: #"-eva-mlevel 0 -inout-no-print "
 */
 #include <stdlib.h>
 
diff --git a/tests/builtins/realloc_multiple.c b/tests/builtins/realloc_multiple.c
index 1e5825544465ea4e4bc1ffee2f459fdbb5a5ef05..f5ceb25223f231da7434d019c3ddbca738ff6925 100644
--- a/tests/builtins/realloc_multiple.c
+++ b/tests/builtins/realloc_multiple.c
@@ -1,6 +1,6 @@
 /* run.config*
-   STDOPT: +"-slevel 10 -eva-alloc-builtin fresh -eva-malloc-functions malloc,realloc"
-   STDOPT: +"-slevel 10 -eva-alloc-builtin fresh -eva-malloc-functions malloc,realloc -eva-alloc-returns-null"
+   STDOPT: +"-eva-slevel 10 -eva-alloc-builtin fresh -eva-alloc-functions malloc,realloc"
+   STDOPT: +"-eva-slevel 10 -eva-alloc-builtin fresh -eva-alloc-functions malloc,realloc -eva-alloc-returns-null"
 */
 #include <stdlib.h>
 #include "__fc_builtin.h"
diff --git a/tests/builtins/vla.c b/tests/builtins/vla.c
index 1bfefb182d06e2679293d8d33e3554699c84ebdf..8e8c0eaaad38f34dc565f043ee5dccb8aa962b0a 100644
--- a/tests/builtins/vla.c
+++ b/tests/builtins/vla.c
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: #"-slevel 10 -eva-builtins-auto"
+   STDOPT: #"-eva-slevel 10 -eva-builtins-auto"
 */
 
 void f(int i) {
diff --git a/tests/builtins/wcslen.c b/tests/builtins/wcslen.c
index dea7cd1aad9aba23f6b081452fb1dee572a146fb..183e2f2a2daac8ffd817e7afe4ae3beb968bc4c9 100644
--- a/tests/builtins/wcslen.c
+++ b/tests/builtins/wcslen.c
@@ -335,6 +335,37 @@ void negative_offsets() {
   wchar_t dest[100 * 2];
 }
 
+#define MAX 10000000
+
+void misaligned_string () {
+  // Read an offsetmap with a value range smaller than the read characters.
+  wchar_t a[3] = {0};
+  *(char *)a = 1;
+  a[1] = 1;
+  //@ assert valid_read_wstring(&a[0]);
+  unsigned int a_length = wcslen(&a[0]);
+  /* Read an offsetmap with repeated values smaller than the searched
+     characters: test a performance issue. */
+  wchar_t b[MAX] = {0};
+  int i = Frama_C_interval(0, MAX * 4);
+  *((char *)b + i) = (char)17;
+  //@ assert valid_read_wstring(&b[0]);
+  unsigned int b_length = wcslen(&b[0]);
+  /* Read an offsetmap through a misaligned pointer. */
+  wchar_t c[5] = {0};
+  wchar_t *p = (wchar_t *)( (char *)c + 1);
+  *p = 1;
+  *(p+1) = 2;
+  *(p+2) = 0; // If we accept the string pointed by p, its length should be 2.
+  *(p+3) = 4;
+  //@ assert valid_read_wstring(p);
+  unsigned int c_length = wcslen(p);
+  if (nondet) {
+    *(p+2) = 3; // The string pointed by p cannot be valid here.
+    c_length = wcslen(p);
+  }
+}
+
 int main (int c) {
   small_sets();
   zero_termination();
@@ -347,5 +378,6 @@ int main (int c) {
   escaping();
   big_array();
   negative_offsets();
+  misaligned_string();
   return 0;
 }
diff --git a/tests/cil/comments.c b/tests/cil/comments.c
index ca92ebad7fb3cf6a8540485f03862a2634ddecd4..ed0252e15d2097202b8de8897ba5d035f0a5b774 100644
--- a/tests/cil/comments.c
+++ b/tests/cil/comments.c
@@ -15,12 +15,14 @@ void g() {
 int bts_2176() {
   int r=0;
   int i=0;
-  /* comment 1 */
+  /* comment
+     1 */
   r = /* comment 2 */ 1;
 
   //@ loop pragma UNROLL 10;
   for(i=0; i<10; i++) {
     r += 1;
   }
+  /* comment 3 */
   return r;
 }
diff --git a/tests/cil/oracle/comments.res.oracle b/tests/cil/oracle/comments.res.oracle
index ba13dfb3830a67ee79b978481896e27ab1ff36eb..fd7b14f4298869cf6f9b582765cbae96ae941a3a 100644
--- a/tests/cil/oracle/comments.res.oracle
+++ b/tests/cil/oracle/comments.res.oracle
@@ -1,23 +1,23 @@
 [kernel] Parsing comments.c (with preprocessing)
 /* Generated by Frama-C */
-/*  run.config
+/* run.config
    OPT: -print -keep-comments
- */
-/*  ABC  */
+*/
+// ABC 
 void f(void)
 {
   return;
 }
 
-/* ABD/*FOO*/ */
-/* ABC */
-/* ABC
-      */
+//ABD/*FOO*/
+//ABC
+/*ABC
+     */
 /*@ requires \true; */
 void g(void)
 {
   /*@ ghost int x = 0; */
-  /*  ghost_comment  */
+  // ghost_comment 
   return;
 }
 
@@ -25,8 +25,9 @@ int bts_2176(void)
 {
   int r = 0;
   int i = 0;
-  /*  comment 1  */
-  /*  comment 2  */
+  /* comment
+     1 */
+  // comment 2 
   r = 1;
   i = 0;
   if (! (i < 10)) goto unrolling_2_loop;
@@ -76,6 +77,7 @@ int bts_2176(void)
     i ++;
   }
   unrolling_2_loop: ;
+  // comment 3 
   return r;
 }
 
diff --git a/tests/fc_script/oracle/list_files.res b/tests/fc_script/oracle/list_files.res
index 01faeac15b158d7bc7adcc4a2573ee4f9f772daa..6ccc70819c87975dce26bc0351408d27cceb1c0a 100644
--- a/tests/fc_script/oracle/list_files.res
+++ b/tests/fc_script/oracle/list_files.res
@@ -1,9 +1,30 @@
+# Paths as seen by a makefile inside subdirectory '.frama-c':
 SRCS=\
+<<<<<<< HEAD
 main.c \
 main2.c \
 main3.c \
+||||||| 362083a770
+tests/fc_script/main.c \
+tests/fc_script/main2.c \
+tests/fc_script/main3.c \
+=======
+../tests/fc_script/main.c \
+../tests/fc_script/main2.c \
+../tests/fc_script/main3.c \
+>>>>>>> origin/master
 
 
+<<<<<<< HEAD
 # Possible definition of main function in the following file(s):
 main.c
 main3.c
+||||||| 362083a770
+# Possible definition of main function in the following file(s):
+tests/fc_script/main.c
+tests/fc_script/main3.c
+=======
+# Possible definition of main function in the following file(s), as seen from '.frama-c':
+../tests/fc_script/main.c
+../tests/fc_script/main3.c
+>>>>>>> origin/master
diff --git a/tests/float/const3.i b/tests/float/const3.i
index e4bbf48c12d42cb84187e6d84c89c9c3d513f7ee..4e06fb90429a435a24a5ca0d21bbe6d7bb7a307c 100644
--- a/tests/float/const3.i
+++ b/tests/float/const3.i
@@ -1,6 +1,6 @@
 /* run.config*
   STDOPT: #"-warn-decimal-float all"
-  STDOPT: #"-warn-decimal-float all -all-rounding-modes-constants -float-hex"
+  STDOPT: #"-warn-decimal-float all -eva-all-rounding-modes-constants -float-hex"
 */
 
 double f1 = 1e-40f;
diff --git a/tests/float/const4.i b/tests/float/const4.i
index 0a2be77cb0a4cd47298e3221d20b0e40eba2d0dc..605bad01de2fd3490a144ba6fc2f01c551ed731f 100644
--- a/tests/float/const4.i
+++ b/tests/float/const4.i
@@ -1,6 +1,6 @@
 /* run.config*
   STDOPT: #"-warn-decimal-float all"
-  STDOPT: #"-warn-decimal-float all -all-rounding-modes-constants"
+  STDOPT: #"-warn-decimal-float all -eva-all-rounding-modes-constants"
 */
 
 double f1 = 3.4e38f;
diff --git a/tests/float/dr.i b/tests/float/dr.i
index 8c2a6c88e235ce2ee009b2016a1176d877dcfe37..b3322030be3ae533c195c498cb48389105283c45 100644
--- a/tests/float/dr.i
+++ b/tests/float/dr.i
@@ -1,7 +1,7 @@
 /* run.config*
   STDOPT:
   STDOPT: #"-float-hex"
-  STDOPT: #"-all-rounding-modes-constants"
+  STDOPT: #"-eva-all-rounding-modes-constants"
 */
 
 float big  = 100e30f;
diff --git a/tests/float/extract_bits.i b/tests/float/extract_bits.i
index 2f1c3b541cf97a2988bad93da7b58dca27a567bf..083727447193a64d526f1560c853c0a34b6c084e 100644
--- a/tests/float/extract_bits.i
+++ b/tests/float/extract_bits.i
@@ -1,6 +1,6 @@
 /* run.config*
-  OPT: -eva @EVA_CONFIG@ -slevel 10 -big-ints-hex 0 -machdep ppc_32 -float-normal -warn-decimal-float all
-  OPT: -eva @EVA_CONFIG@ -slevel 10 -big-ints-hex 0 -machdep x86_32 -float-normal -warn-decimal-float all
+  OPT: -eva @EVA_CONFIG@ -eva-slevel 10 -big-ints-hex 0 -machdep ppc_32 -float-normal -warn-decimal-float all
+  OPT: -eva @EVA_CONFIG@ -eva-slevel 10 -big-ints-hex 0 -machdep x86_32 -float-normal -warn-decimal-float all
 */
 
 float f = 3.14;
diff --git a/tests/float/nonlin.c b/tests/float/nonlin.c
index 4d258f382ae1e2e040e0e55988c3b6a782ca1b64..d210fe4a31538f2594517d4668c813392b557e6b 100644
--- a/tests/float/nonlin.c
+++ b/tests/float/nonlin.c
@@ -1,10 +1,10 @@
 /* run.config*
-   OPT: -eva-msg-key nonlin -slevel 30 -eva @EVA_CONFIG@ -cpp-extra-args="-DFLOAT=double" -float-hex -journal-disable -eva-subdivide-non-linear 0
-   OPT: -eva-msg-key nonlin -slevel 30 -eva @EVA_CONFIG@ -cpp-extra-args="-DFLOAT=double" -float-hex -journal-disable -eva-subdivide-non-linear 10
-   OPT: -eva-msg-key nonlin -slevel 30 -eva @EVA_CONFIG@ -cpp-extra-args="-DFLOAT=double" -float-hex -journal-disable -eva-subdivide-non-linear 10 -warn-special-float none
-   OPT: -eva-msg-key nonlin -slevel 30 -eva @EVA_CONFIG@ -cpp-extra-args="-DFLOAT=float" -float-hex -journal-disable -eva-subdivide-non-linear 0
-   OPT: -eva-msg-key nonlin -slevel 30 -eva @EVA_CONFIG@ -cpp-extra-args="-DFLOAT=float" -float-hex -journal-disable -eva-subdivide-non-linear 10
-   OPT: -eva-msg-key nonlin -slevel 30 -eva @EVA_CONFIG@ -cpp-extra-args="-DFLOAT=float" -float-hex -journal-disable -eva-subdivide-non-linear 10 -warn-special-float none
+   OPT: -eva-msg-key nonlin -eva-slevel 30 -eva @EVA_CONFIG@ -cpp-extra-args="-DFLOAT=double" -float-hex -journal-disable -eva-subdivide-non-linear 0
+   OPT: -eva-msg-key nonlin -eva-slevel 30 -eva @EVA_CONFIG@ -cpp-extra-args="-DFLOAT=double" -float-hex -journal-disable -eva-subdivide-non-linear 10
+   OPT: -eva-msg-key nonlin -eva-slevel 30 -eva @EVA_CONFIG@ -cpp-extra-args="-DFLOAT=double" -float-hex -journal-disable -eva-subdivide-non-linear 10 -warn-special-float none
+   OPT: -eva-msg-key nonlin -eva-slevel 30 -eva @EVA_CONFIG@ -cpp-extra-args="-DFLOAT=float" -float-hex -journal-disable -eva-subdivide-non-linear 0
+   OPT: -eva-msg-key nonlin -eva-slevel 30 -eva @EVA_CONFIG@ -cpp-extra-args="-DFLOAT=float" -float-hex -journal-disable -eva-subdivide-non-linear 10
+   OPT: -eva-msg-key nonlin -eva-slevel 30 -eva @EVA_CONFIG@ -cpp-extra-args="-DFLOAT=float" -float-hex -journal-disable -eva-subdivide-non-linear 10 -warn-special-float none
 */
 
 #include "__fc_builtin.h"
diff --git a/tests/float/precise_cos_sin.c b/tests/float/precise_cos_sin.c
index 19fde982cfb2f8367bf5c8b2c201a61dec312b8b..f6e6f36e9077b0036d3ebd983c20cc6a0e5f4eb0 100644
--- a/tests/float/precise_cos_sin.c
+++ b/tests/float/precise_cos_sin.c
@@ -1,5 +1,5 @@
 /* run.config*
-   OPT: -eva @EVA_CONFIG@ -slevel 1000 -journal-disable -float-normal
+   OPT: -eva @EVA_CONFIG@ -eva-slevel 1000 -journal-disable -float-normal
 */
 
 #include <__fc_builtin.h>
diff --git a/tests/float/round10d.i b/tests/float/round10d.i
index a11f0172affbc62e6d6e3c270aa8887463b70d62..1d6ebe39de506c8e31fe6ea441ba25cfbd408cbd 100644
--- a/tests/float/round10d.i
+++ b/tests/float/round10d.i
@@ -1,5 +1,5 @@
 /* run.config*
-   OPT: -eva @EVA_CONFIG@ -float-normal -journal-disable -no-results
+   OPT: -eva @EVA_CONFIG@ -float-normal -journal-disable -eva-no-results
 
 */
 int main()
diff --git a/tests/float/some.c b/tests/float/some.c
index d7713ce8d71d088a7ba48407e83dfc02d1901648..8eb3f38ea73da66b5c52a6779382e274a9a6a3ee 100644
--- a/tests/float/some.c
+++ b/tests/float/some.c
@@ -1,6 +1,6 @@
 /* run.config*
-   OPT: -eva-show-slevel 10 -slevel 100 -eva @EVA_CONFIG@ -cpp-extra-args="-DFLOAT=double -DN=55" -float-normal -journal-disable -no-results
-   OPT: -slevel 100 -eva @EVA_CONFIG@ -cpp-extra-args="-DFLOAT=float -DN=26"  -float-normal -journal-disable -no-results
+   OPT: -eva-show-slevel 10 -eva-slevel 100 -eva @EVA_CONFIG@ -cpp-extra-args="-DFLOAT=double -DN=55" -float-normal -journal-disable -eva-no-results
+   OPT: -eva-slevel 100 -eva @EVA_CONFIG@ -cpp-extra-args="-DFLOAT=float -DN=26"  -float-normal -journal-disable -eva-no-results
 */
 
 FLOAT t[N] = { 1. } ;
diff --git a/tests/float/sqrt.c b/tests/float/sqrt.c
index 02a8d3995c82eddf9ff4ccc105a5652f10113a7a..da6743b0866b14d00ea51c2886806bc546008c96 100644
--- a/tests/float/sqrt.c
+++ b/tests/float/sqrt.c
@@ -1,6 +1,6 @@
 /* run.config*
-   STDOPT: #"-slevel 10 -big-ints-hex 257"
-   STDOPT: #"-slevel 10 -big-ints-hex 257 -machdep ppc_32"
+   STDOPT: #"-eva-slevel 10 -big-ints-hex 257"
+   STDOPT: #"-eva-slevel 10 -big-ints-hex 257 -machdep ppc_32"
 */
 
 #include <math.h>
diff --git a/tests/float/widen.c b/tests/float/widen.c
index 8ad29d4d152106a1e0431b2e410abdd38a783694..c685b88be02d1fea3968895deb8f5587c021a88f 100644
--- a/tests/float/widen.c
+++ b/tests/float/widen.c
@@ -1,6 +1,6 @@
 /* run.config*
-  STDOPT: #"-warn-special-float non-finite -wlevel 3"
-  STDOPT: #"-warn-special-float none -wlevel 3"
+  STDOPT: #"-warn-special-float non-finite -eva-widening-delay 3"
+  STDOPT: #"-warn-special-float none -eva-widening-delay 3"
 */
 
 volatile int rand;
diff --git a/tests/idct/ieee_1180_1990.c b/tests/idct/ieee_1180_1990.c
index e4690c3aa39e85a66b1d11be0880117ae1c40e28..15d4850166ebdf3694cc784ce5243c2939b1f77e 100644
--- a/tests/idct/ieee_1180_1990.c
+++ b/tests/idct/ieee_1180_1990.c
@@ -1,6 +1,6 @@
 /* run.config*
    GCC:
-   STDOPT: +"-eva-msg-key=summary -load-module report,scope,variadic -float-normal -no-warn-signed-overflow idct.c -remove-redundant-alarms -eva-memexec -eva-builtin sqrt:Frama_C_sqrt,cos:Frama_C_cos -then -report -report-print-properties"
+   STDOPT: +"-eva-msg-key=summary -load-module report,scope,variadic -float-normal -no-warn-signed-overflow idct.c -eva-remove-redundant-alarms -eva-memexec -eva-builtin sqrt:Frama_C_sqrt,cos:Frama_C_cos -then -report -report-print-properties"
 */
 /* IEEE_1180_1990: a testbed for IDCT accuracy
  * Copyright (C) 2001  Renaud Pacalet
diff --git a/tests/impact/alias.i b/tests/impact/alias.i
index f1cc091ed52634e22d631e54007aef47f741febe..1b4edfb05d19133efb9ed8b7154bdd0dce8041cd 100644
--- a/tests/impact/alias.i
+++ b/tests/impact/alias.i
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: +"-impact-pragma f" +"-lib-entry" +"-main f" +"-remove-redundant-alarms"
+   STDOPT: +"-impact-pragma f" +"-lib-entry" +"-main f" +"-eva-remove-redundant-alarms"
    */
 
 int P,c;
diff --git a/tests/jcdb/compile_commands.json b/tests/jcdb/compile_commands.json
index 52a0f039c5ba20d81bf77a3dd803b8579d285c75..0592cf2b0799160bb9d83ce1b7aa103c2fc15b7c 100644
--- a/tests/jcdb/compile_commands.json
+++ b/tests/jcdb/compile_commands.json
@@ -7,12 +7,12 @@
       "command": "g++ -DDUPLICATE_FLAGS_THAT_WILL_BE_OVERWRITTEN",
       "file": "jcdb.c"
     },
-    { "directory": ".",
-      "command": "/usr/bin/clang++ -D'MSG=\"a \\\" \\\"b\"'  -D'SINGLE_DOUBLE(a)=\"a \\\"with spaces and	tab \"' -DSOMEDEF=\"With spaces, quotes and \\-es.\" -D\"DOUBLE_SINGLE(a)=a \\\"macro with spaces and non-escaped \\\\'\\\"\"   -DEMPTY=''  -DEMPTY2= -DTEST=42	 -D'MACRO_FOR_INCR(s)=s+1' -DTOUNDEF -UTOUNDEF",
+    {
+      "command": "testing entry without 'directory' key -DFLAG_TO_BE_FORGOTTEN",
       "file": "jcdb.c"
     },
-    {
-      "command": "testing entry without 'directory' key",
+    { "directory": ".",
+      "command": "/usr/bin/clang++ -D'MSG=\"a \\\" \\\"b\"'  -D'SINGLE_DOUBLE(a)=\"a \\\"with spaces and	tab \"' -DSOMEDEF=\"With spaces, quotes and \\-es.\" -D\"DOUBLE_SINGLE(a)=a \\\"macro with spaces and non-escaped \\\\'\\\"\"   -DEMPTY=''  -DEMPTY2= -DTEST=42	 -D'MACRO_FOR_INCR(s)=s+1' -DTOUNDEF -UTOUNDEF",
       "file": "jcdb.c"
     }
 ]
diff --git a/tests/jcdb/jcdb.ml b/tests/jcdb/jcdb.ml
index 4d0408048a1f47720c6605ccf9fdeb18669e8f57..d9163defa210d991acf8362bd59ac34d9f9c57ac 100644
--- a/tests/jcdb/jcdb.ml
+++ b/tests/jcdb/jcdb.ml
@@ -1,8 +1,8 @@
 let print_json () =
   Kernel.feedback
-    "Value of -json-compilation-database in %s is %s"
+    "Value of -json-compilation-database in %s is %a"
     (Project.get_name (Project.current()))
-    (Kernel.JsonCompilationDatabase.get())
+    Filepath.Normalized.pretty (Kernel.JsonCompilationDatabase.get())
 
 let run () =
   print_json ();
diff --git a/tests/jcdb/oracle/jcdb.0.res.oracle b/tests/jcdb/oracle/jcdb.0.res.oracle
index 8762d04786b37e6a73a2b32d0ad2a5a85d0ba852..c0f9c80895e5db9b5013eb9b9f574dc918f1f1ea 100644
--- a/tests/jcdb/oracle/jcdb.0.res.oracle
+++ b/tests/jcdb/oracle/jcdb.0.res.oracle
@@ -1,6 +1,14 @@
 [kernel:pp:compilation-db] Warning: 
+<<<<<<< HEAD
   found duplicate flags for 'jcdb.c', replacing old flags.
   Old flags no longer present: -D'MSG="a \" \"b"' -D'SINGLE_DOUBLE(a)="a \"with spaces and	tab "' -DSOMEDEF="With spaces, quotes and \-es." -D"DOUBLE_SINGLE(a)=a \"macro with spaces and non-escaped \\'\"" -DEMPTY='' -DEMPTY2= -DTEST=42 -D'MACRO_FOR_INCR(s)=s+1' -DTOUNDEF -UTOUNDEF
+||||||| 362083a770
+  found duplicate flags for 'tests/jcdb/jcdb.c', replacing old flags.
+  Old flags no longer present: -D'MSG="a \" \"b"' -D'SINGLE_DOUBLE(a)="a \"with spaces and	tab "' -DSOMEDEF="With spaces, quotes and \-es." -D"DOUBLE_SINGLE(a)=a \"macro with spaces and non-escaped \\'\"" -DEMPTY='' -DEMPTY2= -DTEST=42 -D'MACRO_FOR_INCR(s)=s+1' -DTOUNDEF -UTOUNDEF
+=======
+  found duplicate flags for 'tests/jcdb/jcdb.c', replacing old flags.
+  Old flags no longer present: -DFLAG_TO_BE_FORGOTTEN
+>>>>>>> origin/master
   New flags not previously present: -DDUPLICATE_FLAGS_THAT_WILL_BE_OVERWRITTEN
   (warn-once: no further messages from category 'pp:compilation-db' will be emitted)
 [kernel] Parsing jcdb.c (with preprocessing)
diff --git a/tests/jcdb/oracle/list_files.res b/tests/jcdb/oracle/list_files.res
index b868a08fc232c4dd8f4362cf8b28529a91a1619b..5c17aadf10b426723f8fe7c82db74dc33e6c2e8c 100644
--- a/tests/jcdb/oracle/list_files.res
+++ b/tests/jcdb/oracle/list_files.res
@@ -1,7 +1,24 @@
+# Paths as seen by a makefile inside subdirectory '.frama-c':
 SRCS=\
+<<<<<<< HEAD
 file_without_main.c \
 jcdb.c \
+||||||| 362083a770
+tests/jcdb/file_without_main.c \
+tests/jcdb/jcdb.c \
+=======
+../tests/jcdb/file_without_main.c \
+../tests/jcdb/jcdb.c \
+>>>>>>> origin/master
 
 
+<<<<<<< HEAD
 # Possible definition of main function in the following file(s):
 jcdb.c
+||||||| 362083a770
+# Possible definition of main function in the following file(s):
+tests/jcdb/jcdb.c
+=======
+# Possible definition of main function in the following file(s), as seen from '.frama-c':
+../tests/jcdb/jcdb.c
+>>>>>>> origin/master
diff --git a/tests/libc/check_const.ml b/tests/libc/check_const.ml
index 60f734a6e459c69be94b71a90bd1faad019d9f25..965f710a3caa345008a615bf2a99d4e4532a2f1c 100644
--- a/tests/libc/check_const.ml
+++ b/tests/libc/check_const.ml
@@ -21,7 +21,7 @@ let warn_if_not_const kf string typ vi loc =
         string Printer.pp_varinfo vi string
 
 let check_annot kf _ (a: identified_predicate) =
-  let p = a.ip_content.pred_content in
+  let p = (Logic_const.pred_of_id_pred a).pred_content in
   match p with
   | Pvalid (_, t) | Pvalid_read (_, t)
   | Papp ({l_var_info={lv_name=("valid_string"|"valid_read_string")}},
diff --git a/tests/libc/check_libc_naming_conventions.ml b/tests/libc/check_libc_naming_conventions.ml
index c7a991504950d391779f9761b7a51b4bb0a0d294..c928b21109bbdf51e6ef14a7d61d59db44b7fd73 100644
--- a/tests/libc/check_libc_naming_conventions.ml
+++ b/tests/libc/check_libc_naming_conventions.ml
@@ -58,21 +58,21 @@ let () =
             if Cil.hasAttribute "fc_stdlib" fun_attrs then begin
               Annotations.iter_behaviors (fun _emitter bhv ->
                   List.iter (fun ip ->
-                      let pred = ip.ip_content in
+                      let pred = Logic_const.pred_of_id_pred ip in
                       warn_if_unnamed "requires" pred;
                       check_initialized pred;
                       check_dangling pred;
                       check_separated pred;
                     ) bhv.b_requires;
                   List.iter (fun ip ->
-                      let pred = ip.ip_content in
+                      let pred = Logic_const.pred_of_id_pred ip in
                       warn_if_unnamed "assumes" pred;
                       check_initialized pred;
                       check_dangling pred;
                       check_separated pred;
                     ) bhv.b_assumes;
                   List.iter (fun (_termination, ip) ->
-                      let pred = ip.ip_content in
+                      let pred = Logic_const.pred_of_id_pred ip in
                       warn_if_unnamed "ensures" pred;
                       check_initialized pred;
                       check_dangling pred;
diff --git a/tests/libc/coverage.c b/tests/libc/coverage.c
index 42f6476d300167f9503ba91858f3132dcf79234d..4b7c6a400fe805792f8d0443e415b28bf0cd5b28 100644
--- a/tests/libc/coverage.c
+++ b/tests/libc/coverage.c
@@ -1,6 +1,6 @@
 /* run.config*
    DEPS: ../../../share/libc/string.c
-   OPT: -eva-no-builtins-auto @EVA_OPTIONS@ ../../share/libc/string.c -eva -slevel 6 -metrics-eva-cover -then -metrics-libc
+   OPT: -eva-no-builtins-auto @EVA_OPTIONS@ ../../share/libc/string.c -eva -eva-slevel 6 -metrics-eva-cover -then -metrics-libc
 */
 
 #include "string.h"
diff --git a/tests/libc/ctype.c b/tests/libc/ctype.c
index a874a223d2888bdcbd9b35573a073beae5a94a42..a54bd13b6a3e38d4186600899a89e5bdf886a15b 100644
--- a/tests/libc/ctype.c
+++ b/tests/libc/ctype.c
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: #"-slevel 4"
+   STDOPT: #"-eva-slevel 4"
 */
 #include <stdio.h>
 #include <ctype.h>
diff --git a/tests/libc/netdb_c.c b/tests/libc/netdb_c.c
index 6e8f905b5d80c9afc8f77fadc6e5de394469710c..c2f9a8c9d3440b2ab3533704693e336e39164350 100644
--- a/tests/libc/netdb_c.c
+++ b/tests/libc/netdb_c.c
@@ -1,5 +1,5 @@
 /*run.config
-  STDOPT: #"-eva-split-return auto -slevel 2"
+  STDOPT: #"-eva-split-return auto -eva-slevel 2"
 */
 // Extract based on Linux Programmer's Manual, GETADDRINFO(3) man page
 #include <sys/types.h>
diff --git a/tests/libc/oracle/fc_libc.0.res.oracle b/tests/libc/oracle/fc_libc.0.res.oracle
index da8dab5e4b96fc6d975f98e4e31f70f604dd4929..1cad0f40f8009f1882c3624147eb1079be4ac31c 100644
--- a/tests/libc/oracle/fc_libc.0.res.oracle
+++ b/tests/libc/oracle/fc_libc.0.res.oracle
@@ -41,7 +41,7 @@
    wcscpy (0 call); wcslen (2 calls); wcsncat (0 call); wcsncpy (0 call);
    wmemcpy (0 call); wmemset (0 call); 
   
-  Undefined functions (411)
+  Undefined functions (412)
   =========================
    FD_CLR (0 call); FD_ISSET (0 call); FD_SET (0 call); FD_ZERO (0 call);
    Frama_C_int_interval (0 call); Frama_C_long_interval (0 call);
@@ -73,17 +73,17 @@
    __va_openat_void (0 call); _exit (0 call); abort (0 call); accept (0 call);
    access (0 call); acos (0 call); acosf (0 call); acosh (0 call);
    acoshf (0 call); acoshl (0 call); acosl (0 call); alloca (0 call);
-   asin (0 call); asinf (0 call); asinl (0 call); at_quick_exit (0 call);
-   atan (0 call); atan2 (0 call); atan2f (0 call); atanf (0 call);
-   atanl (0 call); atexit (0 call); atof (0 call); atol (0 call);
-   atoll (0 call); basename (0 call); bind (0 call); bsearch (0 call);
-   bzero (0 call); ceil (0 call); ceilf (0 call); ceill (0 call);
-   cfgetispeed (0 call); cfgetospeed (0 call); cfsetispeed (0 call);
-   cfsetospeed (0 call); chdir (0 call); chown (0 call); chroot (0 call);
-   clearerr (0 call); clearerr_unlocked (0 call); clock (0 call);
-   clock_gettime (0 call); clock_nanosleep (0 call); close (0 call);
-   closedir (0 call); closelog (0 call); connect (0 call); cos (0 call);
-   cosf (0 call); cosl (0 call); creat (0 call); ctime (0 call);
+   asctime (0 call); asin (0 call); asinf (0 call); asinl (0 call);
+   at_quick_exit (0 call); atan (0 call); atan2 (0 call); atan2f (0 call);
+   atanf (0 call); atanl (0 call); atexit (0 call); atof (0 call);
+   atol (0 call); atoll (0 call); basename (0 call); bind (0 call);
+   bsearch (0 call); bzero (0 call); ceil (0 call); ceilf (0 call);
+   ceill (0 call); cfgetispeed (0 call); cfgetospeed (0 call);
+   cfsetispeed (0 call); cfsetospeed (0 call); chdir (0 call); chown (0 call);
+   chroot (0 call); clearerr (0 call); clearerr_unlocked (0 call);
+   clock (0 call); clock_gettime (0 call); clock_nanosleep (0 call);
+   close (0 call); closedir (0 call); closelog (0 call); connect (0 call);
+   cos (0 call); cosf (0 call); cosl (0 call); creat (0 call); ctime (0 call);
    difftime (0 call); dirname (0 call); div (0 call); drand48 (0 call);
    dup (0 call); dup2 (0 call); erand48 (0 call); execl (0 call);
    execle (0 call); execlp (0 call); execv (0 call); execve (0 call);
@@ -187,7 +187,7 @@
   Goto = 97
   Assignment = 459
   Exit point = 83
-  Function = 494
+  Function = 495
   Function call = 93
   Pointer dereferencing = 159
   Cyclomatic complexity = 296
diff --git a/tests/libc/oracle/fc_libc.1.res.oracle b/tests/libc/oracle/fc_libc.1.res.oracle
index 7478d2ee7e12f9da96552b273f06324e411df545..007338009ece3e9721aa93887a6f03121f729d0e 100644
--- a/tests/libc/oracle/fc_libc.1.res.oracle
+++ b/tests/libc/oracle/fc_libc.1.res.oracle
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
 [kernel] Parsing fc_libc.c (with preprocessing)
 [kernel] User Error: failed to run: gcc -E -C -I.  -I/home/bobot/Sources/frama-c/_build/install/default/share/frama-c/share/libc -D__FRAMAC__ -D__FC_MACHDEP_X86_32 -dD -nostdinc -m32 -o '/tmp/fc_libc.c48365b.i' '/home/bobot/Sources/frama-c/_build/default/result/fc_libc.c'
   this is possibly due to missing preprocessor flags;
@@ -6,3 +7,16342 @@
 [kernel] User Error: stopping on file "fc_libc.c" that has errors. Add '-kernel-msg-key pp'
   for preprocessing command.
 [kernel] Frama-C aborted: invalid user input.
+||||||| 362083a770
+[kernel] Parsing tests/libc/fc_libc.c (with preprocessing)
+/* Generated by Frama-C */
+typedef unsigned int size_t;
+struct __fc_fenv_t {
+   unsigned short __control_word ;
+   unsigned short __unused1 ;
+   unsigned short __status_word ;
+   unsigned short __unused2 ;
+   unsigned short __tags ;
+   unsigned short __unused3 ;
+   unsigned int __eip ;
+   unsigned short __cs_selector ;
+   unsigned int __opcode : 11 ;
+   unsigned int __unused4 : 5 ;
+   unsigned int __data_offset ;
+   unsigned short __data_selector ;
+   unsigned short __unused5 ;
+};
+typedef struct __fc_fenv_t fenv_t;
+typedef int wchar_t;
+typedef int ssize_t;
+typedef unsigned int gid_t;
+typedef unsigned int uid_t;
+typedef long off_t;
+typedef int pid_t;
+typedef unsigned int useconds_t;
+struct option {
+   char const *name ;
+   int has_arg ;
+   int *flag ;
+   int val ;
+};
+struct __fc_glob_t {
+   unsigned int gl_pathc ;
+   char **gl_pathv ;
+   unsigned int gl_offs ;
+   int gl_flags ;
+   void (*gl_closedir)(void *) ;
+   void *(*gl_readdir)(void *) ;
+   void *(*gl_opendir)(char const *) ;
+   int (*gl_lstat)(char const * __restrict , void * __restrict ) ;
+   int (*gl_stat)(char const * __restrict , void * __restrict ) ;
+};
+typedef struct __fc_glob_t glob_t;
+struct __fc_div_t {
+   int quot ;
+   int rem ;
+};
+typedef struct __fc_div_t div_t;
+struct __fc_ldiv_t {
+   long quot ;
+   long rem ;
+};
+typedef struct __fc_ldiv_t ldiv_t;
+struct __fc_lldiv_t {
+   long long quot ;
+   long long rem ;
+};
+typedef struct __fc_lldiv_t lldiv_t;
+typedef unsigned char uint8_t;
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+typedef unsigned int uintptr_t;
+typedef long long intmax_t;
+struct __fc_imaxdiv_t {
+   intmax_t quot ;
+   intmax_t rem ;
+};
+typedef struct __fc_imaxdiv_t imaxdiv_t;
+struct lconv {
+   char *decimal_point ;
+   char *thousands_sep ;
+   char *grouping ;
+   char *int_curr_symbol ;
+   char *currency_symbol ;
+   char *mon_decimal_point ;
+   char *mon_thousands_sep ;
+   char *mon_grouping ;
+   char *positive_sign ;
+   char *negative_sign ;
+   char int_frac_digits ;
+   char frac_digits ;
+   char p_cs_precedes ;
+   char p_sep_by_space ;
+   char n_cs_precedes ;
+   char n_sep_by_space ;
+   char p_sign_posn ;
+   char n_sign_posn ;
+   char int_p_cs_precedes ;
+   char int_p_sep_by_space ;
+   char int_n_cs_precedes ;
+   char int_n_sep_by_space ;
+   char int_p_sign_posn ;
+   char int_n_sign_posn ;
+};
+union __fc_u_finitef {
+   float f ;
+   unsigned short w[2] ;
+};
+union __fc_u_finite {
+   double d ;
+   unsigned short w[4] ;
+};
+struct __fc_pthread_attr_t {
+   int _fc ;
+};
+typedef struct __fc_pthread_attr_t pthread_attr_t;
+struct __fc_pthread_cond_t {
+   int _fc ;
+};
+typedef struct __fc_pthread_cond_t pthread_cond_t;
+struct __fc_pthread_condattr_t {
+   int _fc ;
+};
+typedef struct __fc_pthread_condattr_t pthread_condattr_t;
+struct __fc_pthread_mutex_t {
+   int _fc ;
+};
+typedef struct __fc_pthread_mutex_t pthread_mutex_t;
+struct __fc_pthread_mutexattr_t {
+   int _fc ;
+};
+typedef struct __fc_pthread_mutexattr_t pthread_mutexattr_t;
+struct __fc_pthread_t {
+   int _fc ;
+};
+typedef struct __fc_pthread_t pthread_t;
+typedef unsigned long sigset_t;
+union sigval {
+   int sival_int ;
+   void *sival_ptr ;
+};
+struct __fc_siginfo_t {
+   int si_signo ;
+   int si_code ;
+   union sigval si_value ;
+   int si_errno ;
+   pid_t si_pid ;
+   uid_t si_uid ;
+   void *si_addr ;
+   int si_status ;
+   int si_band ;
+};
+typedef struct __fc_siginfo_t siginfo_t;
+struct sigaction {
+   void (*sa_handler)(int ) ;
+   void (*sa_sigaction)(int , siginfo_t *, void *) ;
+   sigset_t sa_mask ;
+   int sa_flags ;
+};
+typedef unsigned int socklen_t;
+typedef unsigned short sa_family_t;
+struct sockaddr {
+   sa_family_t sa_family ;
+   char sa_data[14] ;
+};
+struct iovec {
+   void *iov_base ;
+   size_t iov_len ;
+};
+struct msghdr {
+   void *msg_name ;
+   socklen_t msg_namelen ;
+   struct iovec *msg_iov ;
+   int msg_iovlen ;
+   void *msg_control ;
+   socklen_t msg_controllen ;
+   int msg_flags ;
+};
+struct __fc_sockfds_type {
+   int x ;
+};
+typedef uint32_t in_addr_t;
+struct in_addr {
+   in_addr_t s_addr ;
+};
+struct in6_addr {
+   uint8_t s6_addr[16] ;
+};
+enum __fc_ipproto {
+    IPPROTO_IP = 0,
+    IPPROTO_HOPOPTS = 0,
+    IPPROTO_ICMP = 1,
+    IPPROTO_IGMP = 2,
+    IPPROTO_IPIP = 4,
+    IPPROTO_TCP = 6,
+    IPPROTO_EGP = 8,
+    IPPROTO_PUP = 12,
+    IPPROTO_UDP = 17,
+    IPPROTO_IDP = 22,
+    IPPROTO_TP = 29,
+    IPPROTO_DCCP = 33,
+    IPPROTO_IPV6 = 41,
+    IPPROTO_ROUTING = 43,
+    IPPROTO_FRAGMENT = 44,
+    IPPROTO_RSVP = 46,
+    IPPROTO_GRE = 47,
+    IPPROTO_ESP = 50,
+    IPPROTO_AH = 51,
+    IPPROTO_ICMPV6 = 58,
+    IPPROTO_NONE = 59,
+    IPPROTO_DSTOPTS = 60,
+    IPPROTO_MTP = 92,
+    IPPROTO_ENCAP = 98,
+    IPPROTO_PIM = 103,
+    IPPROTO_COMP = 108,
+    IPPROTO_SCTP = 132,
+    IPPROTO_UDPLITE = 136,
+    IPPROTO_RAW = 255,
+    IPPROTO_MAX = 256
+};
+struct hostent {
+   char *h_name ;
+   char **h_aliases ;
+   int h_addrtype ;
+   int h_length ;
+   char **h_addr_list ;
+};
+struct addrinfo {
+   int ai_flags ;
+   int ai_family ;
+   int ai_socktype ;
+   int ai_protocol ;
+   socklen_t ai_addrlen ;
+   struct sockaddr *ai_addr ;
+   char *ai_canonname ;
+   struct addrinfo *ai_next ;
+};
+struct __fc_gethostbyname {
+   struct hostent host ;
+   unsigned char host_addr[sizeof(struct in_addr)] ;
+   char *h_addr_ptrs[2 + 1] ;
+   char *host_aliases[2] ;
+   char hostbuf[128] ;
+};
+typedef void * const * va_list;
+typedef unsigned int ino_t;
+typedef long time_t;
+typedef unsigned int blkcnt_t;
+typedef unsigned int blksize_t;
+typedef unsigned int dev_t;
+typedef unsigned int mode_t;
+typedef unsigned int nlink_t;
+struct stat {
+   dev_t st_dev ;
+   ino_t st_ino ;
+   mode_t st_mode ;
+   nlink_t st_nlink ;
+   uid_t st_uid ;
+   gid_t st_gid ;
+   dev_t st_rdev ;
+   off_t st_size ;
+   time_t st_atime ;
+   time_t st_mtime ;
+   time_t st_ctime ;
+   blksize_t st_blksize ;
+   blkcnt_t st_blocks ;
+};
+struct __fc_pos_t {
+   unsigned long __fc_stdio_position ;
+};
+typedef struct __fc_pos_t fpos_t;
+struct __fc_FILE {
+   unsigned int __fc_FILE_id ;
+   unsigned int __fc_FILE_data ;
+};
+typedef struct __fc_FILE FILE;
+typedef unsigned int id_t;
+typedef int suseconds_t;
+typedef int clockid_t;
+typedef unsigned int clock_t;
+struct tm {
+   int tm_sec ;
+   int tm_min ;
+   int tm_hour ;
+   int tm_mday ;
+   int tm_mon ;
+   int tm_year ;
+   int tm_wday ;
+   int tm_yday ;
+   int tm_isdst ;
+};
+struct timespec {
+   long tv_sec ;
+   long tv_nsec ;
+};
+struct dirent {
+   ino_t d_ino ;
+   off_t d_off ;
+   unsigned short d_reclen ;
+   unsigned char d_type ;
+   char d_name[256] ;
+};
+struct DIR {
+   unsigned int __fc_dir_id ;
+   unsigned int __fc_dir_position ;
+   struct stat *__fc_dir_inode ;
+   struct dirent **__fc_dir_entries ;
+};
+typedef struct DIR DIR;
+struct __fc_fd_set {
+   long __fc_fd_set[(unsigned int)1024 / ((unsigned int)8 * sizeof(long))] ;
+};
+typedef struct __fc_fd_set fd_set;
+struct flock {
+   short l_type ;
+   short l_whence ;
+   off_t l_start ;
+   off_t l_len ;
+   pid_t l_pid ;
+};
+struct timeval {
+   time_t tv_sec ;
+   suseconds_t tv_usec ;
+};
+struct timezone {
+   int tz_minuteswest ;
+   int tz_dsttime ;
+};
+struct itimerval {
+   struct timeval it_interval ;
+   struct timeval it_value ;
+};
+typedef void * iconv_t;
+struct pollfd {
+   int fd ;
+   short events ;
+   short revents ;
+};
+typedef unsigned long nfds_t;
+struct passwd {
+   char *pw_name ;
+   char *pw_passwd ;
+   uid_t pw_uid ;
+   gid_t pw_gid ;
+   char *pw_gecos ;
+   char *pw_dir ;
+   char *pw_shell ;
+};
+typedef int ( jmp_buf)[5];
+struct __fc_sigjmp_buf {
+   jmp_buf buf ;
+   sigset_t sigs ;
+};
+typedef struct __fc_sigjmp_buf sigjmp_buf;
+struct __fc_code {
+   char const *c_name ;
+   int c_val ;
+};
+typedef struct __fc_code CODE;
+typedef unsigned long rlim_t;
+struct rlimit {
+   rlim_t rlim_cur ;
+   rlim_t rlim_max ;
+};
+struct rusage {
+   struct timeval ru_utime ;
+   struct timeval ru_stime ;
+};
+struct tms {
+   clock_t tms_utime ;
+   clock_t tms_stime ;
+   clock_t tms_cutime ;
+   clock_t tms_cstime ;
+};
+struct utsname {
+   char sysname[65] ;
+   char nodename[65] ;
+   char release[65] ;
+   char version[65] ;
+   char machine[65] ;
+};
+typedef unsigned int tcflag_t;
+typedef unsigned char cc_t;
+typedef unsigned int speed_t;
+struct termios {
+   tcflag_t c_iflag ;
+   tcflag_t c_oflag ;
+   tcflag_t c_cflag ;
+   tcflag_t c_lflag ;
+   cc_t c_cc[32] ;
+};
+int volatile Frama_C_entropy_source __attribute__((__unused__,
+                                                   __FRAMA_C_MODEL__));
+void Frama_C_make_unknown(char *p, size_t l);
+
+int Frama_C_nondet(int a, int b);
+
+void *Frama_C_nondet_ptr(void *a, void *b);
+
+int Frama_C_interval(int min, int max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern int Frama_C_interval_split(int min, int max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern unsigned char Frama_C_unsigned_char_interval(unsigned char min,
+                                                    unsigned char max);
+
+char Frama_C_char_interval(char min, char max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern unsigned short Frama_C_unsigned_short_interval(unsigned short min,
+                                                      unsigned short max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern short Frama_C_short_interval(short min, short max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern unsigned int Frama_C_unsigned_int_interval(unsigned int min,
+                                                  unsigned int max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern int Frama_C_int_interval(int min, int max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern unsigned long Frama_C_unsigned_long_interval(unsigned long min,
+                                                    unsigned long max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern long Frama_C_long_interval(long min, long max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern unsigned long long Frama_C_unsigned_long_long_interval(unsigned long long min,
+                                                              unsigned long long max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern long long Frama_C_long_long_interval(long long min, long long max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern size_t Frama_C_size_t_interval(size_t min, size_t max);
+
+float Frama_C_float_interval(float min, float max);
+
+double Frama_C_double_interval(double min, double max);
+
+/*@ requires finite: \is_finite(min) ∧ \is_finite(max);
+    requires order: min ≤ max;
+    ensures
+      result_bounded:
+        \is_finite(\result) ∧ \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern double Frama_C_real_interval_as_double(double min, double max);
+
+ __attribute__((__noreturn__)) void Frama_C_abort(void);
+
+/*@ assigns \result;
+    assigns \result \from p; */
+extern size_t Frama_C_offset(void const *p);
+
+/*@ assigns \result;
+    assigns \result \from i; */
+extern long long Frama_C_abstract_cardinal(long long i);
+
+/*@ assigns \result;
+    assigns \result \from i; */
+extern long long Frama_C_abstract_max(long long i);
+
+/*@ assigns \result;
+    assigns \result \from i; */
+extern long long Frama_C_abstract_min(long long i);
+
+/*@ assigns Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+void Frama_C_update_entropy(void)
+{
+  Frama_C_entropy_source = Frama_C_entropy_source;
+  return;
+}
+
+/*@ requires valid_p: \valid(p + (0 .. l - 1));
+    ensures initialization: \initialized(\old(p) + (0 .. \old(l) - 1));
+    assigns *(p + (0 .. l - 1)), Frama_C_entropy_source;
+    assigns *(p + (0 .. l - 1)) \from Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+void Frama_C_make_unknown(char *p, size_t l)
+{
+  Frama_C_update_entropy();
+  {
+    size_t i = (unsigned int)0;
+    while (i < l) {
+      *(p + i) = (char)Frama_C_entropy_source;
+      i += (size_t)1;
+    }
+  }
+  return;
+}
+
+/*@ ensures result_a_or_b: \result ≡ \old(a) ∨ \result ≡ \old(b);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from a, b, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+int Frama_C_nondet(int a, int b)
+{
+  int tmp;
+  Frama_C_update_entropy();
+  if (Frama_C_entropy_source) tmp = a; else tmp = b;
+  return tmp;
+}
+
+/*@ ensures result_a_or_b: \result ≡ \old(a) ∨ \result ≡ \old(b);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from a, b, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+void *Frama_C_nondet_ptr(void *a, void *b)
+{
+  void *tmp;
+  Frama_C_update_entropy();
+  if (Frama_C_entropy_source) tmp = a; else tmp = b;
+  return tmp;
+}
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+int Frama_C_interval(int min, int max)
+{
+  int r;
+  int aux;
+  Frama_C_update_entropy();
+  aux = Frama_C_entropy_source;
+  if (aux >= min) 
+    if (aux <= max) r = aux; else r = min;
+  else r = min;
+  return r;
+}
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+char Frama_C_char_interval(char min, char max)
+{
+  char __retres;
+  int r;
+  char aux;
+  Frama_C_update_entropy();
+  aux = (char)Frama_C_entropy_source;
+  if ((int)aux >= (int)min) 
+    if ((int)aux <= (int)max) r = (int)aux; else r = (int)min;
+  else r = (int)min;
+  __retres = (char)r;
+  return __retres;
+}
+
+/*@ requires finite: \is_finite(min) ∧ \is_finite(max);
+    requires order: min ≤ max;
+    ensures
+      result_bounded:
+        \is_finite(\result) ∧ \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+float Frama_C_float_interval(float min, float max)
+{
+  float tmp;
+  Frama_C_update_entropy();
+  if (Frama_C_entropy_source) tmp = min; else tmp = max;
+  return tmp;
+}
+
+/*@ requires finite: \is_finite(min) ∧ \is_finite(max);
+    requires order: min ≤ max;
+    ensures
+      result_bounded:
+        \is_finite(\result) ∧ \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+double Frama_C_double_interval(double min, double max)
+{
+  double tmp;
+  Frama_C_update_entropy();
+  if (Frama_C_entropy_source) tmp = min; else tmp = max;
+  return tmp;
+}
+
+extern  __attribute__((__noreturn__)) void __builtin_abort(void);
+
+/*@ terminates \false;
+    ensures never_terminates: \false;
+    assigns \nothing; */
+ __attribute__((__noreturn__)) void Frama_C_abort(void);
+void Frama_C_abort(void)
+{
+  __builtin_abort();
+  return;
+}
+
+void __FC_assert(int c, char const *file, int line, char const *expr);
+
+/*@ assigns \nothing; */
+extern void Frama_C_show_each_warning();
+
+/*@ requires nonnull_c: c ≢ 0;
+    terminates c ≢ 0;
+    assigns \nothing; */
+void __FC_assert(int c, char const *file, int line, char const *expr)
+{
+  if (! c) {
+    Frama_C_show_each_warning("Assertion may fail",file,line,expr);
+    Frama_C_abort();
+  }
+  return;
+}
+
+int isalnum(int c);
+
+int isalpha(int c);
+
+int isblank(int c);
+
+int iscntrl(int c);
+
+int isdigit(int c);
+
+int isgraph(int c);
+
+int islower(int c);
+
+int isprint(int c);
+
+int ispunct(int c);
+
+int isspace(int c);
+
+int isupper(int c);
+
+int isxdigit(int c);
+
+int tolower(int c);
+
+int toupper(int c);
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior match:
+      assumes c_ascii: 0 ≤ c ≤ 127;
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior no_match:
+      assumes c_non_ascii: ¬(0 ≤ c ≤ 127);
+      ensures zero_result: \result ≡ 0;
+    
+    complete behaviors no_match, match;
+    disjoint behaviors no_match, match;
+ */
+extern int isascii(int c);
+
+/*@ requires c_uchar_or_eof_or_EOF: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes
+        c_alnum:
+          ('A' ≤ c ≤ 'Z') ∨ ('a' ≤ c ≤ 'z') ∨ ('0' ≤ c ≤ '9');
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes
+        c_non_alnum:
+          c ≡ -1 ∨ (0 ≤ c ≤ 47) ∨ (58 ≤ c ≤ 64) ∨
+          (91 ≤ c ≤ 96) ∨ (123 ≤ c ≤ 127);
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int isalnum(int c)
+{
+  int tmp;
+  if (c >= 'A') {
+    if (c <= 'Z') tmp = 1; else goto _LAND_0;
+  }
+  else {
+    _LAND_0: ;
+    if (c >= 'a') {
+      if (c <= 'z') tmp = 1; else goto _LAND;
+    }
+    else {
+      _LAND: ;
+      if (c >= '0') 
+        if (c <= '9') tmp = 1; else tmp = 0;
+      else tmp = 0;
+    }
+  }
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes c_alpha: ('A' ≤ c ≤ 'Z') ∨ ('a' ≤ c ≤ 'z');
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes
+        c_non_alpha:
+          c ≡ -1 ∨ (0 ≤ c ≤ 64) ∨ (91 ≤ c ≤ 96) ∨
+          (123 ≤ c ≤ 127);
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int isalpha(int c)
+{
+  int tmp;
+  if (c >= 'A') {
+    if (c <= 'Z') tmp = 1; else goto _LAND;
+  }
+  else {
+    _LAND: ;
+    if (c >= 'a') 
+      if (c <= 'z') tmp = 1; else tmp = 0;
+    else tmp = 0;
+  }
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior match:
+      assumes c_tab_or_space: c ≡ ' ' ∨ c ≡ '\t';
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior no_match:
+      assumes c_non_blank: c ≢ ' ' ∧ c ≢ '\t';
+      ensures zero_result: \result ≡ 0;
+    
+    complete behaviors no_match, match;
+    disjoint behaviors no_match, match;
+ */
+int isblank(int c)
+{
+  int tmp;
+  if (c == ' ') tmp = 1;
+  else 
+    if (c == '\t') tmp = 1;
+    else 
+      if (c == ' ') tmp = 1;
+      else 
+        if (c == '\f') tmp = 1;
+        else 
+          if (c == '\n') tmp = 1;
+          else 
+            if (c == '\r') tmp = 1;
+            else 
+              if (c == '\t') tmp = 1;
+              else 
+                if (c == '\v') tmp = 1; else tmp = 0;
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes c_control_char: (0 ≤ c ≤ 31) ∨ c ≡ 127;
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes c_non_control_char: c ≡ -1 ∨ (32 ≤ c ≤ 126);
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int iscntrl(int c)
+{
+  int tmp;
+  tmp = Frama_C_nondet(0,1);
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior match:
+      assumes c_digit: '0' ≤ c ≤ '9';
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior no_match:
+      assumes c_non_digit: c < '0' ∨ c > '9';
+      ensures zero_result: \result ≡ 0;
+    
+    complete behaviors no_match, match;
+    disjoint behaviors no_match, match;
+ */
+int isdigit(int c)
+{
+  int tmp;
+  if (c >= '0') 
+    if (c <= '9') tmp = 1; else tmp = 0;
+  else tmp = 0;
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes c_graphical: 33 ≤ c ≤ 126;
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes c_non_graphical: c ≡ -1 ∨ (0 ≤ c ≤ 32) ∨ c ≡ 127;
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int isgraph(int c)
+{
+  int tmp;
+  tmp = Frama_C_nondet(0,1);
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes c_lower: 'a' ≤ c ≤ 'z';
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes c_non_lower: c ≡ -1 ∨ (0 ≤ c < 'a') ∨ ('z' < c < 127);
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int islower(int c)
+{
+  int tmp;
+  if (c >= 'a') 
+    if (c <= 'z') tmp = 1; else tmp = 0;
+  else tmp = 0;
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes c_printable: 32 ≤ c ≤ 126;
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes c_non_printable: c ≡ -1 ∨ (0 ≤ c ≤ 31) ∨ c ≡ 127;
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int isprint(int c)
+{
+  int tmp;
+  tmp = Frama_C_nondet(0,1);
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes
+        c_punct:
+          (33 ≤ c ≤ 47) ∨ (58 ≤ c ≤ 64) ∨ (91 ≤ c ≤ 96) ∨
+          (123 ≤ c ≤ 126);
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes
+        c_non_punct:
+          c ≡ -1 ∨ (0 ≤ c ≤ 32) ∨ (48 ≤ c ≤ 57) ∨
+          (65 ≤ c ≤ 90) ∨ (97 ≤ c ≤ 122) ∨ c ≡ 127;
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int ispunct(int c)
+{
+  int tmp;
+  tmp = Frama_C_nondet(0,1);
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes c_space: (9 ≤ c ≤ 13) ∨ c ≡ ' ';
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes
+        c_non_space:
+          c ≡ -1 ∨ (0 ≤ c ≤ 8) ∨ (14 ≤ c < ' ') ∨
+          (' ' < c ≤ 127);
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int isspace(int c)
+{
+  int tmp;
+  if (c == ' ') tmp = 1;
+  else 
+    if (c == '\f') tmp = 1;
+    else 
+      if (c == '\n') tmp = 1;
+      else 
+        if (c == '\r') tmp = 1;
+        else 
+          if (c == '\t') tmp = 1;
+          else 
+            if (c == '\v') tmp = 1; else tmp = 0;
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes c_upper: 'A' ≤ c ≤ 'Z';
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes
+        c_non_upper: c ≡ -1 ∨ (0 ≤ c < 'A') ∨ ('Z' < c ≤ 127);
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int isupper(int c)
+{
+  int tmp;
+  if (c >= 'A') 
+    if (c <= 'Z') tmp = 1; else tmp = 0;
+  else tmp = 0;
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior match:
+      assumes
+        c_hexa_digit:
+          ('0' ≤ c ≤ '9') ∨ ('A' ≤ c ≤ 'F') ∨ ('a' ≤ c ≤ 'f');
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior no_match:
+      assumes
+        c_non_hexa_digit:
+          ¬(('0' ≤ c ≤ '9') ∨ ('A' ≤ c ≤ 'F') ∨
+             ('a' ≤ c ≤ 'f'));
+      ensures zero_result: \result ≡ 0;
+    
+    complete behaviors no_match, match;
+    disjoint behaviors no_match, match;
+ */
+int isxdigit(int c)
+{
+  int tmp;
+  if (c >= '0') {
+    if (c <= '9') tmp = 1; else goto _LAND_0;
+  }
+  else {
+    _LAND_0: ;
+    if (c >= 'a') {
+      if (c <= 'f') tmp = 1; else goto _LAND;
+    }
+    else {
+      _LAND: ;
+      if (c >= 'A') 
+        if (c <= 'F') tmp = 1; else tmp = 0;
+      else tmp = 0;
+    }
+  }
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    ensures result_uchar_of_eof: (0 ≤ \result ≤ 255) ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_changed:
+      assumes c_ascii_upper: 'A' ≤ c ≤ 'Z';
+      ensures result_ascii_lower: \result ≡ \old(c) + 32;
+    
+    behavior definitely_not_changed:
+      assumes
+        c_ascii_but_non_upper:
+          c ≡ -1 ∨ (0 ≤ c < 'A') ∨ ('Z' < c ≤ 127);
+      ensures result_unchanged: \result ≡ \old(c);
+    
+    disjoint behaviors definitely_not_changed, definitely_changed;
+ */
+int tolower(int c)
+{
+  int __retres;
+  if (c >= 'A') 
+    if (c <= 'Z') {
+      __retres = c + 0x20;
+      goto return_label;
+    }
+  __retres = c;
+  return_label: return __retres;
+}
+
+/*@ requires c_uchar_of_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    ensures result_uchar_of_eof: (0 ≤ \result ≤ 255) ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_changed:
+      assumes c_ascii_lower: 'a' ≤ c ≤ 'z';
+      ensures result_ascii_upper: \result ≡ \old(c) - 32;
+    
+    behavior definitely_not_changed:
+      assumes
+        c_ascii_but_non_lower:
+          c ≡ -1 ∨ (0 ≤ c < 'a') ∨ ('z' < c ≤ 127);
+      ensures result_unchanged: \result ≡ \old(c);
+    
+    disjoint behaviors definitely_not_changed, definitely_changed;
+ */
+int toupper(int c)
+{
+  int __retres;
+  if (c >= 'a') 
+    if (c <= 'z') {
+      __retres = c - 0x20;
+      goto return_label;
+    }
+  __retres = c;
+  return_label: return __retres;
+}
+
+int __fc_errno;
+
+int __fc_errno = 0;
+int fetestexcept(int excepts);
+
+int feholdexcept(fenv_t *envp);
+
+int fesetenv(fenv_t const *envp);
+
+static int volatile fetestexcept___fc_random_fetestexcept __attribute__((
+  __FRAMA_C_MODEL__));
+int fetestexcept(int excepts)
+{
+  int __retres;
+  __retres = 0x00FF & fetestexcept___fc_random_fetestexcept;
+  return __retres;
+}
+
+fenv_t volatile __fc_fenv_state __attribute__((__FRAMA_C_MODEL__));
+int feholdexcept(fenv_t *envp)
+{
+  int __retres;
+  *envp = __fc_fenv_state;
+  __retres = 0;
+  return __retres;
+}
+
+int fesetenv(fenv_t const *envp)
+{
+  int __retres;
+  __fc_fenv_state = *envp;
+  __retres = 0;
+  return __retres;
+}
+
+/*@
+axiomatic MemCmp {
+  logic ℤ memcmp{L1, L2}(char *s1, char *s2, ℤ n) 
+    reads \at(*(s1 + (0 .. n - 1)),L1), \at(*(s2 + (0 .. n - 1)),L2);
+  
+  axiom memcmp_zero{L1, L2}:
+    ∀ char *s1, char *s2;
+    ∀ ℤ n;
+      memcmp{L1, L2}(s1, s2, n) ≡ 0 ⇔
+      (∀ ℤ i; 0 ≤ i < n ⇒ \at(*(s1 + i),L1) ≡ \at(*(s2 + i),L2));
+  
+  }
+ */
+/*@
+axiomatic MemChr {
+  logic 𝔹 memchr{L}(char *s, ℤ c, ℤ n) 
+    reads *(s + (0 .. n - 1));
+  
+  logic ℤ memchr_off{L}(char *s, ℤ c, ℤ n) 
+    reads *(s + (0 .. n - 1));
+  
+  axiom memchr_def{L}:
+    ∀ char *s;
+    ∀ ℤ c;
+    ∀ ℤ n;
+      memchr(s, c, n) ≡ \true ⇔
+      (∃ int i; 0 ≤ i < n ∧ *(s + i) ≡ c);
+  
+  }
+ */
+/*@
+axiomatic MemSet {
+  logic 𝔹 memset{L}(char *s, ℤ c, ℤ n) 
+    reads *(s + (0 .. n - 1));
+  
+  axiom memset_def{L}:
+    ∀ char *s;
+    ∀ ℤ c;
+    ∀ ℤ n;
+      memset(s, c, n) ≡ \true ⇔
+      (∀ ℤ i; 0 ≤ i < n ⇒ *(s + i) ≡ c);
+  
+  }
+ */
+/*@
+axiomatic StrLen {
+  logic ℤ strlen{L}(char *s) 
+    reads *(s + (0 ..));
+  
+  axiom strlen_pos_or_null{L}:
+    ∀ char *s;
+    ∀ ℤ i;
+      0 ≤ i ∧ (∀ ℤ j; 0 ≤ j < i ⇒ *(s + j) ≢ '\000') ∧
+      *(s + i) ≡ '\000' ⇒ strlen(s) ≡ i;
+  
+  axiom strlen_neg{L}:
+    ∀ char *s;
+      (∀ ℤ i; 0 ≤ i ⇒ *(s + i) ≢ '\000') ⇒ strlen(s) < 0;
+  
+  axiom strlen_before_null{L}:
+    ∀ char *s;
+    ∀ ℤ i; 0 ≤ i < strlen(s) ⇒ *(s + i) ≢ '\000';
+  
+  axiom strlen_at_null{L}:
+    ∀ char *s; 0 ≤ strlen(s) ⇒ *(s + strlen(s)) ≡ '\000';
+  
+  axiom strlen_not_zero{L}:
+    ∀ char *s;
+    ∀ ℤ i;
+      0 ≤ i ≤ strlen(s) ∧ *(s + i) ≢ '\000' ⇒ i < strlen(s);
+  
+  axiom strlen_zero{L}:
+    ∀ char *s;
+    ∀ ℤ i;
+      0 ≤ i ≤ strlen(s) ∧ *(s + i) ≡ '\000' ⇒ i ≡ strlen(s);
+  
+  axiom strlen_sup{L}:
+    ∀ char *s;
+    ∀ ℤ i; 0 ≤ i ∧ *(s + i) ≡ '\000' ⇒ 0 ≤ strlen(s) ≤ i;
+  
+  axiom strlen_shift{L}:
+    ∀ char *s;
+    ∀ ℤ i; 0 ≤ i ≤ strlen(s) ⇒ strlen(s + i) ≡ strlen(s) - i;
+  
+  axiom strlen_create{L}:
+    ∀ char *s;
+    ∀ ℤ i; 0 ≤ i ∧ *(s + i) ≡ '\000' ⇒ 0 ≤ strlen(s) ≤ i;
+  
+  axiom strlen_create_shift{L}:
+    ∀ char *s;
+    ∀ ℤ i;
+    ∀ ℤ k;
+      0 ≤ k ≤ i ∧ *(s + i) ≡ '\000' ⇒ 0 ≤ strlen(s + k) ≤ i - k;
+  
+  axiom memcmp_strlen_left{L}:
+    ∀ char *s1, char *s2;
+    ∀ ℤ n;
+      memcmp{L, L}(s1, s2, n) ≡ 0 ∧ strlen(s1) < n ⇒
+      strlen(s1) ≡ strlen(s2);
+  
+  axiom memcmp_strlen_right{L}:
+    ∀ char *s1, char *s2;
+    ∀ ℤ n;
+      memcmp{L, L}(s1, s2, n) ≡ 0 ∧ strlen(s2) < n ⇒
+      strlen(s1) ≡ strlen(s2);
+  
+  axiom memcmp_strlen_shift_left{L}:
+    ∀ char *s1, char *s2;
+    ∀ ℤ k, ℤ n;
+      memcmp{L, L}(s1, s2 + k, n) ≡ 0 ≤ k ∧ strlen(s1) < n ⇒
+      0 ≤ strlen(s2) ≤ k + strlen(s1);
+  
+  axiom memcmp_strlen_shift_right{L}:
+    ∀ char *s1, char *s2;
+    ∀ ℤ k, ℤ n;
+      memcmp{L, L}(s1 + k, s2, n) ≡ 0 ≤ k ∧ strlen(s2) < n ⇒
+      0 ≤ strlen(s1) ≤ k + strlen(s2);
+  
+  }
+ */
+/*@
+axiomatic StrCmp {
+  logic ℤ strcmp{L}(char *s1, char *s2) 
+    reads *(s1 + (0 .. strlen(s1))), *(s2 + (0 .. strlen(s2)));
+  
+  axiom strcmp_zero{L}:
+    ∀ char *s1, char *s2;
+      strcmp(s1, s2) ≡ 0 ⇔
+      strlen(s1) ≡ strlen(s2) ∧
+      (∀ ℤ i; 0 ≤ i ≤ strlen(s1) ⇒ *(s1 + i) ≡ *(s2 + i));
+  
+  }
+ */
+/*@
+axiomatic StrNCmp {
+  logic ℤ strncmp{L}(char *s1, char *s2, ℤ n) 
+    reads *(s1 + (0 .. n - 1)), *(s2 + (0 .. n - 1));
+  
+  axiom strncmp_zero{L}:
+    ∀ char *s1, char *s2;
+    ∀ ℤ n;
+      strncmp(s1, s2, n) ≡ 0 ⇔
+      (strlen(s1) < n ∧ strcmp(s1, s2) ≡ 0) ∨
+      (∀ ℤ i; 0 ≤ i < n ⇒ *(s1 + i) ≡ *(s2 + i));
+  
+  }
+ */
+/*@
+axiomatic StrChr {
+  logic 𝔹 strchr{L}(char *s, ℤ c) 
+    reads *(s + (0 .. strlen(s)));
+  
+  axiom strchr_def{L}:
+    ∀ char *s;
+    ∀ ℤ c;
+      strchr(s, c) ≡ \true ⇔
+      (∃ ℤ i; 0 ≤ i ≤ strlen(s) ∧ *(s + i) ≡ (char)c);
+  
+  }
+ */
+/*@
+axiomatic WMemChr {
+  logic 𝔹 wmemchr{L}(wchar_t *s, wchar_t c, ℤ n) 
+    reads *(s + (0 .. n - 1));
+  
+  logic ℤ wmemchr_off{L}(wchar_t *s, wchar_t c, ℤ n) 
+    reads *(s + (0 .. n - 1));
+  
+  axiom wmemchr_def{L}:
+    ∀ wchar_t *s;
+    ∀ int c;
+    ∀ ℤ n;
+      wmemchr(s, c, n) ≡ \true ⇔
+      (∃ int i; 0 ≤ i < n ∧ *(s + i) ≡ c);
+  
+  }
+ */
+/*@
+axiomatic WcsLen {
+  logic ℤ wcslen{L}(wchar_t *s) 
+    reads *(s + (0 ..));
+  
+  axiom wcslen_pos_or_null{L}:
+    ∀ wchar_t *s;
+    ∀ ℤ i;
+      0 ≤ i ∧ (∀ ℤ j; 0 ≤ j < i ⇒ *(s + j) ≢ 0) ∧
+      *(s + i) ≡ 0 ⇒ wcslen(s) ≡ i;
+  
+  axiom wcslen_neg{L}:
+    ∀ wchar_t *s; (∀ ℤ i; 0 ≤ i ⇒ *(s + i) ≢ 0) ⇒ wcslen(s) < 0;
+  
+  axiom wcslen_before_null{L}:
+    ∀ wchar_t *s;
+    ∀ int i; 0 ≤ i < wcslen(s) ⇒ *(s + i) ≢ 0;
+  
+  axiom wcslen_at_null{L}:
+    ∀ wchar_t *s; 0 ≤ wcslen(s) ⇒ *(s + wcslen(s)) ≡ 0;
+  
+  axiom wcslen_not_zero{L}:
+    ∀ wchar_t *s;
+    ∀ int i; 0 ≤ i ≤ wcslen(s) ∧ *(s + i) ≢ 0 ⇒ i < wcslen(s);
+  
+  axiom wcslen_zero{L}:
+    ∀ wchar_t *s;
+    ∀ int i; 0 ≤ i ≤ wcslen(s) ∧ *(s + i) ≡ 0 ⇒ i ≡ wcslen(s);
+  
+  axiom wcslen_sup{L}:
+    ∀ wchar_t *s;
+    ∀ int i; 0 ≤ i ∧ *(s + i) ≡ 0 ⇒ 0 ≤ wcslen(s) ≤ i;
+  
+  axiom wcslen_shift{L}:
+    ∀ wchar_t *s;
+    ∀ int i; 0 ≤ i ≤ wcslen(s) ⇒ wcslen(s + i) ≡ wcslen(s) - i;
+  
+  axiom wcslen_create{L}:
+    ∀ wchar_t *s;
+    ∀ int i; 0 ≤ i ∧ *(s + i) ≡ 0 ⇒ 0 ≤ wcslen(s) ≤ i;
+  
+  axiom wcslen_create_shift{L}:
+    ∀ wchar_t *s;
+    ∀ int i;
+    ∀ int k;
+      0 ≤ k ≤ i ∧ *(s + i) ≡ 0 ⇒ 0 ≤ wcslen(s + k) ≤ i - k;
+  
+  }
+ */
+/*@
+axiomatic WcsCmp {
+  logic ℤ wcscmp{L}(wchar_t *s1, wchar_t *s2) 
+    reads *(s1 + (0 .. wcslen(s1))), *(s2 + (0 .. wcslen(s2)));
+  
+  axiom wcscmp_zero{L}:
+    ∀ wchar_t *s1, wchar_t *s2;
+      wcscmp(s1, s2) ≡ 0 ⇔
+      wcslen(s1) ≡ wcslen(s2) ∧
+      (∀ ℤ i; 0 ≤ i ≤ wcslen(s1) ⇒ *(s1 + i) ≡ *(s2 + i));
+  
+  }
+ */
+/*@
+axiomatic WcsNCmp {
+  logic ℤ wcsncmp{L}(wchar_t *s1, wchar_t *s2, ℤ n) 
+    reads *(s1 + (0 .. n - 1)), *(s2 + (0 .. n - 1));
+  
+  axiom wcsncmp_zero{L}:
+    ∀ wchar_t *s1, wchar_t *s2;
+    ∀ ℤ n;
+      wcsncmp(s1, s2, n) ≡ 0 ⇔
+      (wcslen(s1) < n ∧ wcscmp(s1, s2) ≡ 0) ∨
+      (∀ ℤ i; 0 ≤ i < n ⇒ *(s1 + i) ≡ *(s2 + i));
+  
+  }
+ */
+/*@
+axiomatic WcsChr {
+  logic 𝔹 wcschr{L}(wchar_t *wcs, ℤ wc) 
+    reads *(wcs + (0 .. wcslen(wcs)));
+  
+  axiom wcschr_def{L}:
+    ∀ wchar_t *wcs;
+    ∀ ℤ wc;
+      wcschr(wcs, wc) ≡ \true ⇔
+      (∃ ℤ i; 0 ≤ i ≤ wcslen(wcs) ∧ *(wcs + i) ≡ (int)wc);
+  
+  }
+ */
+/*@ logic ℤ minimum(ℤ i, ℤ j) = i < j? i: j;
+ */
+/*@ logic ℤ maximum(ℤ i, ℤ j) = i < j? j: i;
+ */
+/*@
+predicate valid_string{L}(char *s) =
+  0 ≤ strlen(s) ∧ \valid(s + (0 .. strlen(s)));
+ */
+/*@
+predicate valid_read_string{L}(char *s) =
+  0 ≤ strlen(s) ∧ \valid_read(s + (0 .. strlen(s)));
+ */
+/*@
+predicate valid_read_nstring{L}(char *s, ℤ n) =
+  (\valid_read(s + (0 .. n - 1)) ∧ \initialized(s + (0 .. n - 1))) ∨
+  valid_read_string(s);
+ */
+/*@
+predicate valid_string_or_null{L}(char *s) = s ≡ \null ∨ valid_string(s);
+ */
+/*@
+predicate valid_wstring{L}(wchar_t *s) =
+  0 ≤ wcslen(s) ∧ \valid(s + (0 .. wcslen(s)));
+ */
+/*@
+predicate valid_read_wstring{L}(wchar_t *s) =
+  0 ≤ wcslen(s) ∧ \valid_read(s + (0 .. wcslen(s)));
+ */
+/*@
+predicate valid_read_nwstring{L}(wchar_t *s, ℤ n) =
+  (\valid_read(s + (0 .. n - 1)) ∧ \initialized(s + (0 .. n - 1))) ∨
+  valid_read_wstring(s);
+ */
+/*@
+predicate valid_wstring_or_null{L}(wchar_t *s) =
+  s ≡ \null ∨ valid_wstring(s);
+
+*/
+/*@ ghost int __fc_fds[1024]; */
+/*@ requires valid_string_path: valid_read_string(path);
+    requires valid_amode: (amode & ~((4 | 2) | 1)) ≡ 0 ∨ amode ≡ 0;
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: path), (indirect: *(path + (0 ..))), (indirect: amode);
+ */
+extern int access(char const *path, int amode);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: path), (indirect: *(path + (0 ..)));
+ */
+extern int chdir(char const *path);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: path), (indirect: *(path + (0 ..)));
+ */
+extern int chroot(char const *path);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: path), (indirect: *(path + (0 ..))),
+            (indirect: owner), (indirect: group);
+ */
+extern int chown(char const *path, uid_t owner, gid_t group);
+
+/*@ requires valid_fd: 0 ≤ fd < 1024;
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns __fc_fds[fd], \result;
+    assigns __fc_fds[fd] \from fd, __fc_fds[fd];
+    assigns \result \from (indirect: fd), (indirect: __fc_fds[fd]);
+ */
+extern int close(int fd);
+
+/*@ requires valid_fildes: 0 ≤ fildes < 1024;
+    ensures
+      result_valid_fildes_or_error:
+        \result ≡ -1 ∨ (\old(fildes) ≤ \result < 1024);
+    assigns __fc_fds[fildes ..], \result;
+    assigns __fc_fds[fildes ..] \from fildes;
+    assigns \result \from fildes;
+ */
+extern int dup(int fildes);
+
+/*@ requires valid_fildes: 0 ≤ fildes < 1024;
+    requires valid_fildes2: 0 ≤ fildes2 < 1024;
+    ensures
+      result_fildes2_or_error: \result ≡ \old(fildes2) ∨ \result ≡ -1;
+    assigns __fc_fds[fildes2], \result;
+    assigns __fc_fds[fildes2] \from fildes, fildes2, __fc_fds[fildes2];
+    assigns \result
+      \from fildes, fildes2, __fc_fds[fildes], __fc_fds[fildes2];
+ */
+extern int dup2(int fildes, int fildes2);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    requires valid_string_arg: valid_read_string(arg);
+    assigns \result;
+    assigns \result \from *(path + (0 ..)), *(arg + (0 ..));
+ */
+extern int execl(char const *path, char const *arg, void * const *__va_params);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    requires valid_string_arg: valid_read_string(arg);
+    assigns \result;
+    assigns \result \from *(path + (0 ..)), *(arg + (0 ..));
+ */
+extern int execle(char const *path, char const *arg,
+                  void * const *__va_params);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    requires valid_string_arg: valid_read_string(arg);
+    assigns \result;
+    assigns \result \from *(path + (0 ..)), *(arg + (0 ..));
+ */
+extern int execlp(char const *path, char const *arg,
+                  void * const *__va_params);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    requires valid_string_argv0: valid_read_string(*(argv + 0));
+    assigns \result;
+    assigns \result \from *(path + (0 ..)), *(argv + (0 ..));
+ */
+extern int execv(char const *path, char * const *argv);
+
+/*@ requires valid_path: valid_read_string(path);
+    requires valid_argv0: valid_read_string(*(argv + 0));
+    assigns \result;
+    assigns \result \from *(path + (0 ..)), *(argv + (0 ..));
+ */
+extern int execve(char const *path, char * const *argv, char * const *env);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    requires valid_string_argv0: valid_read_string(*(argv + 0));
+    assigns \result;
+    assigns \result \from *(path + (0 ..)), *(argv + (0 ..));
+ */
+extern int execvp(char const *path, char * const *argv);
+
+/*@ ensures never_terminates: \false;
+    assigns \nothing; */
+extern  __attribute__((__noreturn__)) void _exit(int);
+
+/*@ ensures
+      result_ok_child_or_error:
+        \result ≡ 0 ∨ \result > 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+extern pid_t fork(void);
+
+/*@ requires valid_buf: \valid(buf + (0 .. size - 1));
+    ensures result_ok_or_error: \result ≡ \null ∨ \result ≡ \old(buf);
+    assigns *(buf + (0 .. size - 1)), \result;
+    assigns *(buf + (0 .. size - 1)) \from (indirect: buf), (indirect: size);
+    assigns \result \from buf, (indirect: size);
+ */
+extern char *getcwd(char *buf, size_t size);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern gid_t getegid(void);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern uid_t geteuid(void);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern gid_t getgid(void);
+
+extern char volatile __fc_hostname[64];
+
+/*@ requires name_has_room: \valid(name + (0 .. len - 1));
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, *(name + (0 .. len - 1));
+    assigns \result
+      \from (indirect: __fc_hostname[0 .. len]), (indirect: len);
+    assigns *(name + (0 .. len - 1))
+      \from (indirect: __fc_hostname[0 .. len]), (indirect: len);
+ */
+extern int gethostname(char *name, size_t len);
+
+/*@ requires name_valid_string: valid_read_nstring(name, len);
+    requires bounded_len: len ≤ 64;
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns __fc_hostname[0 .. len], \result;
+    assigns __fc_hostname[0 .. len]
+      \from *(name + (0 .. len - 1)), (indirect: len);
+    assigns \result \from (indirect: __fc_hostname[0 .. len]);
+ */
+extern int sethostname(char const *name, size_t len);
+
+/*@ assigns \result;
+    assigns \result \from (indirect: pid); */
+extern pid_t getpgid(pid_t pid);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern pid_t getpgrp(void);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern pid_t getpid(void);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern pid_t getppid(void);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern pid_t getsid(pid_t);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern uid_t getuid(void);
+
+/*@ ensures result_true_or_false: \result ≡ 0 ∨ \result ≡ 1;
+    assigns \result;
+    assigns \result \from (indirect: fd), (indirect: __fc_fds[fd]);
+ */
+extern int isatty(int fd);
+
+/*@ requires valid_fd: 0 ≤ fd < 1024;
+    requires valid_whence: whence ≡ 0 ∨ whence ≡ 1 ∨ whence ≡ 2;
+    ensures result_error_or_offset: \result ≡ -1 ∨ 0 ≤ \result;
+    assigns \result, __fc_fds[fd];
+    assigns \result
+      \from (indirect: fd), (indirect: __fc_fds[fd]), (indirect: offset),
+            (indirect: whence);
+    assigns __fc_fds[fd]
+      \from (indirect: fd), __fc_fds[fd], (indirect: offset),
+            (indirect: whence);
+ */
+extern off_t lseek(int fd, off_t offset, int whence);
+
+/*@ requires valid_path: valid_read_string(path);
+    assigns \result;
+    assigns \result \from (indirect: *(path + (0 ..))), (indirect: name);
+ */
+extern long pathconf(char const *path, int name);
+
+/*@ requires valid_pipefd: \valid(pipefd + (0 .. 1));
+    ensures initialization: pipefd: \initialized(\old(pipefd) + (0 .. 1));
+    ensures valid_fd0: 0 ≤ *(\old(pipefd) + 0) < 1024;
+    ensures valid_fd1: 0 ≤ *(\old(pipefd) + 1) < 1024;
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *(pipefd + (0 .. 1)), \result;
+    assigns *(pipefd + (0 .. 1)) \from (indirect: __fc_fds[0 ..]);
+    assigns \result \from (indirect: __fc_fds[0 ..]);
+ */
+extern int pipe(int * /*[2]*/ pipefd);
+
+/*@ requires valid_fd: 0 ≤ fd < 1024;
+    requires buf_has_room: \valid((char *)buf + (0 .. count - 1));
+    ensures
+      result_error_or_read_length:
+        (0 ≤ \result ≤ \old(count)) ∨ \result ≡ -1;
+    ensures
+      initialization: buf:
+        \initialized((char *)\old(buf) + (0 .. \result - 1));
+    assigns __fc_fds[fd], \result, *((char *)buf + (0 .. count - 1));
+    assigns __fc_fds[fd] \from __fc_fds[fd];
+    assigns \result \from (indirect: __fc_fds[fd]), (indirect: count);
+    assigns *((char *)buf + (0 .. count - 1))
+      \from (indirect: __fc_fds[fd]), (indirect: count);
+ */
+extern ssize_t read(int fd, void *buf, size_t count);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: gid);
+ */
+extern int setegid(gid_t gid);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: uid);
+ */
+extern int seteuid(uid_t uid);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: gid);
+ */
+extern int setgid(gid_t gid);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: pid), (indirect: pgid);
+ */
+extern int setpgid(pid_t pid, pid_t pgid);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: rgid), (indirect: egid);
+ */
+extern int setregid(gid_t rgid, gid_t egid);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: ruid), (indirect: euid);
+ */
+extern int setreuid(uid_t ruid, uid_t euid);
+
+/*@ ensures result_pgid_or_error: \result ≡ -1 ∨ \result ≥ 0;
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+extern pid_t setsid(void);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: uid);
+ */
+extern int setuid(uid_t uid);
+
+/*@ assigns \nothing; */
+extern void sync(void);
+
+/*@ assigns \result;
+    assigns \result \from (indirect: name); */
+extern long sysconf(int name);
+
+char volatile __fc_ttyname[32];
+char volatile *__fc_p_ttyname = __fc_ttyname;
+/*@ requires valid_fildes: 0 ≤ fildes < 1024;
+    ensures
+      result_name_or_null: \result ≡ __fc_p_ttyname ∨ \result ≡ \null;
+    assigns \result;
+    assigns \result \from __fc_p_ttyname, (indirect: fildes);
+ */
+extern char *ttyname(int fildes);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from *(path + (0 ..));
+ */
+extern int unlink(char const *path);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, Frama_C_entropy_source;
+    assigns \result
+      \from (indirect: usec), (indirect: Frama_C_entropy_source);
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern int usleep(useconds_t usec);
+
+/*@ requires valid_fd: 0 ≤ fd < 1024;
+    requires buf_has_room: \valid_read((char *)buf + (0 .. count - 1));
+    ensures
+      result_error_or_written_bytes:
+        \result ≡ -1 ∨ (0 ≤ \result ≤ \old(count));
+    assigns __fc_fds[fd], \result;
+    assigns __fc_fds[fd]
+      \from (indirect: fd), (indirect: count), __fc_fds[fd];
+    assigns \result
+      \from (indirect: fd), (indirect: count), (indirect: __fc_fds[fd]);
+ */
+extern ssize_t write(int fd, void const *buf, size_t count);
+
+/*@ requires valid_ruid: \valid(ruid);
+    requires valid_euid: \valid(suid);
+    requires valid_suid: \valid(euid);
+    ensures
+      initialization: result_ok_or_error:
+        (\result ≡ 0 ∧ \initialized(\old(ruid)) ∧
+         \initialized(\old(euid)) ∧ \initialized(\old(suid))) ∨
+        \result ≡ -1;
+    assigns *ruid, *euid, *suid, \result;
+    assigns *ruid \from \nothing;
+    assigns *euid \from \nothing;
+    assigns *suid \from \nothing;
+    assigns \result
+      \from (indirect: ruid), (indirect: euid), (indirect: suid);
+ */
+int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: ruid), (indirect: euid), (indirect: suid);
+ */
+int setresuid(uid_t ruid, uid_t euid, uid_t suid);
+
+/*@ requires valid_rgid: \valid(rgid);
+    requires valid_egid: \valid(sgid);
+    requires valid_sgid: \valid(egid);
+    ensures
+      initialization: result_ok_or_error:
+        (\result ≡ 0 ∧ \initialized(\old(rgid)) ∧
+         \initialized(\old(egid)) ∧ \initialized(\old(sgid))) ∨
+        \result ≡ -1;
+    assigns *rgid, *egid, *sgid, \result;
+    assigns *rgid \from \nothing;
+    assigns *egid \from \nothing;
+    assigns *sgid \from \nothing;
+    assigns \result
+      \from (indirect: rgid), (indirect: egid), (indirect: sgid);
+ */
+int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: rgid), (indirect: egid), (indirect: sgid);
+ */
+int setresgid(gid_t rgid, gid_t egid, gid_t sgid);
+
+extern char *optarg;
+
+int optind;
+
+extern int opterr;
+
+extern int optopt;
+
+/*@ assigns \result, *optarg, optind, opterr, optopt;
+    assigns \result
+      \from argc, *(argv + (0 .. argc - 1)), *(optstring + (0 ..));
+    assigns *optarg
+      \from argc, *(argv + (0 .. argc - 1)), *(optstring + (0 ..));
+    assigns optind
+      \from argc, *(argv + (0 .. argc - 1)), *(optstring + (0 ..));
+    assigns opterr
+      \from argc, *(argv + (0 .. argc - 1)), *(optstring + (0 ..));
+    assigns optopt
+      \from argc, *(argv + (0 .. argc - 1)), *(optstring + (0 ..));
+ */
+extern int getopt(int argc, char * const *argv, char const *optstring);
+
+/*@ assigns \result, *optarg, optind, opterr, optopt,
+            *((longopts + (0 ..))->flag);
+    assigns \result
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns *optarg
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns optind
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns opterr
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns optopt
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns *((longopts + (0 ..))->flag)
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+ */
+extern int getopt_long(int argc, char * const *argv, char const *shortopts,
+                       struct option const *longopts, int *longind);
+
+/*@ assigns \result, *optarg, optind, opterr, optopt,
+            *((longopts + (0 ..))->flag);
+    assigns \result
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns *optarg
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns optind
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns opterr
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns optopt
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns *((longopts + (0 ..))->flag)
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+ */
+extern int getopt_long_only(int argc, char * const *argv,
+                            char const *shortopts,
+                            struct option const *longopts, int *longind);
+
+int optind = 1;
+int glob(char const *pattern, int flags,
+         int (*errfunc)(char const *epath, int eerrno), glob_t *pglob);
+
+void globfree(glob_t *pglob);
+
+/*@ ghost extern int __fc_heap_status __attribute__((__FRAMA_C_MODEL__)); */
+
+/*@
+axiomatic dynamic_allocation {
+  predicate is_allocable{L}(ℤ n) 
+    reads __fc_heap_status;
+  
+  axiom never_allocable{L}:
+    ∀ ℤ i; i < 0 ∨ i > 4294967295U ⇒ ¬is_allocable(i);
+  
+  }
+
+*/
+/*@ requires valid_nptr: \valid_read(nptr);
+    assigns \result;
+    assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+ */
+extern double atof(char const *nptr);
+
+int atoi(char const *p);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    assigns \result;
+    assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+ */
+extern long atol(char const *nptr);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    assigns \result;
+    assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+ */
+extern long long atoll(char const *nptr);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    requires separation: \separated(nptr, endptr);
+    assigns \result, *endptr;
+    assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+    assigns *endptr
+      \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr);
+    
+    behavior no_storage:
+      assumes null_endptr: endptr ≡ \null;
+      assigns \result;
+      assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+    
+    behavior store_position:
+      assumes nonnull_endptr: endptr ≢ \null;
+      requires valid_endptr: \valid(endptr);
+      ensures initialization: \initialized(\old(endptr));
+      ensures valid_endptr: \valid_read(\old(endptr));
+      ensures position_subset: \subset(*\old(endptr), \old(nptr) + (0 ..));
+      assigns \result, *endptr;
+      assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+      assigns *endptr
+        \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr);
+    
+    complete behaviors store_position, no_storage;
+    disjoint behaviors store_position, no_storage;
+ */
+extern double strtod(char const * __restrict nptr, char ** __restrict endptr);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    requires separation: \separated(nptr, endptr);
+    assigns \result, *endptr;
+    assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+    assigns *endptr
+      \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr);
+    
+    behavior no_storage:
+      assumes null_endptr: endptr ≡ \null;
+      assigns \result;
+      assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+    
+    behavior store_position:
+      assumes nonnull_endptr: endptr ≢ \null;
+      requires valid_endptr: \valid(endptr);
+      ensures initialization: \initialized(\old(endptr));
+      ensures valid_endptr: \valid_read(\old(endptr));
+      ensures position_subset: \subset(*\old(endptr), \old(nptr) + (0 ..));
+      assigns \result, *endptr;
+      assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+      assigns *endptr
+        \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr);
+    
+    complete behaviors store_position, no_storage;
+    disjoint behaviors store_position, no_storage;
+ */
+extern float strtof(char const * __restrict nptr, char ** __restrict endptr);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    requires separation: \separated(nptr, endptr);
+    assigns \result, *endptr;
+    assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+    assigns *endptr
+      \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr);
+    
+    behavior no_storage:
+      assumes null_endptr: endptr ≡ \null;
+      assigns \result;
+      assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+    
+    behavior store_position:
+      assumes nonnull_endptr: endptr ≢ \null;
+      requires valid_endptr: \valid(endptr);
+      ensures initialization: \initialized(\old(endptr));
+      ensures valid_endptr: \valid_read(\old(endptr));
+      ensures position_subset: \subset(*\old(endptr), \old(nptr) + (0 ..));
+      assigns \result, *endptr;
+      assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+      assigns *endptr
+        \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr);
+    
+    complete behaviors store_position, no_storage;
+    disjoint behaviors store_position, no_storage;
+ */
+extern long double strtold(char const * __restrict nptr,
+                           char ** __restrict endptr);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    requires separation: \separated(nptr, endptr);
+    requires base_range: base ≡ 0 ∨ (2 ≤ base ≤ 36);
+    assigns \result, *endptr;
+    assigns \result
+      \from (indirect: nptr), (indirect: *(nptr + (0 ..))), (indirect: base);
+    assigns *endptr
+      \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr),
+            (indirect: base);
+    
+    behavior no_storage:
+      assumes null_endptr: endptr ≡ \null;
+      assigns \result;
+      assigns \result
+        \from (indirect: nptr), (indirect: *(nptr + (0 ..))),
+              (indirect: base);
+    
+    behavior store_position:
+      assumes nonnull_endptr: endptr ≢ \null;
+      requires valid_endptr: \valid(endptr);
+      ensures initialization: \initialized(\old(endptr));
+      ensures valid_endptr: \valid_read(\old(endptr));
+      ensures position_subset: \subset(*\old(endptr), \old(nptr) + (0 ..));
+      assigns \result, *endptr;
+      assigns \result
+        \from (indirect: nptr), (indirect: *(nptr + (0 ..))),
+              (indirect: base);
+      assigns *endptr
+        \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr),
+              (indirect: base);
+    
+    complete behaviors store_position, no_storage;
+    disjoint behaviors store_position, no_storage;
+ */
+extern long strtol(char const * __restrict nptr, char ** __restrict endptr,
+                   int base);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    requires separation: \separated(nptr, endptr);
+    requires base_range: base ≡ 0 ∨ (2 ≤ base ≤ 36);
+    assigns \result, *endptr;
+    assigns \result
+      \from (indirect: nptr), (indirect: *(nptr + (0 ..))), (indirect: base);
+    assigns *endptr
+      \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr),
+            (indirect: base);
+    
+    behavior no_storage:
+      assumes null_endptr: endptr ≡ \null;
+      assigns \result;
+      assigns \result
+        \from (indirect: nptr), (indirect: *(nptr + (0 ..))),
+              (indirect: base);
+    
+    behavior store_position:
+      assumes nonnull_endptr: endptr ≢ \null;
+      requires valid_endptr: \valid(endptr);
+      ensures initialization: \initialized(\old(endptr));
+      ensures valid_endptr: \valid_read(\old(endptr));
+      ensures position_subset: \subset(*\old(endptr), \old(nptr) + (0 ..));
+      assigns \result, *endptr;
+      assigns \result
+        \from (indirect: nptr), (indirect: *(nptr + (0 ..))),
+              (indirect: base);
+      assigns *endptr
+        \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr),
+              (indirect: base);
+    
+    complete behaviors store_position, no_storage;
+    disjoint behaviors store_position, no_storage;
+ */
+extern long long strtoll(char const * __restrict nptr,
+                         char ** __restrict endptr, int base);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    requires separation: \separated(nptr, endptr);
+    requires base_range: base ≡ 0 ∨ (2 ≤ base ≤ 36);
+    assigns \result, *endptr;
+    assigns \result
+      \from (indirect: nptr), (indirect: *(nptr + (0 ..))), (indirect: base);
+    assigns *endptr
+      \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr),
+            (indirect: base);
+    
+    behavior no_storage:
+      assumes null_endptr: endptr ≡ \null;
+      assigns \result;
+      assigns \result
+        \from (indirect: nptr), (indirect: *(nptr + (0 ..))),
+              (indirect: base);
+    
+    behavior store_position:
+      assumes nonnull_endptr: endptr ≢ \null;
+      requires valid_endptr: \valid(endptr);
+      ensures initialization: \initialized(\old(endptr));
+      ensures valid_endptr: \valid_read(\old(endptr));
+      ensures position_subset: \subset(*\old(endptr), \old(nptr) + (0 ..));
+      assigns \result, *endptr;
+      assigns \result
+        \from (indirect: nptr), (indirect: *(nptr + (0 ..))),
+              (indirect: base);
+      assigns *endptr
+        \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr),
+              (indirect: base);
+    
+    complete behaviors store_position, no_storage;
+    disjoint behaviors store_position, no_storage;
+ */
+extern unsigned long strtoul(char const * __restrict nptr,
+                             char ** __restrict endptr, int base);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    requires separation: \separated(nptr, endptr);
+    requires base_range: base ≡ 0 ∨ (2 ≤ base ≤ 36);
+    assigns \result, *endptr;
+    assigns \result
+      \from (indirect: nptr), (indirect: *(nptr + (0 ..))), (indirect: base);
+    assigns *endptr
+      \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr),
+            (indirect: base);
+    
+    behavior no_storage:
+      assumes null_endptr: endptr ≡ \null;
+      assigns \result;
+      assigns \result
+        \from (indirect: nptr), (indirect: *(nptr + (0 ..))),
+              (indirect: base);
+    
+    behavior store_position:
+      assumes nonnull_endptr: endptr ≢ \null;
+      requires valid_endptr: \valid(endptr);
+      ensures initialization: \initialized(\old(endptr));
+      ensures valid_endptr: \valid_read(\old(endptr));
+      ensures position_subset: \subset(*\old(endptr), \old(nptr) + (0 ..));
+      assigns \result, *endptr;
+      assigns \result
+        \from (indirect: nptr), (indirect: *(nptr + (0 ..))),
+              (indirect: base);
+      assigns *endptr
+        \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr),
+              (indirect: base);
+    
+    complete behaviors store_position, no_storage;
+    disjoint behaviors store_position, no_storage;
+ */
+extern unsigned long long strtoull(char const * __restrict nptr,
+                                   char ** __restrict endptr, int base);
+
+/*@ ghost
+extern int __fc_random_counter __attribute__((__unused__, __FRAMA_C_MODEL__));
+*/
+
+unsigned long const __fc_rand_max = (unsigned long)32767;
+/*@ ensures result_range: 0 ≤ \result ≤ __fc_rand_max;
+    assigns \result, __fc_random_counter;
+    assigns \result \from __fc_random_counter;
+    assigns __fc_random_counter \from __fc_random_counter;
+ */
+extern int rand(void);
+
+/*@ assigns __fc_random_counter;
+    assigns __fc_random_counter \from seed; */
+extern void srand(unsigned int seed);
+
+/*@ ensures result_range: 0 ≤ \result ≤ __fc_rand_max;
+    assigns \result;
+    assigns \result \from __fc_random_counter;
+ */
+extern long random(void);
+
+/*@ assigns __fc_random_counter;
+    assigns __fc_random_counter \from seed; */
+extern void srandom(unsigned int seed);
+
+int __fc_random48_init __attribute__((__FRAMA_C_MODEL__));
+unsigned short __fc_random48_counter[3] __attribute__((__FRAMA_C_MODEL__));
+unsigned short *__fc_p_random48_counter = __fc_random48_counter;
+/*@ ensures random48_initialized: __fc_random48_init ≡ 1;
+    assigns __fc_random48_counter[0 .. 2], __fc_random48_init;
+    assigns __fc_random48_counter[0 .. 2] \from seed;
+    assigns __fc_random48_init \from \nothing;
+ */
+extern void srand48(long seed);
+
+/*@ requires
+      initialization: initialized_seed16v: \initialized(seed16v + (0 .. 2));
+    ensures random48_initialized: __fc_random48_init ≡ 1;
+    ensures result_counter: \result ≡ __fc_p_random48_counter;
+    assigns __fc_random48_counter[0 .. 2], __fc_random48_init, \result;
+    assigns __fc_random48_counter[0 .. 2]
+      \from (indirect: *(seed16v + (0 .. 2)));
+    assigns __fc_random48_init \from \nothing;
+    assigns \result \from __fc_p_random48_counter;
+ */
+extern unsigned short *seed48(unsigned short * /*[3]*/ seed16v);
+
+/*@ ensures random48_initialized: __fc_random48_init ≡ 1;
+    assigns __fc_random48_counter[0 .. 2], __fc_random48_init;
+    assigns __fc_random48_counter[0 .. 2] \from *(param + (0 .. 5));
+    assigns __fc_random48_init \from \nothing;
+ */
+extern void lcong48(unsigned short * /*[7]*/ param);
+
+/*@ requires random48_initialized: __fc_random48_init ≡ 1;
+    ensures result_range: \is_finite(\result) ∧ 0.0 ≤ \result < 1.0;
+    assigns __fc_random48_counter[0 .. 2], \result;
+    assigns __fc_random48_counter[0 .. 2]
+      \from __fc_random48_counter[0 .. 2];
+    assigns \result \from __fc_random48_counter[0 .. 2];
+ */
+extern double drand48(void);
+
+/*@ requires
+      initialization: initialized_xsubi: \initialized(xsubi + (0 .. 2));
+    ensures result_range: \is_finite(\result) ∧ 0.0 ≤ \result < 1.0;
+    assigns __fc_random48_counter[0 .. 2], \result;
+    assigns __fc_random48_counter[0 .. 2]
+      \from __fc_random48_counter[0 .. 2];
+    assigns \result \from __fc_random48_counter[0 .. 2];
+ */
+extern double erand48(unsigned short * /*[3]*/ xsubi);
+
+/*@ requires random48_initialized: __fc_random48_init ≡ 1;
+    ensures result_range: 0 ≤ \result < 2147483648;
+    assigns __fc_random48_counter[0 .. 2], \result;
+    assigns __fc_random48_counter[0 .. 2]
+      \from __fc_random48_counter[0 .. 2];
+    assigns \result \from __fc_random48_counter[0 .. 2];
+ */
+extern long lrand48(void);
+
+/*@ requires
+      initialization: initialized_xsubi: \initialized(xsubi + (0 .. 2));
+    ensures result_range: 0 ≤ \result < 2147483648;
+    assigns __fc_random48_counter[0 .. 2], \result;
+    assigns __fc_random48_counter[0 .. 2]
+      \from __fc_random48_counter[0 .. 2];
+    assigns \result \from __fc_random48_counter[0 .. 2];
+ */
+extern long nrand48(unsigned short * /*[3]*/ xsubi);
+
+/*@ requires random48_initialized: __fc_random48_init ≡ 1;
+    ensures result_range: -2147483648 ≤ \result < 2147483648;
+    assigns __fc_random48_counter[0 .. 2], \result;
+    assigns __fc_random48_counter[0 .. 2]
+      \from __fc_random48_counter[0 .. 2];
+    assigns \result \from __fc_random48_counter[0 .. 2];
+ */
+extern long mrand48(void);
+
+/*@ requires
+      initialization: initialized_xsubi: \initialized(xsubi + (0 .. 2));
+    ensures result_range: -2147483648 ≤ \result < 2147483648;
+    assigns __fc_random48_counter[0 .. 2], \result;
+    assigns __fc_random48_counter[0 .. 2]
+      \from __fc_random48_counter[0 .. 2];
+    assigns \result \from __fc_random48_counter[0 .. 2];
+ */
+extern long jrand48(unsigned short * /*[3]*/ xsubi);
+
+void *calloc(size_t nmemb, size_t size);
+
+/*@ assigns __fc_heap_status, \result;
+    assigns __fc_heap_status \from size, __fc_heap_status;
+    assigns \result \from (indirect: size), (indirect: __fc_heap_status);
+    allocates \result;
+    
+    behavior allocation:
+      assumes can_allocate: is_allocable(size);
+      ensures allocation: \fresh{Old, Here}(\result,\old(size));
+      assigns __fc_heap_status, \result;
+      assigns __fc_heap_status \from size, __fc_heap_status;
+      assigns \result \from (indirect: size), (indirect: __fc_heap_status);
+    
+    behavior no_allocation:
+      assumes cannot_allocate: ¬is_allocable(size);
+      ensures null_result: \result ≡ \null;
+      assigns \result;
+      assigns \result \from \nothing;
+      allocates \nothing;
+    
+    complete behaviors no_allocation, allocation;
+    disjoint behaviors no_allocation, allocation;
+ */
+extern void *malloc(size_t size);
+
+/*@ requires freeable: p ≡ \null ∨ \freeable(p);
+    assigns __fc_heap_status;
+    assigns __fc_heap_status \from __fc_heap_status;
+    frees p;
+    
+    behavior deallocation:
+      assumes nonnull_p: p ≢ \null;
+      ensures freed: \allocable(\old(p));
+      assigns __fc_heap_status;
+      assigns __fc_heap_status \from __fc_heap_status;
+    
+    behavior no_deallocation:
+      assumes null_p: p ≡ \null;
+      assigns \nothing;
+      allocates \nothing;
+    
+    complete behaviors no_deallocation, deallocation;
+    disjoint behaviors no_deallocation, deallocation;
+ */
+extern void free(void *p);
+
+/*@ requires freeable: ptr ≡ \null ∨ \freeable(ptr);
+    assigns __fc_heap_status, \result;
+    assigns __fc_heap_status \from __fc_heap_status;
+    assigns \result \from size, ptr, __fc_heap_status;
+    frees ptr;
+    allocates \result;
+    
+    behavior allocation:
+      assumes can_allocate: is_allocable(size);
+      ensures allocation: \fresh{Old, Here}(\result,\old(size));
+      assigns \result;
+      assigns \result \from size, __fc_heap_status;
+      allocates \result;
+    
+    behavior deallocation:
+      assumes nonnull_ptr: ptr ≢ \null;
+      assumes can_allocate: is_allocable(size);
+      ensures freed: \allocable(\old(ptr));
+      ensures freeable: \result ≡ \null ∨ \freeable(\result);
+      frees ptr;
+    
+    behavior fail:
+      assumes cannot_allocate: ¬is_allocable(size);
+      ensures null_result: \result ≡ \null;
+      assigns \result;
+      assigns \result \from size, __fc_heap_status;
+      allocates \nothing;
+    
+    complete behaviors fail, deallocation, allocation;
+    disjoint behaviors allocation, fail;
+    disjoint behaviors deallocation, fail;
+ */
+extern void *realloc(void *ptr, size_t size);
+
+/*@ exits status: \exit_status ≢ 0;
+    ensures never_terminates: \false;
+    
+    assigns \exit_status \from \nothing;
+ */
+extern  __attribute__((__noreturn__)) void abort(void);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern int atexit(void (*func)(void));
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern int at_quick_exit(void (*func)(void));
+
+/*@ exits status: \exit_status ≡ \old(status);
+    ensures never_terminates: \false;
+    
+    assigns \exit_status \from status;
+ */
+extern  __attribute__((__noreturn__)) void exit(int status);
+
+/*@ ensures never_terminates: \false;
+    assigns \nothing; */
+extern  __attribute__((__noreturn__)) void _Exit(int status);
+
+char *__fc_env[4096] __attribute__((__FRAMA_C_MODEL__));
+char *getenv(char const *name);
+
+int putenv(char *string);
+
+int setenv(char const *name, char const *value, int overwrite);
+
+int unsetenv(char const *name);
+
+/*@ ensures never_terminates: \false;
+    assigns \nothing; */
+extern  __attribute__((__noreturn__)) void quick_exit(int status);
+
+/*@ requires
+      null_or_valid_string_command:
+        command ≡ \null ∨ valid_read_string(command);
+    assigns \result;
+    assigns \result
+      \from (indirect: command), (indirect: *(command + (0 ..)));
+ */
+extern int system(char const *command);
+
+/*@ requires valid_function_compar: \valid_function(compar);
+    ensures
+      null_or_correct_result:
+        \result ≡ \null ∨
+        \subset(\result,
+               (void *)((char *)\old(base) +
+                        (0 .. \old(size) * (\old(nmemb) - 1))));
+    assigns \result;
+    assigns \result
+      \from (indirect: key), *((char *)key + (0 .. size - 1)), base,
+            *((char *)base + (0 .. size * (nmemb - 1))), (indirect: nmemb),
+            (indirect: size), (indirect: *compar);
+ */
+extern void *bsearch(void const *key, void const *base, size_t nmemb,
+                     size_t size, int (*compar)(void const *, void const *));
+
+/*@ requires valid_function_compar: \valid_function(compar);
+    assigns *((char *)base + (0 ..));
+    assigns *((char *)base + (0 ..))
+      \from (indirect: base), *((char *)base + (0 ..)), (indirect: nmemb),
+            (indirect: size), (indirect: compar), (indirect: *compar);
+ */
+extern void qsort(void *base, size_t nmemb, size_t size,
+                  int (*compar)(void const *, void const *));
+
+int abs(int i);
+
+/*@ requires abs_representable: j > -2147483647L - 1L;
+    assigns \result;
+    assigns \result \from j;
+    
+    behavior negative:
+      assumes negative: j < 0;
+      ensures opposite_result: \result ≡ -\old(j);
+    
+    behavior nonnegative:
+      assumes nonnegative: j ≥ 0;
+      ensures same_result: \result ≡ \old(j);
+    
+    complete behaviors nonnegative, negative;
+    disjoint behaviors nonnegative, negative;
+ */
+extern long labs(long j);
+
+/*@ requires abs_representable: j > -9223372036854775807LL - 1LL;
+    assigns \result;
+    assigns \result \from j;
+    
+    behavior negative:
+      assumes negative: j < 0;
+      ensures opposite_result: \result ≡ -\old(j);
+    
+    behavior nonnegative:
+      assumes nonnegative: j ≥ 0;
+      ensures same_result: \result ≡ \old(j);
+    
+    complete behaviors nonnegative, negative;
+    disjoint behaviors nonnegative, negative;
+ */
+extern long long llabs(long long j);
+
+/*@ assigns \result;
+    assigns \result \from numer, denom; */
+extern div_t div(int numer, int denom);
+
+/*@ assigns \result;
+    assigns \result \from numer, denom; */
+extern ldiv_t ldiv(long numer, long denom);
+
+/*@ assigns \result;
+    assigns \result \from numer, denom; */
+extern lldiv_t lldiv(long long numer, long long denom);
+
+/*@ ghost extern int __fc_mblen_state; */
+
+/*@ assigns \result, __fc_mblen_state;
+    assigns \result
+      \from (indirect: s), (indirect: *(s + (0 ..))), (indirect: n),
+            __fc_mblen_state;
+    assigns __fc_mblen_state
+      \from (indirect: s), (indirect: *(s + (0 ..))), (indirect: n),
+            __fc_mblen_state;
+ */
+extern int mblen(char const *s, size_t n);
+
+/*@ ghost extern int __fc_mbtowc_state; */
+
+/*@ requires separation: \separated(pwc, s);
+    ensures consumed_range: \result ≤ \old(n);
+    assigns \result, *(pwc + (0 .. \result - 1)), __fc_mbtowc_state;
+    assigns \result
+      \from (indirect: s), (indirect: *(s + (0 .. n - 1))), (indirect: n),
+            __fc_mbtowc_state;
+    assigns *(pwc + (0 .. \result - 1))
+      \from (indirect: s), *(s + (0 .. n - 1)), (indirect: n),
+            __fc_mbtowc_state;
+    assigns __fc_mbtowc_state
+      \from (indirect: s), *(s + (0 .. n - 1)), (indirect: n),
+            __fc_mbtowc_state;
+ */
+extern int mbtowc(wchar_t * __restrict pwc, char const * __restrict s,
+                  size_t n);
+
+/*@ ghost extern int __fc_wctomb_state; */
+
+/*@ assigns \result, *(s + (0 ..)), __fc_wctomb_state;
+    assigns \result \from (indirect: wc), __fc_wctomb_state;
+    assigns *(s + (0 ..)) \from wc, __fc_wctomb_state;
+    assigns __fc_wctomb_state \from wc, __fc_wctomb_state;
+ */
+extern int wctomb(char *s, wchar_t wc);
+
+/*@ requires separation: \separated(pwcs, s);
+    assigns \result, *(pwcs + (0 .. n - 1));
+    assigns \result
+      \from (indirect: s), (indirect: *(s + (0 .. n - 1))), (indirect: n);
+    assigns *(pwcs + (0 .. n - 1))
+      \from (indirect: s), *(s + (0 .. n - 1)), (indirect: n);
+ */
+extern size_t mbstowcs(wchar_t * __restrict pwcs, char const * __restrict s,
+                       size_t n);
+
+/*@ requires separation: \separated(s, pwcs);
+    assigns \result, *(s + (0 .. n - 1));
+    assigns \result
+      \from (indirect: pwcs), (indirect: *(pwcs + (0 .. n - 1))),
+            (indirect: n);
+    assigns *(s + (0 .. n - 1))
+      \from (indirect: pwcs), *(pwcs + (0 .. n - 1)), (indirect: n);
+ */
+extern size_t wcstombs(char * __restrict s, wchar_t const * __restrict pwcs,
+                       size_t n);
+
+int posix_memalign(void **memptr, size_t alignment, size_t size);
+
+/*@ requires valid_template: valid_string(templat);
+    ensures
+      result_error_or_valid_fd: \result ≡ -1 ∨ (0 ≤ \result < 16);
+    assigns *(templat + (0 ..)), \result;
+    assigns *(templat + (0 ..)) \from \nothing;
+    assigns \result \from \nothing;
+ */
+extern int mkstemp(char *templat);
+
+char *realpath(char const * __restrict file_name,
+               char * __restrict resolved_name);
+
+int glob(char const *pattern, int flags,
+         int (*errfunc)(char const *epath, int eerrno), glob_t *pglob)
+{
+  int __retres;
+  int tmp;
+  unsigned int tmp_0;
+  char **tmp_1;
+  int tmp_4;
+  tmp = Frama_C_interval(0,10);
+  pglob->gl_pathc = (unsigned int)tmp;
+  if (flags & (1 << 3)) tmp_0 = pglob->gl_offs; else tmp_0 = (unsigned int)0;
+  size_t reserve_offs = tmp_0;
+  size_t prev_len = (unsigned int)0;
+  if (flags & (1 << 5)) 
+    while (*(pglob->gl_pathv + (reserve_offs + prev_len))) prev_len += (size_t)1;
+  if (flags & (1 << 5)) tmp_1 = pglob->gl_pathv; else tmp_1 = (char **)0;
+  char **path = tmp_1;
+  if (pglob->gl_pathc == (unsigned int)0) 
+    if (flags & (1 << 4)) {
+      pglob->gl_pathv = (char **)realloc((void *)path,
+                                         ((reserve_offs + prev_len) + (size_t)2) * sizeof(char *));
+      if (! pglob->gl_pathv) {
+        __retres = 1;
+        goto return_label;
+      }
+      {
+        size_t i = (unsigned int)0;
+        while (i < reserve_offs) {
+          *(pglob->gl_pathv + i) = (char *)0;
+          i += (size_t)1;
+        }
+      }
+      *(pglob->gl_pathv + (reserve_offs + prev_len)) = (char *)pattern;
+      *(pglob->gl_pathv + ((reserve_offs + prev_len) + (size_t)1)) = (char *)0;
+      __retres = 0;
+      goto return_label;
+    }
+    else {
+      __retres = 3;
+      goto return_label;
+    }
+  pglob->gl_pathv = (char **)realloc((void *)path,
+                                     (((reserve_offs + prev_len) + pglob->gl_pathc) + (size_t)1) * sizeof(char *));
+  if (! pglob->gl_pathv) {
+    __retres = 1;
+    goto return_label;
+  }
+  {
+    size_t i_0 = (unsigned int)0;
+    while (i_0 < reserve_offs) {
+      *(pglob->gl_pathv + i_0) = (char *)0;
+      i_0 += (size_t)1;
+    }
+  }
+  {
+    size_t i_1 = (unsigned int)0;
+    while (i_1 < pglob->gl_pathc) {
+      *(pglob->gl_pathv + ((reserve_offs + prev_len) + i_1)) = (char *)"glob result";
+      i_1 += (size_t)1;
+    }
+  }
+  *(pglob->gl_pathv + ((prev_len + reserve_offs) + pglob->gl_pathc)) = (char *)0;
+  tmp_4 = Frama_C_nondet(0,1);
+  if (tmp_4) {
+    __retres = 0;
+    goto return_label;
+  }
+  else {
+    if (errfunc) {
+      int tmp_3;
+      int tmp_2;
+      tmp_2 = Frama_C_interval(0,255);
+      tmp_3 = (*errfunc)("glob.c error path",tmp_2);
+      int res = tmp_3;
+      if (res) {
+        __retres = 2;
+        goto return_label;
+      }
+      else 
+        if (flags & (1 << 0)) {
+          __retres = 2;
+          goto return_label;
+        }
+    }
+    __retres = 0;
+    goto return_label;
+  }
+  return_label: return __retres;
+}
+
+void globfree(glob_t *pglob)
+{
+  if (pglob->gl_pathc > (unsigned int)0) free((void *)pglob->gl_pathv);
+  return;
+}
+
+intmax_t imaxabs(intmax_t c);
+
+imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom);
+
+/*@ assigns \result, *(endptr + (..)), __fc_errno;
+    assigns \result \from *(nptr + (..)), base;
+    assigns *(endptr + (..)) \from *(nptr + (..)), base;
+    assigns __fc_errno \from *(nptr + (..)), base;
+ */
+extern intmax_t strtoimax(char const * __restrict nptr,
+                          char ** __restrict endptr, int base);
+
+/*@ requires abs_representable: (long long)(-c) ≢ c;
+    assigns \result;
+    assigns \result \from c;
+ */
+intmax_t imaxabs(intmax_t c)
+{
+  intmax_t __retres;
+  if (c > (intmax_t)0) {
+    __retres = c;
+    goto return_label;
+  }
+  else {
+    __retres = - c;
+    goto return_label;
+  }
+  return_label: return __retres;
+}
+
+/*@ requires no_div_by_zero: denom ≢ 0;
+    requires no_overflow: denom ≢ -1 ∨ (long long)(-numer) ≢ numer;
+    ensures correct_div: \result.quot ≡ \old(numer) / \old(denom);
+    ensures correct_mod: \result.rem ≡ \old(numer) % \old(denom);
+    assigns \result;
+    assigns \result \from numer, denom;
+ */
+imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom)
+{
+  imaxdiv_t r;
+  r.quot = numer / denom;
+  r.rem = numer % denom;
+  return r;
+}
+
+extern struct lconv *__fc_locale;
+
+extern char *__fc_locale_names[512];
+
+char *setlocale(int category, char const *locale);
+
+struct lconv *localeconv(void);
+
+struct lconv __C_locale =
+  {.decimal_point = (char *)".",
+   .thousands_sep = (char *)"",
+   .grouping = (char *)"",
+   .int_curr_symbol = (char *)"",
+   .currency_symbol = (char *)"",
+   .mon_decimal_point = (char *)"",
+   .mon_thousands_sep = (char *)"",
+   .mon_grouping = (char *)"",
+   .positive_sign = (char *)"",
+   .negative_sign = (char *)"",
+   .int_frac_digits = (char)127,
+   .frac_digits = (char)127,
+   .p_cs_precedes = (char)127,
+   .p_sep_by_space = (char)127,
+   .n_cs_precedes = (char)127,
+   .n_sep_by_space = (char)127,
+   .p_sign_posn = (char)127,
+   .n_sign_posn = (char)127,
+   .int_p_cs_precedes = (char)127,
+   .int_p_sep_by_space = (char)127,
+   .int_n_cs_precedes = (char)127,
+   .int_n_sep_by_space = (char)127,
+   .int_p_sign_posn = (char)127,
+   .int_n_sign_posn = (char)127};
+struct lconv *__frama_c_locale = & __C_locale;
+char *__frama_c_locale_names[512] = {(char *)"C"};
+/*@ requires
+      locale_null_or_valid_string:
+        locale ≡ \null ∨ valid_read_string(locale);
+    ensures
+      result_null_or_locale_name:
+        \result ≡ \null ∨
+        (\valid(\result) ∧ (∃ ℤ i; \result ≡ __fc_locale_names[i]));
+    assigns __fc_locale, \result;
+    assigns __fc_locale \from category, *(locale + (..));
+    assigns \result \from __fc_locale, category, *(locale + (..));
+ */
+char *setlocale(int category, char const *locale)
+{
+  char *__retres;
+  if ((int)*locale == 'C') {
+    __frama_c_locale = & __C_locale;
+    __retres = __frama_c_locale_names[0];
+    goto return_label;
+  }
+  __retres = (char *)0;
+  return_label: return __retres;
+}
+
+/*@ ensures result_current_locale: \result ≡ __fc_locale;
+    assigns \nothing;
+ */
+struct lconv *localeconv(void)
+{
+  return __frama_c_locale;
+}
+
+/*@ assigns \result;
+    assigns \result \from x;
+    
+    behavior nan:
+      assumes is_nan: \is_NaN(x);
+      ensures fp_nan: \result ≡ 0;
+    
+    behavior inf:
+      assumes is_infinite: ¬\is_NaN(x) ∧ ¬\is_finite(x);
+      ensures fp_infinite: \result ≡ 1;
+    
+    behavior zero:
+      assumes is_a_zero: x ≡ 0.0;
+      ensures fp_zero: \result ≡ 2;
+    
+    behavior subnormal:
+      assumes is_finite: \is_finite(x);
+      assumes
+        is_subnormal:
+          (x > 0.0 ∧ x < 0x1p-126) ∨ (x < 0.0 ∧ x > -0x1p-126);
+      ensures fp_subnormal: \result ≡ 3;
+    
+    behavior normal:
+      assumes is_finite: \is_finite(x);
+      assumes not_subnormal: x ≤ -0x1p-126 ∨ x ≥ 0x1p-126;
+      ensures fp_normal: \result ≡ 4;
+    
+    complete behaviors normal, subnormal, zero, inf, nan;
+    disjoint behaviors normal, subnormal, zero, inf, nan;
+ */
+int __fc_fpclassifyf(float x);
+
+/*@ assigns \result;
+    assigns \result \from x;
+    
+    behavior nan:
+      assumes is_nan: \is_NaN(x);
+      ensures fp_nan: \result ≡ 0;
+    
+    behavior inf:
+      assumes is_infinite: ¬\is_NaN(x) ∧ ¬\is_finite(x);
+      ensures fp_infinite: \result ≡ 1;
+    
+    behavior zero:
+      assumes is_a_zero: x ≡ 0.0;
+      ensures fp_zero: \result ≡ 2;
+    
+    behavior subnormal:
+      assumes is_finite: \is_finite(x);
+      assumes
+        is_subnormal:
+          (x > 0.0 ∧ x < 0x1p-1022) ∨ (x < 0.0 ∧ x > -0x1p-1022);
+      ensures fp_subnormal: \result ≡ 3;
+    
+    behavior normal:
+      assumes is_finite: \is_finite(x);
+      assumes not_subnormal: x ≤ -0x1p-1022 ∨ x ≥ 0x1p-1022;
+      ensures fp_normal: \result ≡ 4;
+    
+    complete behaviors normal, subnormal, zero, inf, nan;
+    disjoint behaviors normal, subnormal, zero, inf, nan;
+ */
+int __fc_fpclassify(double x);
+
+/*@ requires in_domain: \is_finite(x) ∧ \abs(x) ≤ 1;
+    ensures positive_result: \is_finite(\result) ∧ \result ≥ 0;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double acos(double x);
+
+/*@ requires in_domain: \is_finite(x) ∧ \abs(x) ≤ 1;
+    ensures positive_result: \is_finite(\result) ∧ \result ≥ 0;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float acosf(float x);
+
+/*@ requires in_domain: \is_finite(x) ∧ \abs(x) ≤ 1;
+    ensures positive_result: \is_finite(\result) ∧ \result ≥ 0;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double acosl(long double x);
+
+/*@ requires in_domain: \is_finite(x) ∧ \abs(x) ≤ 1;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double asin(double x);
+
+/*@ requires in_domain: \is_finite(x) ∧ \abs(x) ≤ 1;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float asinf(float x);
+
+/*@ requires in_domain: \is_finite(x) ∧ \abs(x) ≤ 1;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double asinl(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1.571 ≤ \result ≤ 1.571;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float atanf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1.571 ≤ \result ≤ 1.571;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double atan(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1.571 ≤ \result ≤ 1.571;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double atanl(long double x);
+
+/*@ requires finite_args: \is_finite(x) ∧ \is_finite(y);
+    requires finite_result: \is_finite(atan2(x, y));
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x, y;
+ */
+extern double atan2(double y, double x);
+
+/*@ requires finite_args: \is_finite(x) ∧ \is_finite(y);
+    requires finite_logic_result: \is_finite(atan2f(x, y));
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x, y;
+ */
+extern float atan2f(float y, float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1. ≤ \result ≤ 1.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double cos(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1. ≤ \result ≤ 1.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float cosf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1. ≤ \result ≤ 1.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double cosl(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1. ≤ \result ≤ 1.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double sin(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1. ≤ \result ≤ 1.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float sinf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1. ≤ \result ≤ 1.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double sinl(long double x);
+
+/*@ assigns __fc_errno, \result;
+    assigns __fc_errno \from x;
+    assigns \result \from x;
+    
+    behavior normal:
+      assumes in_domain: \is_finite(x) ∧ x ≥ 1;
+      ensures positive_result: \is_finite(\result) ∧ \result ≥ 0;
+      assigns \result;
+      assigns \result \from x;
+    
+    behavior infinite:
+      assumes is_plus_infinity: \is_plus_infinity(x);
+      ensures result_plus_infinity: \is_plus_infinity(\result);
+      assigns \result;
+      assigns \result \from x;
+    
+    behavior domain_error:
+      assumes
+        out_of_domain: \is_minus_infinity(x) ∨ (\is_finite(x) ∧ x < 1);
+      ensures errno_set: __fc_errno ≡ 1;
+      assigns __fc_errno, \result;
+      assigns __fc_errno \from x;
+      assigns \result \from x;
+    
+    disjoint behaviors domain_error, infinite, normal;
+ */
+extern double acosh(double x);
+
+/*@ assigns __fc_errno, \result;
+    assigns __fc_errno \from x;
+    assigns \result \from x;
+    
+    behavior normal:
+      assumes in_domain: \is_finite(x) ∧ x ≥ 1;
+      ensures positive_result: \is_finite(\result) ∧ \result ≥ 0;
+      assigns \result;
+      assigns \result \from x;
+    
+    behavior infinite:
+      assumes is_plus_infinity: \is_plus_infinity(x);
+      ensures result_plus_infinity: \is_plus_infinity(\result);
+      assigns \result;
+      assigns \result \from x;
+    
+    behavior domain_error:
+      assumes
+        out_of_domain: \is_minus_infinity(x) ∨ (\is_finite(x) ∧ x < 1);
+      ensures errno_set: __fc_errno ≡ 1;
+      assigns __fc_errno, \result;
+      assigns __fc_errno \from x;
+      assigns \result \from x;
+    
+    disjoint behaviors domain_error, infinite, normal;
+ */
+extern float acoshf(float x);
+
+/*@ assigns __fc_errno, \result;
+    assigns __fc_errno \from x;
+    assigns \result \from x;
+    
+    behavior normal:
+      assumes in_domain: \is_finite(x) ∧ x ≥ 1;
+      ensures positive_result: \is_finite(\result) ∧ \result ≥ 0;
+      assigns \result;
+      assigns \result \from x;
+    
+    behavior infinite:
+      assumes is_plus_infinity: \is_plus_infinity(x);
+      ensures result_plus_infinity: \is_plus_infinity(\result);
+      assigns \result;
+      assigns \result \from x;
+    
+    behavior domain_error:
+      assumes
+        out_of_domain: \is_minus_infinity(x) ∨ (\is_finite(x) ∧ x < 1);
+      ensures errno_set: __fc_errno ≡ 1;
+      assigns __fc_errno, \result;
+      assigns __fc_errno \from x;
+      assigns \result \from x;
+    
+    disjoint behaviors domain_error, infinite, normal;
+ */
+extern long double acoshl(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires finite_domain: x ≤ 0x1.62e42fefa39efp+9;
+    ensures res_finite: \is_finite(\result);
+    ensures positive_result: \result > 0.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double exp(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires res_finite: x ≤ 0x1.62e42ep+6;
+    ensures res_finite: \is_finite(\result);
+    ensures positive_result: \result > 0.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float expf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double log(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float logf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_pos: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double logl(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double log10(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float log10f(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_postive: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double log10l(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double log2(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float log2f(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double log2l(long double x);
+
+double fabs(double x);
+
+float fabsf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures res_finite: \is_finite(\result);
+    ensures positive_result: \result ≥ 0.;
+    ensures
+      equal_magnitude_result: \result ≡ \old(x) ∨ \result ≡ -\old(x);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double fabsl(long double x);
+
+/*@ requires finite_args: \is_finite(x) ∧ \is_finite(y);
+    requires finite_logic_res: \is_finite(pow(x, y));
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x, y;
+ */
+extern double pow(double x, double y);
+
+/*@ requires finite_args: \is_finite(x) ∧ \is_finite(y);
+    requires finite_logic_res: \is_finite(powf(x, y));
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x, y;
+ */
+extern float powf(float x, float y);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x ≥ -0.;
+    ensures finite_result: \is_finite(\result);
+    ensures positive_result: \result ≥ -0.;
+    ensures result_value: \result ≡ sqrt(\old(x));
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double sqrt(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x ≥ -0.;
+    ensures finite_result: \is_finite(\result);
+    ensures positive_result: \result ≥ -0.;
+    ensures result_value: \result ≡ sqrtf(\old(x));
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float sqrtf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x ≥ -0.;
+    ensures finite_result: \is_finite(\result);
+    ensures positive_result: \result ≥ -0.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double sqrtl(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double ceil(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float ceilf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double ceill(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double floor(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float floorf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double floorl(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double round(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float roundf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double roundl(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double trunc(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float truncf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double truncl(long double x);
+
+/*@ requires finite_args: \is_finite(x) ∧ \is_finite(y);
+    requires finite_logic_result: \is_finite(fmod(x, y));
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x, y;
+ */
+extern double fmod(double x, double y);
+
+/*@ requires finite_args: \is_finite(x) ∧ \is_finite(y);
+    requires finite_logic_result: \is_finite(fmodf(x, y));
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x, y;
+ */
+extern float fmodf(float x, float y);
+
+/*@ requires tagp_valid_string: valid_read_string(tagp);
+    ensures result_is_nan: \is_NaN(\result);
+    assigns \result;
+    assigns \result \from (indirect: *(tagp + (0 ..)));
+ */
+extern double nan(char const *tagp);
+
+/*@ requires tagp_valid_string: valid_read_string(tagp);
+    ensures result_is_nan: \is_NaN(\result);
+    assigns \result;
+    assigns \result \from (indirect: *(tagp + (0 ..)));
+ */
+extern float nanf(char const *tagp);
+
+/*@ requires tagp_valid_string: valid_read_string(tagp);
+    ensures result_is_nan: \is_NaN(\result);
+    assigns \result;
+    assigns \result \from (indirect: *(tagp + (0 ..)));
+ */
+extern long double nanl(char const *tagp);
+
+int __finitef(float f);
+
+int __finite(double d);
+
+/*@ logic float __fc_infinity(ℤ x) = \plus_infinity;
+ */
+/*@ logic float __fc_nan(ℤ x) = \NaN;
+
+*/
+/*@ ensures result_is_infinity: \is_plus_infinity(\result);
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+extern float __fc_infinity(int x);
+
+/*@ ensures result_is_nan: \is_NaN(\result);
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+extern float __fc_nan(int x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures res_finite: \is_finite(\result);
+    ensures positive_result: \result ≥ 0.;
+    ensures
+      equal_magnitude_result: \result ≡ \old(x) ∨ \result ≡ -\old(x);
+    assigns \result;
+    assigns \result \from x;
+ */
+double fabs(double x)
+{
+  double __retres;
+  if (x == 0.0) {
+    __retres = 0.0;
+    goto return_label;
+  }
+  if (x > 0.0) {
+    __retres = x;
+    goto return_label;
+  }
+  __retres = - x;
+  return_label: return __retres;
+}
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures res_finite: \is_finite(\result);
+    ensures positive_result: \result ≥ 0.;
+    ensures
+      equal_magnitude_result: \result ≡ \old(x) ∨ \result ≡ -\old(x);
+    assigns \result;
+    assigns \result \from x;
+ */
+float fabsf(float x)
+{
+  float __retres;
+  if (x == 0.0f) {
+    __retres = 0.0f;
+    goto return_label;
+  }
+  else 
+    if (x > 0.0f) {
+      __retres = x;
+      goto return_label;
+    }
+    else {
+      __retres = - x;
+      goto return_label;
+    }
+  return_label: return __retres;
+}
+
+int __finitef(float f)
+{
+  int __retres;
+  union __fc_u_finitef u;
+  unsigned short usExp;
+  u.f = f;
+  usExp = (unsigned short)((int)u.w[1] & 0x7F80);
+  usExp = (unsigned short)((int)usExp >> 7);
+  __retres = ! ((int)usExp == 0xff);
+  return __retres;
+}
+
+int __finite(double d)
+{
+  int __retres;
+  union __fc_u_finite u;
+  unsigned short usExp;
+  u.d = d;
+  usExp = (unsigned short)((int)u.w[3] & 0x7F80);
+  usExp = (unsigned short)((int)usExp >> 7);
+  __retres = ! ((int)usExp == 0xff);
+  return __retres;
+}
+
+/*@ assigns \nothing; */
+extern void (*signal(int sig, void (*func)(int )))(int );
+
+/*@ ensures never_terminates: \false;
+    assigns \nothing; */
+extern int raise(int sig);
+
+/*@ requires valid_set: \valid(set);
+    ensures initialization: set: \initialized(\old(set));
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *set, \result;
+    assigns *set \from \nothing;
+    assigns \result \from \nothing;
+ */
+extern int sigemptyset(sigset_t *set);
+
+/*@ requires valid_set: \valid(set);
+    ensures initialization: set: \initialized(\old(set));
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *set, \result;
+    assigns *set \from \nothing;
+    assigns \result \from \nothing;
+ */
+extern int sigfillset(sigset_t *set);
+
+/*@ requires valid_set: \valid(set);
+    requires initialization: set: \initialized(set);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *set, \result;
+    assigns *set \from (indirect: signum);
+    assigns \result \from signum;
+ */
+extern int sigaddset(sigset_t *set, int signum);
+
+/*@ requires valid_set: \valid(set);
+    requires initialization: set: \initialized(set);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *set, \result;
+    assigns *set \from (indirect: signum);
+    assigns \result \from signum;
+ */
+extern int sigdelset(sigset_t *set, int signum);
+
+/*@ requires valid_read_set: \valid_read(set);
+    requires initialization: set: \initialized(set);
+    ensures
+      result_found_not_found_or_error:
+        \result ≡ 0 ∨ \result ≡ 1 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from *set, signum;
+ */
+extern int sigismember(sigset_t const *set, int signum);
+
+struct sigaction __fc_sigaction[64 + 1];
+struct sigaction *__fc_p_sigaction = __fc_sigaction;
+/*@ requires valid_signal: 0 ≤ signum ≤ 64;
+    requires valid_oldact_or_null: oldact ≡ \null ∨ \valid(oldact);
+    requires valid_read_act_or_null: act ≡ \null ∨ \valid_read(act);
+    requires separation: separated_acts: \separated(act, oldact);
+    ensures
+      act_changed:
+        \old(act) ≡ \null ∨
+        \subset(*(__fc_p_sigaction + \old(signum)), *\old(act));
+    ensures
+      oldact_assigned:
+        \old(oldact) ≡ \null ∨
+        *\old(oldact) ∈ *(__fc_p_sigaction + \old(signum));
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *oldact, *(__fc_p_sigaction + signum), \result;
+    assigns *oldact \from __fc_p_sigaction;
+    assigns *(__fc_p_sigaction + signum) \from *act;
+    assigns \result
+      \from (indirect: signum), (indirect: act), (indirect: *act),
+            (indirect: oldact), (indirect: *oldact);
+ */
+extern int sigaction(int signum, struct sigaction const * __restrict act,
+                     struct sigaction * __restrict oldact);
+
+/*@ requires valid_set_or_null: set ≡ \null ∨ \valid_read(set);
+    requires valid_how: set ≢ \null ⇒ how ∈ {0, 2, 1};
+    requires valid_oldset_or_null: oldset ≡ \null ∨ \valid(oldset);
+    requires
+      separation: (set ≡ oldset ≡ \null) ∨ \separated(set, oldset);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    ensures
+      initialization: oldset_initialized:
+        \old(oldset) ≢ \null ∧ \result ≡ 0 ⇒
+        \initialized(\old(oldset));
+    assigns \result, *oldset;
+    assigns \result
+      \from (indirect: how), (indirect: set), (indirect: oldset);
+    assigns *oldset \from (indirect: how), (indirect: oldset);
+ */
+extern int sigprocmask(int how, sigset_t const * __restrict set,
+                       sigset_t * __restrict oldset);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: pid), (indirect: sig);
+ */
+extern int kill(pid_t pid, int sig);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: pgrp), (indirect: sig);
+ */
+extern int killpg(pid_t pgrp, int sig);
+
+/*@ requires valid_read_iov: \valid_read(iov + (0 .. iovcnt - 1));
+    assigns *((char *)(iov + (0 .. iovcnt - 1))->iov_base + (0 ..));
+ */
+extern ssize_t readv(int fd, struct iovec const *iov, int iovcnt);
+
+/*@ ghost struct __fc_sockfds_type __fc_sockfds[1024]; */
+/*@ ghost extern int __fc_socket_counter __attribute__((__FRAMA_C_MODEL__));
+*/
+
+/*@ ghost int volatile __fc_open_sock_fds; */
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    ensures
+      result_error_or_valid_new_sockfd:
+        \result ≡ -1 ∨ (0 ≤ \result < 1024);
+    assigns \result, *((char *)addr + (0 .. *addrlen - 1)),
+            __fc_sockfds[sockfd];
+    assigns \result \from *addr, *addrlen, __fc_sockfds[sockfd];
+    assigns *((char *)addr + (0 .. *addrlen - 1))
+      \from *addr, *addrlen, __fc_sockfds[sockfd];
+    assigns __fc_sockfds[sockfd] \from *addr, *addrlen, __fc_sockfds[sockfd];
+    
+    behavior addr_null:
+      assumes addr_is_null: addr ≡ \null;
+      requires addrlen_should_be_null: addrlen ≡ \null;
+      assigns \result, __fc_sockfds[sockfd];
+      assigns \result \from __fc_sockfds[sockfd];
+      assigns __fc_sockfds[sockfd] \from __fc_sockfds[sockfd];
+    
+    behavior addr_not_null:
+      assumes addr_is_not_null: addr ≢ \null;
+      requires valid_addrlen: \valid(addrlen);
+      requires addr_has_room: \valid((char *)addr + (0 .. *addrlen - 1));
+      ensures
+        initialization: addr:
+          \initialized((char *)\old(addr) + (0 .. *\old(addrlen) - 1));
+    
+    disjoint behaviors addr_not_null, addr_null;
+ */
+extern int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
+
+/*@ requires valid_sockfd: sockfd: 0 ≤ sockfd < 1024;
+    requires valid_read_addr: \valid_read((char *)addr + (0 .. addrlen - 1));
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns __fc_sockfds[sockfd], \result;
+    assigns __fc_sockfds[sockfd]
+      \from sockfd, *addr, addrlen, __fc_sockfds[sockfd];
+    assigns \result
+      \from (indirect: sockfd), (indirect: *addr), (indirect: addrlen),
+            (indirect: __fc_sockfds[sockfd]);
+ */
+extern int bind(int sockfd, struct sockaddr const *addr, socklen_t addrlen);
+
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    requires valid_read_addr: \valid_read((char *)addr + (0 .. addrlen - 1));
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns __fc_sockfds[sockfd], \result;
+    assigns __fc_sockfds[sockfd]
+      \from __fc_sockfds[sockfd], (indirect: sockfd), (indirect: addr),
+            (indirect: *addr), (indirect: addrlen);
+    assigns \result
+      \from (indirect: __fc_sockfds[sockfd]), (indirect: sockfd),
+            (indirect: addr), (indirect: *addr), (indirect: addrlen);
+ */
+extern int connect(int sockfd, struct sockaddr const *addr, socklen_t addrlen);
+
+/*@ requires valid_sockfd: 0 ≤ socket < 1024;
+    requires valid_address_len: \valid(address_len);
+    requires initialization: address_len: \initialized(address_len);
+    requires
+      valid_address: \valid((char *)address + (0 .. *address_len - 1));
+    ensures new_address_len: *\old(address_len) ≤ \old(*address_len);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *address_len, \result,
+            *((char *)address + (0 .. *address_len - 1));
+    assigns *address_len \from (indirect: socket), __fc_sockfds[socket];
+    assigns \result
+      \from (indirect: __fc_sockfds[socket]), (indirect: socket);
+    assigns *((char *)address + (0 .. *address_len - 1))
+      \from (indirect: __fc_sockfds[socket]), (indirect: socket);
+ */
+extern int getsockname(int socket, struct sockaddr * __restrict address,
+                       socklen_t * __restrict address_len);
+
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    requires valid_optlen: \valid(optlen);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *((char *)optval + (0 ..)), \result, *optlen;
+    assigns *((char *)optval + (0 ..))
+      \from (indirect: sockfd), (indirect: level), (indirect: optname),
+            (indirect: *optlen), (indirect: optval),
+            (indirect: __fc_sockfds[sockfd]);
+    assigns \result
+      \from (indirect: sockfd), (indirect: level), (indirect: optname),
+            (indirect: *optlen), (indirect: optval),
+            (indirect: __fc_sockfds[sockfd]);
+    assigns *optlen
+      \from (indirect: sockfd), (indirect: level), (indirect: optname),
+            *optlen, (indirect: optval), (indirect: __fc_sockfds[sockfd]);
+    
+    behavior so_error:
+      assumes optname_is_error: level ≡ 1 ∧ optname ≡ 4;
+      requires valid_optlen: \valid(optlen);
+      requires optlen_value: *optlen ≡ sizeof(int);
+      requires valid_optval: \valid((int *)optval);
+      assigns *((int *)optval), \result;
+      assigns *((int *)optval)
+        \from (indirect: sockfd), (indirect: optlen),
+              (indirect: __fc_sockfds[sockfd]);
+      assigns \result
+        \from (indirect: sockfd), (indirect: optlen),
+              (indirect: __fc_sockfds[sockfd]);
+    
+    behavior other_options:
+      assumes optname_not_error: ¬(level ≡ 1 ∧ optname ≡ 4);
+      requires
+        optval_null_or_valid:
+          optval ≡ \null ∨ \valid((char *)optval + (0 ..));
+      assigns *((char *)optval + (0 ..)), \result, *optlen;
+      assigns *((char *)optval + (0 ..))
+        \from (indirect: sockfd), (indirect: level), (indirect: optname),
+              (indirect: *optlen), (indirect: optval),
+              (indirect: __fc_sockfds[sockfd]);
+      assigns \result
+        \from (indirect: sockfd), (indirect: level), (indirect: optname),
+              (indirect: *optlen), (indirect: optval),
+              (indirect: __fc_sockfds[sockfd]);
+      assigns *optlen
+        \from (indirect: sockfd), (indirect: level), (indirect: optname),
+              *optlen, (indirect: optval), (indirect: __fc_sockfds[sockfd]);
+    
+    complete behaviors other_options, so_error;
+    disjoint behaviors other_options, so_error;
+ */
+extern int getsockopt(int sockfd, int level, int optname, void *optval,
+                      socklen_t *optlen);
+
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, __fc_sockfds[sockfd];
+    assigns \result \from sockfd, __fc_sockfds[sockfd];
+    assigns __fc_sockfds[sockfd] \from sockfd, backlog, __fc_sockfds[sockfd];
+ */
+extern int listen(int sockfd, int backlog);
+
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    requires valid_buffer_length: \valid((char *)buf + (0 .. len - 1));
+    ensures
+      result_error_or_received_length:
+        \result ≡ -1 ∨ (0 ≤ \result ≤ \old(len));
+    ensures
+      initialization: \initialized((char *)\old(buf) + (0 .. \result - 1));
+    assigns *((char *)buf + (0 .. len - 1)), __fc_sockfds[sockfd], \result;
+    assigns *((char *)buf + (0 .. len - 1))
+      \from sockfd, len, flags, __fc_sockfds[sockfd];
+    assigns __fc_sockfds[sockfd]
+      \from sockfd, len, flags, __fc_sockfds[sockfd];
+    assigns \result \from sockfd, len, flags, __fc_sockfds[sockfd];
+ */
+extern ssize_t recv(int sockfd, void *buf, size_t len, int flags);
+
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    requires
+      msg_control_has_room:
+        \valid((char *)hdr->msg_control + (0 .. hdr->msg_controllen - 1));
+    requires
+      msg_iov_has_room: \valid(hdr->msg_iov + (0 .. hdr->msg_iovlen - 1));
+    requires
+      msg_name_null_or_has_room:
+        hdr->msg_name ≡ \null ∨
+        \valid((char *)hdr->msg_name + (0 .. hdr->msg_namelen - 1));
+    ensures
+      result_error_or_received_length:
+        \result ≡ -1 ∨ (0 ≤ \result ≤ \old(hdr)->msg_iovlen);
+    assigns *((char *)hdr->msg_name + (0 .. hdr->msg_namelen - 1)),
+            hdr->msg_namelen,
+            *((char *)(hdr->msg_iov + (0 .. hdr->msg_iovlen - 1))->iov_base +
+              (0 ..)),
+            *((char *)hdr->msg_control + (0 .. hdr->msg_controllen - 1)),
+            \result, hdr->msg_controllen, hdr->msg_flags,
+            __fc_sockfds[sockfd];
+    assigns *((char *)hdr->msg_name + (0 .. hdr->msg_namelen - 1))
+      \from __fc_sockfds[sockfd];
+    assigns hdr->msg_namelen \from __fc_sockfds[sockfd];
+    assigns
+    *((char *)(hdr->msg_iov + (0 .. hdr->msg_iovlen - 1))->iov_base + (0 ..))
+      \from __fc_sockfds[sockfd];
+    assigns *((char *)hdr->msg_control + (0 .. hdr->msg_controllen - 1))
+      \from __fc_sockfds[sockfd];
+    assigns \result \from __fc_sockfds[sockfd];
+    assigns hdr->msg_controllen \from __fc_sockfds[sockfd];
+    assigns hdr->msg_flags \from __fc_sockfds[sockfd];
+    assigns __fc_sockfds[sockfd] \from __fc_sockfds[sockfd];
+ */
+extern ssize_t recvmsg(int sockfd, struct msghdr *hdr, int flags);
+
+/*@ requires available_sockfd: 0 ≤ sockfd < 1024;
+    requires buf_len_ok: \valid_read((char *)buf + (0 .. len - 1));
+    ensures
+      error_or_chars_sent: \result ≡ -1 ∨ (0 ≤ \result ≤ \old(len));
+    assigns __fc_errno, __fc_sockfds[sockfd], \result;
+    assigns __fc_errno
+      \from (indirect: sockfd), (indirect: __fc_sockfds[sockfd]),
+            (indirect: *((char *)buf + (0 .. len))), flags;
+    assigns __fc_sockfds[sockfd]
+      \from __fc_sockfds[sockfd], *((char *)buf + (0 .. len)), flags;
+    assigns \result
+      \from (indirect: sockfd), (indirect: __fc_sockfds[sockfd]),
+            (indirect: *((char *)buf + (0 .. len))), (indirect: flags);
+ */
+extern ssize_t send(int sockfd, void const *buf, size_t len, int flags);
+
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    requires
+      optval_null_or_has_room:
+        optval ≡ \null ∨ \valid_read((char *)optval + (0 .. optlen - 1));
+    ensures result_error_or_ok: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, __fc_sockfds[sockfd];
+    assigns \result
+      \from __fc_sockfds[sockfd], level, optname,
+            *((char *)optval + (0 .. optlen - 1)), optlen;
+    assigns __fc_sockfds[sockfd]
+      \from __fc_sockfds[sockfd], level, optname,
+            *((char *)optval + (0 .. optlen - 1)), optlen;
+ */
+extern int setsockopt(int sockfd, int level, int optname, void const *optval,
+                      socklen_t optlen);
+
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    ensures result_error_or_ok: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, __fc_sockfds[sockfd];
+    assigns \result \from how, __fc_sockfds[sockfd];
+    assigns __fc_sockfds[sockfd] \from how, __fc_sockfds[sockfd];
+ */
+extern int shutdown(int sockfd, int how);
+
+/*@ ensures
+      result_error_or_valid_new_sockfd:
+        (0 ≤ \result < 1024) ∨ \result ≡ -1;
+    assigns \result, __fc_socket_counter;
+    assigns \result
+      \from (indirect: domain), (indirect: type), (indirect: protocol),
+            (indirect: __fc_socket_counter);
+    assigns __fc_socket_counter
+      \from (indirect: domain), (indirect: type), (indirect: protocol),
+            __fc_socket_counter;
+ */
+extern int socket(int domain, int type, int protocol);
+
+/*@ requires valid_socket_sector: \valid(sv + (0 .. 1));
+    ensures result_error_or_ok: \result ≡ 0 ∨ \result ≡ -1;
+    ensures initialization: sv: \initialized(\old(sv) + (0 .. 1));
+    ensures valid_new_sockfd: sv0: 0 ≤ *(\old(sv) + 0) < 1024;
+    ensures valid_new_sockfd: sv1: 0 ≤ *(\old(sv) + 1) < 1024;
+    assigns \result, __fc_socket_counter, *(sv + (0 .. 1));
+    assigns \result \from __fc_socket_counter;
+    assigns __fc_socket_counter \from __fc_socket_counter;
+    assigns *(sv + (0 .. 1)) \from __fc_socket_counter;
+ */
+extern int socketpair(int domain, int type, int protocol, int * /*[2]*/ sv);
+
+struct in6_addr const in6addr_any = {.s6_addr = {(unsigned char)0}};
+struct in6_addr const in6addr_loopback =
+  {.s6_addr = {(unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF}};
+/*@ assigns \result;
+    assigns \result \from arg; */
+extern uint32_t htonl(uint32_t arg);
+
+/*@ assigns \result;
+    assigns \result \from arg; */
+extern uint16_t htons(uint16_t arg);
+
+/*@ assigns \result;
+    assigns \result \from arg; */
+extern uint32_t ntohl(uint32_t arg);
+
+/*@ assigns \result;
+    assigns \result \from arg; */
+extern uint16_t ntohs(uint16_t arg);
+
+/*@ requires valid_arg: valid_read_string(arg);
+    assigns \result;
+    assigns \result \from (indirect: *(arg + (0 ..)));
+ */
+extern in_addr_t inet_addr(char const *arg);
+
+char volatile __fc_inet_ntoa_array[16];
+char *__fc_inet_ntoa = (char *)(__fc_inet_ntoa_array);
+/*@ ensures result_static_string: \result ≡ __fc_inet_ntoa;
+    ensures result_null_terminated: *(\result + 15) ≡ 0;
+    ensures result_valid_string: valid_read_string(\result);
+    assigns \result, *(__fc_inet_ntoa + (0 ..));
+    assigns \result \from (indirect: arg), __fc_inet_ntoa;
+    assigns *(__fc_inet_ntoa + (0 ..)) \from (indirect: arg);
+ */
+extern char *inet_ntoa(struct in_addr arg);
+
+/*@ assigns \result, *(dst + (0 .. size - 1));
+    assigns \result \from dst, af, *((char *)src + (0 ..));
+    assigns *(dst + (0 .. size - 1)) \from af, *((char *)src + (0 ..));
+ */
+extern char const *inet_ntop(int af, void const *src, char *dst,
+                             socklen_t size);
+
+/*@ assigns \result, *((char *)dst + (0 ..));
+    assigns \result \from af, *(src + (..));
+    assigns *((char *)dst + (0 ..)) \from af, *(src + (0 ..));
+ */
+extern int inet_pton(int af, char const *src, void *dst);
+
+int h_errno;
+/*@ requires addrinfo_valid: \valid(addrinfo);
+    ensures allocation: \allocable(\old(addrinfo));
+    assigns \nothing;
+    frees addrinfo;
+ */
+extern void freeaddrinfo(struct addrinfo *addrinfo);
+
+char *__fc_gai_strerror = (char *)"<error message reported by gai_strerror>";
+/*@ ensures result_string: \result ≡ __fc_gai_strerror;
+    ensures result_valid_string: valid_read_string(\result);
+    assigns \result;
+    assigns \result \from (indirect: errcode), __fc_gai_strerror;
+ */
+extern char const *gai_strerror(int errcode);
+
+int getaddrinfo(char const * __restrict nodename,
+                char const * __restrict servname,
+                struct addrinfo const * __restrict hints,
+                struct addrinfo ** __restrict res);
+
+struct hostent *gethostbyname(char const *name);
+
+/*@
+predicate non_escaping{L}(void *s, ℤ n) =
+  ∀ ℤ i; 0 ≤ i < n ⇒ ¬\dangling((char *)s + i);
+ */
+/*@
+predicate empty_block{L}(void *s) =
+  \block_length((char *)s) ≡ 0 ∧ \offset((char *)s) ≡ 0;
+ */
+/*@
+predicate valid_or_empty{L}(void *s, size_t n) =
+  (empty_block(s) ∨ \valid_read((char *)s)) ∧
+  \valid((char *)s + (0 .. n - 1));
+ */
+/*@
+predicate valid_read_or_empty{L}(void *s, size_t n) =
+  (empty_block(s) ∨ \valid_read((char *)s)) ∧
+  \valid_read((char *)s + (1 .. n - 1));
+
+*/
+int memcmp(void const *s1, void const *s2, size_t n);
+
+void *memchr(void const *s, int c, size_t n);
+
+void *memcpy(void * __restrict dest, void const * __restrict src, size_t n);
+
+void *memmove(void *dest, void const *src, size_t n);
+
+void *memset(void *s, int c, size_t n);
+
+size_t strlen(char const *s);
+
+size_t strnlen(char const *s, size_t maxlen);
+
+int strcmp(char const *s1, char const *s2);
+
+int strncmp(char const *s1, char const *s2, size_t n);
+
+/*@ requires valid_string_s1: valid_read_string(s1);
+    requires valid_string_s2: valid_read_string(s2);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s1 + (0 ..))), (indirect: *(s2 + (0 ..)));
+ */
+extern int strcoll(char const *s1, char const *s2);
+
+char *strchr(char const *s, int c);
+
+/*@ requires valid_string_s: valid_read_string(s);
+    ensures
+      result_same_base: \subset(\result, \old(s) + (0 .. strlen(\old(s))));
+    assigns \result;
+    assigns \result
+      \from s, (indirect: *(s + (0 .. strlen{Old}(s)))), (indirect: c);
+ */
+extern char *strchrnul(char const *s, int c);
+
+char *strrchr(char const *s, int c);
+
+/*@ requires valid_string_s: valid_read_string(s);
+    requires valid_string_reject: valid_read_string(reject);
+    ensures result_bounded: 0 ≤ \result ≤ strlen(\old(s));
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s + (0 ..))), (indirect: *(reject + (0 ..)));
+ */
+extern size_t strcspn(char const *s, char const *reject);
+
+/*@ requires valid_string_s: valid_read_string(s);
+    requires valid_string_accept: valid_read_string(accept);
+    ensures result_bounded: 0 ≤ \result ≤ strlen(\old(s));
+    assigns \result, \result;
+    assigns \result \from *(s + (0 ..)), *(accept + (0 ..));
+    assigns \result
+      \from (indirect: *(s + (0 ..))), (indirect: *(accept + (0 ..)));
+ */
+extern size_t strspn(char const *s, char const *accept);
+
+/*@ requires valid_string_s: valid_read_string(s);
+    requires valid_string_accept: valid_read_string(accept);
+    ensures
+      result_null_or_same_base:
+        \result ≡ \null ∨ \base_addr(\result) ≡ \base_addr(\old(s));
+    assigns \result;
+    assigns \result \from s, *(s + (0 ..)), *(accept + (0 ..));
+ */
+extern char *strpbrk(char const *s, char const *accept);
+
+char *strstr(char const *haystack, char const *needle);
+
+/*@ requires valid_string_haystack: valid_read_string(haystack);
+    requires valid_string_needle: valid_read_string(needle);
+    ensures
+      result_null_or_in_haystack:
+        \result ≡ \null ∨
+        (\subset(\result, \old(haystack) + (0 ..)) ∧ \valid_read(\result));
+    assigns \result;
+    assigns \result
+      \from haystack, (indirect: *(haystack + (0 ..))),
+            (indirect: *(needle + (0 ..)));
+ */
+extern char *strcasestr(char const *haystack, char const *needle);
+
+char *__fc_strtok_ptr;
+/*@ requires valid_string_delim: valid_read_string(delim);
+    assigns *(s + (0 ..)), *(__fc_strtok_ptr + (0 ..)), \result,
+            __fc_strtok_ptr;
+    assigns *(s + (0 ..))
+      \from *(s + (0 ..)), (indirect: s), (indirect: __fc_strtok_ptr),
+            (indirect: *(delim + (0 ..)));
+    assigns *(__fc_strtok_ptr + (0 ..))
+      \from *(__fc_strtok_ptr + (0 ..)), (indirect: s),
+            (indirect: __fc_strtok_ptr), (indirect: *(delim + (0 ..)));
+    assigns \result
+      \from s, __fc_strtok_ptr, (indirect: *(s + (0 ..))),
+            (indirect: *(__fc_strtok_ptr + (0 ..))),
+            (indirect: *(delim + (0 ..)));
+    assigns __fc_strtok_ptr
+      \from \old(__fc_strtok_ptr), s,
+            (indirect: *(__fc_strtok_ptr + (0 ..))),
+            (indirect: *(delim + (0 ..)));
+    
+    behavior new_str:
+      assumes s_not_null: s ≢ \null;
+      requires
+        valid_string_s_or_delim_not_found:
+          valid_string(s) ∨
+          (valid_read_string(s) ∧
+           (∀ int i;
+              0 ≤ i < strlen(delim) ⇒
+              ¬(strchr(s, *(delim + i)) ≡ \true)));
+      ensures
+        result_subset:
+          \result ≡ \null ∨ \subset(\result, \old(s) + (0 ..));
+      ensures ptr_subset: \subset(__fc_strtok_ptr, \old(s) + (0 ..));
+      assigns __fc_strtok_ptr, *(s + (0 ..)), \result;
+      assigns __fc_strtok_ptr
+        \from s, (indirect: *(s + (0 ..))), (indirect: *(delim + (0 ..)));
+      assigns *(s + (0 ..))
+        \from *(s + (0 ..)), (indirect: s), (indirect: *(delim + (0 ..)));
+      assigns \result
+        \from s, (indirect: *(s + (0 ..))), (indirect: *(delim + (0 ..)));
+    
+    behavior resume_str:
+      assumes s_null: s ≡ \null;
+      requires not_first_call: __fc_strtok_ptr ≢ \null;
+      ensures
+        result_subset:
+          \result ≡ \null ∨
+          \subset(\result, \old(__fc_strtok_ptr) + (0 ..));
+      ensures
+        ptr_subset: \subset(__fc_strtok_ptr, \old(__fc_strtok_ptr) + (0 ..));
+      assigns *(__fc_strtok_ptr + (0 ..)), __fc_strtok_ptr, \result;
+      assigns *(__fc_strtok_ptr + (0 ..))
+        \from *(__fc_strtok_ptr + (0 ..)), (indirect: __fc_strtok_ptr),
+              (indirect: *(delim + (0 ..)));
+      assigns __fc_strtok_ptr
+        \from \old(__fc_strtok_ptr), (indirect: *(__fc_strtok_ptr + (0 ..))),
+              (indirect: *(delim + (0 ..)));
+      assigns \result
+        \from __fc_strtok_ptr, (indirect: *(__fc_strtok_ptr + (0 ..))),
+              (indirect: *(delim + (0 ..)));
+    
+    complete behaviors resume_str, new_str;
+    disjoint behaviors resume_str, new_str;
+ */
+extern char *strtok(char * __restrict s, char const * __restrict delim);
+
+/*@ requires valid_string_delim: valid_read_string(delim);
+    requires valid_saveptr: \valid(saveptr);
+    assigns *(s + (0 ..)), *(*saveptr + (0 ..)), \result, *saveptr;
+    assigns *(s + (0 ..))
+      \from *(s + (0 ..)), (indirect: s), (indirect: *saveptr),
+            (indirect: *(delim + (0 ..)));
+    assigns *(*saveptr + (0 ..))
+      \from *(*saveptr + (0 ..)), (indirect: s), (indirect: *saveptr),
+            (indirect: *(delim + (0 ..)));
+    assigns \result
+      \from s, *saveptr, (indirect: *(s + (0 ..))),
+            (indirect: *(*saveptr + (0 ..))), (indirect: *(delim + (0 ..)));
+    assigns *saveptr
+      \from \old(*saveptr), s, (indirect: *(*saveptr + (0 ..))),
+            (indirect: *(delim + (0 ..)));
+    
+    behavior new_str:
+      assumes s_not_null: s ≢ \null;
+      requires
+        valid_string_s_or_delim_not_found:
+          valid_string(s) ∨
+          (valid_read_string(s) ∧
+           (∀ int i;
+              0 ≤ i < strlen(delim) ⇒
+              ¬(strchr(s, *(delim + i)) ≡ \true)));
+      ensures
+        result_subset:
+          \result ≡ \null ∨ \subset(\result, \old(s) + (0 ..));
+      ensures initialization: \initialized(\old(saveptr));
+      ensures saveptr_subset: \subset(*\old(saveptr), \old(s) + (0 ..));
+      assigns *saveptr, *(s + (0 ..)), \result;
+      assigns *saveptr
+        \from s, (indirect: *(s + (0 ..))), (indirect: *(delim + (0 ..)));
+      assigns *(s + (0 ..))
+        \from *(s + (0 ..)), (indirect: s), (indirect: *(delim + (0 ..)));
+      assigns \result
+        \from s, (indirect: *(s + (0 ..))), (indirect: *(delim + (0 ..)));
+    
+    behavior resume_str:
+      assumes s_null: s ≡ \null;
+      requires not_first_call: *saveptr ≢ \null;
+      requires initialization: saveptr: \initialized(saveptr);
+      ensures
+        result_subset:
+          \result ≡ \null ∨ \subset(\result, \old(*saveptr) + (0 ..));
+      ensures
+        saveptr_subset: \subset(*\old(saveptr), \old(*saveptr) + (0 ..));
+      assigns *(*saveptr + (0 ..)), *saveptr, \result;
+      assigns *(*saveptr + (0 ..))
+        \from *(*saveptr + (0 ..)), (indirect: *saveptr),
+              (indirect: *(delim + (0 ..)));
+      assigns *saveptr
+        \from \old(*saveptr), (indirect: *(*saveptr + (0 ..))),
+              (indirect: *(delim + (0 ..)));
+      assigns \result
+        \from *saveptr, (indirect: *(*saveptr + (0 ..))),
+              (indirect: *(delim + (0 ..)));
+    
+    complete behaviors resume_str, new_str;
+    disjoint behaviors resume_str, new_str;
+ */
+extern char *strtok_r(char * __restrict s, char const * __restrict delim,
+                      char ** __restrict saveptr);
+
+/*@ requires
+      valid_string_stringp: \valid(stringp) ∧ valid_string(*stringp);
+    requires valid_string_delim: valid_read_string(delim);
+    assigns *stringp, \result;
+    assigns *stringp \from *(delim + (..)), *(*(stringp + (..)));
+    assigns \result \from *(delim + (..)), *(*(stringp + (..)));
+ */
+extern char *strsep(char **stringp, char const *delim);
+
+char __fc_strerror[64];
+char * const __fc_p_strerror = __fc_strerror;
+char *strerror(int errnum);
+
+char *strcpy(char *dest, char const *src);
+
+char *strncpy(char *dest, char const *src, size_t n);
+
+/*@ requires valid_string_src: valid_read_string(src);
+    requires room_nstring: \valid(dest + (0 .. n - 1));
+    requires
+      separation:
+        \separated(
+          dest + (0 .. n - 1), src + (0 .. \max(n - 1, strlen(src)))
+          );
+    ensures
+      initialization:
+        \initialized(\old(dest) + (0 .. \min(strlen(\old(src)), \old(n) - 1)));
+    ensures bounded_result: \result ≡ strlen(\old(src));
+    assigns *(dest + (0 .. n - 1)), \result;
+    assigns *(dest + (0 .. n - 1)) \from *(src + (0 .. n - 1));
+    assigns \result
+      \from (indirect: src), (indirect: *(src + (0 .. n - 1))), (indirect: n);
+ */
+size_t strlcpy(char * __restrict dest, char const * __restrict src, size_t n);
+
+/*@ requires valid_string_src: valid_read_string(src);
+    requires room_string: \valid(dest + (0 .. strlen(src)));
+    requires
+      separation:
+        \separated(dest + (0 .. strlen(src)), src + (0 .. strlen(src)));
+    ensures equal_contents: strcmp(\old(dest), \old(src)) ≡ 0;
+    ensures points_to_end: \result ≡ \old(dest) + strlen(\old(dest));
+    assigns *(dest + (0 .. strlen{Old}(src))), \result;
+    assigns *(dest + (0 .. strlen{Old}(src)))
+      \from *(src + (0 .. strlen{Old}(src)));
+    assigns \result \from dest;
+ */
+extern char *stpcpy(char * __restrict dest, char const * __restrict src);
+
+char *strcat(char *dest, char const *src);
+
+char *strncat(char *dest, char const *src, size_t n);
+
+/*@ requires valid_string_src: valid_read_string(src);
+    requires valid_string_dest: valid_string(dest);
+    requires room_nstring: \valid(dest + (0 .. n - 1));
+    ensures
+      bounded_result: \result ≡ strlen(\old(dest)) + strlen(\old(src));
+    assigns *(dest + (strlen{Old}(dest) .. n)), \result;
+    assigns *(dest + (strlen{Old}(dest) .. n))
+      \from (indirect: n), *(src + (0 .. strlen{Old}(src)));
+    assigns \result
+      \from (indirect: src), (indirect: *(src + (0 .. n - 1))), (indirect: n);
+ */
+extern size_t strlcat(char * __restrict dest, char const * __restrict src,
+                      size_t n);
+
+/*@ requires valid_dest: \valid(dest + (0 .. n - 1));
+    requires valid_string_src: valid_read_string(src);
+    assigns *(dest + (0 .. n - 1)), \result;
+    assigns *(dest + (0 .. n - 1))
+      \from (indirect: *(src + (0 ..))), (indirect: n);
+    assigns \result \from dest;
+ */
+extern size_t strxfrm(char * __restrict dest, char const * __restrict src,
+                      size_t n);
+
+char *strdup(char const *s);
+
+char *strndup(char const *s, size_t n);
+
+char __fc_strsignal[64];
+char * const __fc_p_strsignal = __fc_strsignal;
+char *strsignal(int signum);
+
+/*@ requires valid_memory_area: \valid((char *)s + (0 .. n - 1));
+    ensures
+      s_initialized: initialization:
+        \initialized((char *)\old(s) + (0 .. \old(n) - 1));
+    ensures
+      zero_initialized: \subset(*((char *)\old(s) + (0 .. \old(n) - 1)), {0});
+    assigns *((char *)s + (0 .. n - 1));
+    assigns *((char *)s + (0 .. n - 1)) \from \nothing;
+ */
+extern void bzero(void *s, size_t n);
+
+int strcasecmp(char const *s1, char const *s2);
+
+/*@ requires valid_string_s1: valid_read_nstring(s1, n);
+    requires valid_string_s2: valid_read_nstring(s2, n);
+    assigns \result;
+    assigns \result
+      \from (indirect: n), (indirect: *(s1 + (0 .. n - 1))),
+            (indirect: *(s2 + (0 .. n - 1)));
+ */
+extern int strncasecmp(char const *s1, char const *s2, size_t n);
+
+static unsigned int volatile getaddrinfo_net_state;
+/*@ requires
+      nodename_string: nodename ≡ \null ∨ valid_read_string(nodename);
+    requires
+      servname_string: servname ≡ \null ∨ valid_read_string(servname);
+    requires hints_option: hints ≡ \null ∨ \valid_read(hints);
+    requires valid_res: \valid(res);
+    assigns *res, \result, __fc_errno;
+    assigns *res
+      \from (indirect: nodename), (indirect: servname), (indirect: hints);
+    assigns \result
+      \from (indirect: nodename), (indirect: servname), (indirect: hints);
+    assigns __fc_errno
+      \from (indirect: nodename), (indirect: servname), (indirect: hints);
+    allocates *\old(res);
+    
+    behavior empty_request:
+      assumes empty: nodename ≡ \null ∧ servname ≡ \null;
+      ensures no_name: \result ≡ -2;
+      assigns \result;
+      assigns \result \from (indirect: nodename), (indirect: servname);
+    
+    behavior normal_request:
+      assumes has_name: nodename ≢ \null ∨ servname ≢ \null;
+      ensures
+        initialization: allocation: success_or_error:
+          (\result ≡ 0 ∧
+           \fresh{Old, Here}(*\old(res),sizeof(*\old(res))) ∧
+           \initialized(*\old(res))) ∨
+          \result ≡ -3 ∨ \result ≡ -1 ∨ \result ≡ -4 ∨
+          \result ≡ -6 ∨ \result ≡ -10 ∨ \result ≡ -8 ∨
+          \result ≡ -7 ∨ \result ≡ -11;
+    
+    complete behaviors normal_request, empty_request;
+    disjoint behaviors normal_request, empty_request;
+ */
+int getaddrinfo(char const * __restrict nodename,
+                char const * __restrict servname,
+                struct addrinfo const * __restrict hints,
+                struct addrinfo ** __restrict res)
+{
+  int __retres;
+  if (nodename == (char const *)0) 
+    if (servname == (char const *)0) {
+      __retres = -2;
+      goto return_label;
+    }
+  switch (getaddrinfo_net_state) {
+    case (unsigned int)0: __retres = -1;
+    goto return_label;
+    case (unsigned int)1: __retres = -3;
+    goto return_label;
+    case (unsigned int)2: __retres = -4;
+    goto return_label;
+    case (unsigned int)3: __retres = -6;
+    goto return_label;
+    case (unsigned int)5: __retres = -8;
+    goto return_label;
+    case (unsigned int)6: __retres = -7;
+    goto return_label;
+    case (unsigned int)7:
+    {
+      __fc_errno = 5;
+      __retres = -11;
+      goto return_label;
+    }
+    default:
+    {
+      struct addrinfo *tmp_0;
+      struct sockaddr *tmp_2;
+      int tmp_3;
+      struct addrinfo *ai = malloc(sizeof(*tmp_0));
+      if (! ai) {
+        __retres = -10;
+        goto return_label;
+      }
+      struct sockaddr *sa = malloc(sizeof(*tmp_2));
+      if (! sa) {
+        __retres = -10;
+        goto return_label;
+      }
+      tmp_3 = Frama_C_interval(0,43);
+      sa->sa_family = (unsigned short)tmp_3;
+      /*@ slevel 15; */
+      {
+        int i = 0;
+        while (i < 14) {
+          {
+            int tmp_4;
+            tmp_4 = Frama_C_interval(-128,127);
+            sa->sa_data[i] = (char)tmp_4;
+          }
+          i ++;
+        }
+      }
+      /*@ slevel default; */
+      ai->ai_flags = 0;
+      ai->ai_family = (int)sa->sa_family;
+      ai->ai_socktype = Frama_C_interval(0,5);
+      ai->ai_protocol = Frama_C_interval(0,IPPROTO_MAX);
+      ai->ai_addrlen = sizeof(*sa);
+      ai->ai_addr = sa;
+      ai->ai_canonname = (char *)"dummy";
+      ai->ai_next = (struct addrinfo *)0;
+      *res = ai;
+      __retres = 0;
+      goto return_label;
+    }
+  }
+  return_label: return __retres;
+}
+
+struct __fc_gethostbyname __fc_ghbn;
+int res_search(char const *dname, int class, int type, char *answer,
+               int anslen)
+{
+  int tmp;
+  {
+    int i = 0;
+    while (i < anslen - 1) {
+      *(answer + i) = Frama_C_char_interval((char)(-128),(char)127);
+      i ++;
+    }
+  }
+  *(answer + (anslen - 1)) = (char)0;
+  tmp = Frama_C_interval(-1,anslen);
+  return tmp;
+}
+
+struct hostent *gethostbyname(char const *name)
+{
+  struct hostent *__retres;
+  char buf[128];
+  char const *cp;
+  int n;
+  int tmp;
+  __fc_ghbn.host.h_addrtype = 2;
+  __fc_ghbn.host.h_length = (int)sizeof(struct in_addr);
+  if ((int)*name >= '0') 
+    if ((int)*name <= '9') {
+      cp = name;
+      while (1) {
+        if (! *cp) {
+          struct in_addr addr;
+          cp --;
+          ;
+          if ((int)*cp == '.') break;
+          addr.s_addr = inet_addr(name);
+          if (addr.s_addr == 0xffffffff) {
+            __retres = (struct hostent *)0;
+            goto return_label;
+          }
+          memcpy((void *)(__fc_ghbn.host_addr),(void const *)(& addr),
+                 (unsigned int)__fc_ghbn.host.h_length);
+          strncpy(__fc_ghbn.hostbuf,name,(unsigned int)(128 - 1));
+          __fc_ghbn.hostbuf[128 - 1] = (char)'\000';
+          __fc_ghbn.host.h_name = __fc_ghbn.hostbuf;
+          __fc_ghbn.host.h_aliases = __fc_ghbn.host_aliases;
+          __fc_ghbn.host_aliases[0] = (char *)0;
+          __fc_ghbn.h_addr_ptrs[0] = (char *)(__fc_ghbn.host_addr);
+          __fc_ghbn.h_addr_ptrs[1] = (char *)0;
+          __fc_ghbn.host.h_addr_list = __fc_ghbn.h_addr_ptrs;
+          __retres = & __fc_ghbn.host;
+          goto return_label;
+        }
+        if ((int)*cp < '0') 
+          if ((int)*cp > '9') 
+            if ((int)*cp != '.') break;
+        cp ++;
+      }
+    }
+  n = res_search(name,1,1,buf,(int)sizeof(buf));
+  if (n < 0) {
+    __retres = (struct hostent *)0;
+    goto return_label;
+  }
+  tmp = Frama_C_nondet(0,1);
+  if (tmp) {
+    __retres = (struct hostent *)0;
+    goto return_label;
+  }
+  else {
+    struct in_addr addr_0;
+    addr_0.s_addr = inet_addr(name);
+    memcpy((void *)(__fc_ghbn.host_addr),(void const *)(& addr_0),
+           (unsigned int)__fc_ghbn.host.h_length);
+    strncpy(__fc_ghbn.hostbuf,name,(unsigned int)(128 - 1));
+    __fc_ghbn.hostbuf[128 - 1] = (char)'\000';
+    __fc_ghbn.host.h_name = __fc_ghbn.hostbuf;
+    __fc_ghbn.host.h_aliases = __fc_ghbn.host_aliases;
+    __fc_ghbn.host_aliases[0] = (char *)0;
+    __fc_ghbn.h_addr_ptrs[0] = (char *)(__fc_ghbn.host_addr);
+    __fc_ghbn.h_addr_ptrs[1] = (char *)0;
+    __fc_ghbn.host.h_addr_list = __fc_ghbn.h_addr_ptrs;
+    __retres = & __fc_ghbn.host;
+    goto return_label;
+  }
+  return_label: return __retres;
+}
+
+FILE *__fc_stderr;
+
+FILE *__fc_stdin;
+
+FILE *__fc_stdout;
+
+/*@ requires valid_filename: valid_read_string(filename);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: *(filename + (0 .. strlen{Old}(filename))));
+ */
+extern int remove(char const *filename);
+
+/*@ requires valid_old_name: valid_read_string(old_name);
+    requires valid_new_name: valid_read_string(new_name);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: *(old_name + (0 .. strlen{Old}(old_name)))),
+            (indirect: *(new_name + (0 .. strlen{Old}(new_name))));
+ */
+extern int rename(char const *old_name, char const *new_name);
+
+FILE __fc_fopen[16];
+FILE * const __fc_p_fopen = __fc_fopen;
+/*@ ensures
+      result_null_or_valid_fd:
+        \result ≡ \null ∨ \subset(\result, &__fc_fopen[0 .. 16 - 1]);
+    assigns \result;
+    assigns \result \from __fc_p_fopen;
+ */
+extern FILE *tmpfile(void);
+
+char __fc_tmpnam[2048];
+char * const __fc_p_tmpnam = __fc_tmpnam;
+/*@ requires valid_s_or_null: s ≡ \null ∨ \valid(s + (0 .. 2048));
+    ensures
+      result_string_or_null:
+        \result ≡ \null ∨ \result ≡ \old(s) ∨
+        \result ≡ __fc_p_tmpnam;
+    assigns *(__fc_p_tmpnam + (0 .. 2048)), *(s + (0 .. 2048)), \result;
+    assigns *(__fc_p_tmpnam + (0 .. 2048))
+      \from *(__fc_p_tmpnam + (0 .. 2048)), (indirect: s);
+    assigns *(s + (0 .. 2048))
+      \from (indirect: s), *(__fc_p_tmpnam + (0 .. 2048));
+    assigns \result \from s, __fc_p_tmpnam;
+ */
+extern char *tmpnam(char *s);
+
+/*@ requires valid_stream: \valid(stream);
+    ensures result_zero_or_EOF: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: stream), (indirect: *stream);
+ */
+extern int fclose(FILE *stream);
+
+/*@ requires null_or_valid_stream: stream ≡ \null ∨ \valid_read(stream);
+    ensures result_zero_or_EOF: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, *stream, __fc_fopen[0 .. 16 - 1];
+    assigns \result
+      \from (indirect: *stream), (indirect: __fc_fopen[0 .. 16 - 1]);
+    assigns *stream
+      \from (indirect: stream), *stream, __fc_fopen[0 .. 16 - 1];
+    assigns __fc_fopen[0 .. 16 - 1]
+      \from (indirect: stream), *stream, __fc_fopen[0 .. 16 - 1];
+    
+    behavior flush_all:
+      assumes all_streams: stream ≡ \null;
+      assigns __fc_fopen[0 .. 16 - 1], \result;
+      assigns __fc_fopen[0 .. 16 - 1] \from __fc_fopen[0 .. 16 - 1];
+      assigns \result \from (indirect: __fc_fopen[0 .. 16 - 1]);
+    
+    behavior flush_stream:
+      assumes single_stream: stream ≢ \null;
+      assigns *stream, \result;
+      assigns *stream \from *stream;
+      assigns \result \from (indirect: *stream);
+    
+    complete behaviors flush_stream, flush_all;
+    disjoint behaviors flush_stream, flush_all;
+ */
+extern int fflush(FILE *stream);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    requires valid_mode: valid_read_string(mode);
+    ensures
+      result_null_or_valid_fd:
+        \result ≡ \null ∨ \subset(\result, &__fc_fopen[0 .. 16 - 1]);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(filename + (0 .. strlen{Old}(filename)))),
+            (indirect: *(mode + (0 .. strlen{Old}(mode)))), __fc_p_fopen;
+ */
+extern FILE *fopen(char const * __restrict filename,
+                   char const * __restrict mode);
+
+/*@ requires valid_mode: valid_read_string(mode);
+    ensures
+      result_null_or_valid_fd:
+        \result ≡ \null ∨ \subset(\result, &__fc_fopen[0 .. 16 - 1]);
+    assigns \result, __fc_fopen[fd];
+    assigns \result
+      \from (indirect: fd), (indirect: *(mode + (0 .. strlen{Old}(mode)))),
+            (indirect: __fc_fopen[fd]), __fc_p_fopen;
+    assigns __fc_fopen[fd]
+      \from (indirect: fd), (indirect: *(mode + (0 .. strlen{Old}(mode)))),
+            (indirect: __fc_fopen[fd]), __fc_p_fopen;
+ */
+extern FILE *fdopen(int fd, char const *mode);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    requires valid_mode: valid_read_string(mode);
+    requires valid_stream: \valid(stream);
+    ensures
+      result_null_or_valid_fd:
+        \result ≡ \null ∨ \result ∈ &__fc_fopen[0 .. 16 - 1];
+    ensures stream_opened: *\old(stream) ∈ __fc_fopen[0 .. 16 - 1];
+    assigns \result, *stream;
+    assigns \result
+      \from (indirect: *(filename + (..))), (indirect: *(mode + (..))),
+            __fc_p_fopen, (indirect: stream);
+    assigns *stream
+      \from (indirect: *(filename + (..))), (indirect: *(mode + (..))),
+            __fc_p_fopen, (indirect: stream);
+ */
+extern FILE *freopen(char const * __restrict filename,
+                     char const * __restrict mode, FILE * __restrict stream);
+
+/*@ assigns *stream;
+    assigns *stream \from buf; */
+extern void setbuf(FILE * __restrict stream, char * __restrict buf);
+
+/*@ assigns *stream;
+    assigns *stream \from buf, mode, size; */
+extern int setvbuf(FILE * __restrict stream, char * __restrict buf, int mode,
+                   size_t size);
+
+/*@ axiomatic format_length {
+      logic ℤ format_length{L}(char *format) ;
+      
+      }
+
+*/
+/*@ assigns *stream;
+    assigns *stream \from *(format + (..)), arg; */
+extern int vfprintf(FILE * __restrict stream, char const * __restrict format,
+                    va_list arg);
+
+/*@ assigns *stream;
+    assigns *stream \from *(format + (..)), *stream; */
+extern int vfscanf(FILE * __restrict stream, char const * __restrict format,
+                   va_list arg);
+
+/*@ assigns *__fc_stdout;
+    assigns *__fc_stdout \from arg; */
+extern int vprintf(char const * __restrict format, va_list arg);
+
+/*@ assigns *__fc_stdin;
+    assigns *__fc_stdin \from *(format + (..)); */
+extern int vscanf(char const * __restrict format, va_list arg);
+
+/*@ assigns *(s + (0 .. n - 1));
+    assigns *(s + (0 .. n - 1)) \from *(format + (..)), arg;
+ */
+extern int vsnprintf(char * __restrict s, size_t n,
+                     char const * __restrict format, va_list arg);
+
+/*@ assigns *(s + (0 ..));
+    assigns *(s + (0 ..)) \from *(format + (..)), arg;
+ */
+extern int vsprintf(char * __restrict s, char const * __restrict format,
+                    va_list arg);
+
+/*@ requires valid_stream: \valid(stream);
+    ensures result_uchar_or_eof: (0 ≤ \result ≤ 255) ∨ \result ≡ -1;
+    assigns *stream, \result;
+    assigns *stream \from *stream;
+    assigns \result \from (indirect: *stream);
+ */
+extern int fgetc(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    requires room_s: \valid(s + (0 .. size - 1));
+    ensures result_null_or_same: \result ≡ \null ∨ \result ≡ \old(s);
+    ensures
+      initialization: at_least_one:
+        \result ≢ \null ⇒ \initialized(\old(s) + 0);
+    ensures
+      terminated_string_on_success:
+        \result ≢ \null ⇒ valid_string(\old(s));
+    assigns *(s + (0 .. size - 1)), \result;
+    assigns *(s + (0 .. size - 1))
+      \from (indirect: size), (indirect: *stream);
+    assigns \result \from s, (indirect: size), (indirect: *stream);
+ */
+extern char *fgets(char * __restrict s, int size, FILE * __restrict stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns *stream, \result;
+    assigns *stream \from c, *stream;
+    assigns \result \from (indirect: *stream);
+ */
+extern int fputc(int c, FILE *stream);
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns *stream, \result;
+    assigns *stream \from *(s + (0 .. strlen{Old}(s))), *stream;
+    assigns \result
+      \from (indirect: *(s + (0 .. strlen{Old}(s)))), (indirect: *stream);
+ */
+extern int fputs(char const * __restrict s, FILE * __restrict stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result, *stream;
+    assigns \result \from *stream;
+    assigns *stream \from *stream;
+ */
+extern int getc(FILE *stream);
+
+/*@ assigns \result, *__fc_stdin;
+    assigns \result \from *__fc_stdin;
+    assigns *__fc_stdin \from *__fc_stdin;
+ */
+extern int getchar(void);
+
+/*@ axiomatic GetsLength {
+      logic size_t gets_length{L}
+        reads *__fc_stdin;
+      
+      }
+
+*/
+/*@ requires room_s: \valid(s + (0 .. gets_length));
+    ensures result_null_or_same: \result ≡ \old(s) ∨ \result ≡ \null;
+    assigns *(s + (0 .. gets_length{Old})), \result, *__fc_stdin;
+    assigns *(s + (0 .. gets_length{Old})) \from *__fc_stdin;
+    assigns \result \from s, *__fc_stdin;
+    assigns *__fc_stdin \from *__fc_stdin;
+ */
+extern char *gets(char *s);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns *stream, \result;
+    assigns *stream \from c, *stream;
+    assigns \result \from (indirect: *stream);
+ */
+extern int putc(int c, FILE *stream);
+
+/*@ assigns *__fc_stdout, \result;
+    assigns *__fc_stdout \from c, *__fc_stdout;
+    assigns \result \from (indirect: *__fc_stdout);
+ */
+extern int putchar(int c);
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns *__fc_stdout, \result;
+    assigns *__fc_stdout \from *(s + (0 .. strlen{Old}(s))), *__fc_stdout;
+    assigns \result
+      \from (indirect: *(s + (0 .. strlen{Old}(s)))),
+            (indirect: *__fc_stdout);
+ */
+extern int puts(char const *s);
+
+/*@ requires valid_stream: \valid(stream);
+    ensures result_ok_or_error: \result ≡ \old(c) ∨ \result ≡ -1;
+    assigns *stream, \result;
+    assigns *stream \from (indirect: c);
+    assigns \result \from (indirect: c), (indirect: *stream);
+ */
+extern int ungetc(int c, FILE *stream);
+
+/*@ requires valid_ptr_block: \valid((char *)ptr + (0 .. nmemb * size - 1));
+    requires valid_stream: \valid(stream);
+    ensures size_read: \result ≤ \old(nmemb);
+    ensures
+      initialization:
+        \initialized((char *)\old(ptr) + (0 .. \result * \old(size) - 1));
+    assigns *((char *)ptr + (0 .. nmemb * size - 1)), *stream, \result;
+    assigns *((char *)ptr + (0 .. nmemb * size - 1))
+      \from (indirect: size), (indirect: nmemb), (indirect: *stream);
+    assigns *stream
+      \from (indirect: size), (indirect: nmemb), (indirect: *stream);
+    assigns \result \from size, (indirect: *stream);
+ */
+extern size_t fread(void * __restrict ptr, size_t size, size_t nmemb,
+                    FILE * __restrict stream);
+
+/*@ requires
+      valid_ptr_block: \valid_read((char *)ptr + (0 .. nmemb * size - 1));
+    requires valid_stream: \valid(stream);
+    ensures size_written: \result ≤ \old(nmemb);
+    assigns *stream, \result;
+    assigns *stream
+      \from (indirect: *((char *)ptr + (0 .. nmemb * size - 1)));
+    assigns \result
+      \from (indirect: *((char *)ptr + (0 .. nmemb * size - 1)));
+ */
+extern size_t fwrite(void const * __restrict ptr, size_t size, size_t nmemb,
+                     FILE * __restrict stream);
+
+/*@ requires valid_stream: \valid(stream);
+    requires valid_pos: \valid(pos);
+    requires initialization: pos: \initialized(pos);
+    assigns *pos, \result;
+    assigns *pos \from (indirect: *stream);
+    assigns \result \from (indirect: *stream);
+ */
+extern int fgetpos(FILE * __restrict stream, fpos_t * __restrict pos);
+
+/*@ requires valid_stream: \valid(stream);
+    requires whence_enum: whence ≡ 0 ∨ whence ≡ 1 ∨ whence ≡ 2;
+    assigns *stream, \result, __fc_errno;
+    assigns *stream \from *stream, (indirect: offset), (indirect: whence);
+    assigns \result
+      \from (indirect: *stream), (indirect: offset), (indirect: whence);
+    assigns __fc_errno
+      \from (indirect: *stream), (indirect: offset), (indirect: whence);
+ */
+extern int fseek(FILE *stream, long offset, int whence);
+
+/*@ requires valid_stream: \valid(stream);
+    requires whence_enum: whence ≡ 0 ∨ whence ≡ 1 ∨ whence ≡ 2;
+    assigns *stream, \result, __fc_errno;
+    assigns *stream \from *stream, (indirect: offset), (indirect: whence);
+    assigns \result
+      \from (indirect: *stream), (indirect: offset), (indirect: whence);
+    assigns __fc_errno
+      \from (indirect: *stream), (indirect: offset), (indirect: whence);
+ */
+extern int fseeko(FILE *stream, off_t offset, int whence);
+
+/*@ requires valid_stream: \valid(stream);
+    requires valid_pos: \valid_read(pos);
+    requires initialization: pos: \initialized(pos);
+    assigns *stream;
+    assigns *stream \from *pos;
+ */
+extern int fsetpos(FILE *stream, fpos_t const *pos);
+
+/*@ requires valid_stream: \valid(stream);
+    ensures
+      success_or_error:
+        \result ≡ -1 ∨
+        (\result ≥ 0 ∧ __fc_errno ≡ \old(__fc_errno));
+    assigns \result, __fc_errno;
+    assigns \result \from (indirect: *stream);
+    assigns __fc_errno \from (indirect: *stream);
+ */
+extern long ftell(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    ensures
+      success_or_error:
+        \result ≡ -1 ∨
+        (\result ≥ 0 ∧ __fc_errno ≡ \old(__fc_errno));
+    assigns \result, __fc_errno;
+    assigns \result \from (indirect: *stream);
+    assigns __fc_errno \from (indirect: *stream);
+ */
+extern off_t ftello(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns *stream;
+    assigns *stream \from \nothing;
+ */
+extern void rewind(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns *stream;
+    assigns *stream \from \nothing;
+ */
+extern void clearerr(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result;
+    assigns \result \from (indirect: *stream);
+ */
+extern int feof(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result;
+    assigns \result \from (indirect: *stream);
+ */
+extern int fileno(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns *stream;
+    assigns *stream \from \nothing;
+ */
+extern void flockfile(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns *stream;
+    assigns *stream \from \nothing;
+ */
+extern void funlockfile(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result, *stream;
+    assigns \result \from \nothing;
+    assigns *stream \from \nothing;
+ */
+extern int ftrylockfile(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result;
+    assigns \result \from (indirect: *stream);
+ */
+extern int ferror(FILE *stream);
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns __fc_stdout;
+    assigns __fc_stdout \from __fc_errno, *(s + (0 .. strlen{Old}(s)));
+ */
+extern void perror(char const *s);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result, *stream;
+    assigns \result \from *stream;
+    assigns *stream \from *stream;
+ */
+extern int getc_unlocked(FILE *stream);
+
+/*@ assigns \result;
+    assigns \result \from *__fc_stdin; */
+extern int getchar_unlocked(void);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns *stream, \result;
+    assigns *stream \from c;
+    assigns \result \from (indirect: *stream);
+ */
+extern int putc_unlocked(int c, FILE *stream);
+
+/*@ assigns *__fc_stdout, \result;
+    assigns *__fc_stdout \from c;
+    assigns \result \from (indirect: *__fc_stdout);
+ */
+extern int putchar_unlocked(int c);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns *stream;
+    assigns *stream \from \nothing;
+ */
+extern void clearerr_unlocked(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result;
+    assigns \result \from (indirect: *stream);
+ */
+extern int feof_unlocked(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result;
+    assigns \result \from (indirect: *stream);
+ */
+extern int ferror_unlocked(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result;
+    assigns \result \from (indirect: *stream);
+ */
+extern int fileno_unlocked(FILE *stream);
+
+/*@ axiomatic pipe_streams {
+      predicate is_open_pipe{L}(FILE *stream) ;
+      
+      }
+
+*/
+/*@ requires valid_command: valid_read_string(command);
+    requires valid_type: valid_read_string(type);
+    ensures
+      result_error_or_valid_open_pipe:
+        \result ≡ \null ∨
+        (\subset(\result, &__fc_fopen[0 .. 16 - 1]) ∧ is_open_pipe(\result));
+    assigns \result, __fc_fopen[0 ..];
+    assigns \result
+      \from (indirect: *command), (indirect: *type), __fc_p_fopen;
+    assigns __fc_fopen[0 ..]
+      \from (indirect: *command), (indirect: *type), __fc_fopen[0 ..];
+ */
+extern FILE *popen(char const *command, char const *type);
+
+/*@ requires valid_stream: \valid(stream);
+    requires open_pipe: is_open_pipe(stream);
+    ensures closed_stream: ¬is_open_pipe(\old(stream));
+    assigns \result;
+    assigns \result \from (indirect: *stream);
+ */
+extern int pclose(FILE *stream);
+
+ssize_t getline(char **lineptr, size_t *n, FILE *stream);
+
+/*@ assigns \result;
+    assigns \result \from maj, min; */
+extern dev_t makedev(int maj, int min);
+
+FILE __fc_initial_stdout =
+  {.__fc_FILE_id = (unsigned int)1, .__fc_FILE_data = 0U};
+FILE *__fc_stdout = & __fc_initial_stdout;
+FILE __fc_initial_stderr =
+  {.__fc_FILE_id = (unsigned int)2, .__fc_FILE_data = 0U};
+FILE *__fc_stderr = & __fc_initial_stderr;
+FILE __fc_initial_stdin =
+  {.__fc_FILE_id = (unsigned int)0, .__fc_FILE_data = 0U};
+FILE *__fc_stdin = & __fc_initial_stdin;
+ssize_t getline(char **lineptr, size_t *n, FILE *stream)
+{
+  ssize_t __retres;
+  int tmp;
+  if (! lineptr) goto _LOR;
+  else 
+    if (! n) goto _LOR;
+    else 
+      if (! stream) {
+        _LOR: {
+                __fc_errno = 22;
+                __retres = -1;
+                goto return_label;
+              }
+      }
+  tmp = ferror(stream);
+  if (tmp) goto _LOR_0;
+  else {
+    int tmp_0;
+    tmp_0 = feof(stream);
+    if (tmp_0) {
+      _LOR_0: {
+                __retres = -1;
+                goto return_label;
+              }
+    }
+  }
+  if (! *lineptr) goto _LOR_1;
+  else 
+    if (*n == (size_t)0) {
+      _LOR_1:
+      {
+        *lineptr = (char *)malloc((unsigned int)2);
+        if (! lineptr) {
+          __fc_errno = 12;
+          __retres = -1;
+          goto return_label;
+        }
+        *n = (unsigned int)2;
+      }
+    }
+  size_t cur = (unsigned int)0;
+  while (1) {
+    int tmp_3;
+    tmp_3 = ferror(stream);
+    if (tmp_3) break;
+    else {
+      int tmp_4;
+      tmp_4 = feof(stream);
+      if (tmp_4) break;
+    }
+    {
+      while (cur < *n - (size_t)1) {
+        int tmp_1;
+        tmp_1 = fgetc(stream);
+        char c = (char)tmp_1;
+        if ((int)c == -1) 
+          if (cur == (size_t)0) {
+            __retres = -1;
+            goto return_label;
+          }
+        if ((int)c != -1) {
+          size_t tmp_2;
+          tmp_2 = cur;
+          cur += (size_t)1;
+          *(*lineptr + tmp_2) = c;
+        }
+        if ((int)c == '\n') goto _LOR_2;
+        else 
+          if ((int)c == -1) {
+            _LOR_2:
+            {
+              *(*lineptr + cur) = (char)'\000';
+              __retres = (int)cur;
+              goto return_label;
+            }
+          }
+      }
+      if (*n == (size_t)2147483647) {
+        __fc_errno = 75;
+        __retres = -1;
+        goto return_label;
+      }
+      size_t new_size = *n + (size_t)1;
+      *lineptr = (char *)realloc((void *)*lineptr,new_size);
+      if (! *lineptr) {
+        __fc_errno = 12;
+        __retres = -1;
+        goto return_label;
+      }
+      *n = new_size;
+    }
+  }
+  __retres = -1;
+  return_label: return __retres;
+}
+
+/*@ requires abs_representable: i > -2147483647 - 1;
+    assigns \result;
+    assigns \result \from i;
+    
+    behavior negative:
+      assumes negative: i < 0;
+      ensures opposite_result: \result ≡ -\old(i);
+    
+    behavior nonnegative:
+      assumes nonnegative: i ≥ 0;
+      ensures same_result: \result ≡ \old(i);
+    
+    complete behaviors nonnegative, negative;
+    disjoint behaviors nonnegative, negative;
+ */
+int abs(int i)
+{
+  int __retres;
+  if (i < 0) {
+    __retres = - i;
+    goto return_label;
+  }
+  __retres = i;
+  return_label: return __retres;
+}
+
+/*@ requires valid_nptr: \valid_read(p);
+    assigns \result;
+    assigns \result \from (indirect: p), (indirect: *(p + (0 ..)));
+ */
+int atoi(char const *p)
+{
+  int __retres;
+  int n;
+  int c;
+  int tmp_1;
+  int tmp_3;
+  int neg = 0;
+  unsigned char *up = (unsigned char *)p;
+  c = (int)*up;
+  tmp_1 = isdigit(c);
+  if (! tmp_1) {
+    int tmp_0;
+    while (1) {
+      int tmp;
+      tmp = isspace(c);
+      if (! tmp) break;
+      up ++;
+      c = (int)*up;
+    }
+    switch (c) {
+      case '-': neg ++;
+      case '+': { /* sequence */
+                  up ++;
+                  c = (int)*up;
+                }
+    }
+    tmp_0 = isdigit(c);
+    if (! tmp_0) {
+      __retres = 0;
+      goto return_label;
+    }
+  }
+  n = '0' - c;
+  while (1) {
+    int tmp_2;
+    up ++;
+    c = (int)*up;
+    tmp_2 = isdigit(c);
+    if (! tmp_2) break;
+    n *= 10;
+    n += '0' - c;
+  }
+  if (neg) tmp_3 = n; else tmp_3 = - n;
+  __retres = tmp_3;
+  return_label: return __retres;
+}
+
+/*@ assigns __fc_heap_status, \result;
+    assigns __fc_heap_status
+      \from (indirect: nmemb), (indirect: size), __fc_heap_status;
+    assigns \result
+      \from (indirect: nmemb), (indirect: size), (indirect: __fc_heap_status);
+    allocates \result;
+    
+    behavior allocation:
+      assumes can_allocate: is_allocable(nmemb * size);
+      ensures
+        allocation: \fresh{Old, Here}(\result,\old(nmemb) * \old(size));
+      ensures
+        initialization:
+          \initialized((char *)\result + (0 .. \old(nmemb) * \old(size) - 1));
+      ensures
+        zero_initialization:
+          \subset(*((char *)\result + (0 .. \old(nmemb) * \old(size) - 1)),
+                 {0});
+    
+    behavior no_allocation:
+      assumes cannot_allocate: ¬is_allocable(nmemb * size);
+      ensures null_result: \result ≡ \null;
+      assigns \result;
+      assigns \result \from \nothing;
+      allocates \nothing;
+    
+    complete behaviors no_allocation, allocation;
+    disjoint behaviors no_allocation, allocation;
+ */
+void *calloc(size_t nmemb, size_t size)
+{
+  void *__retres;
+  size_t l = nmemb * size;
+  if (size != (size_t)0) 
+    if (l / size != nmemb) {
+      __retres = (void *)0;
+      goto return_label;
+    }
+  char *p = malloc(l);
+  if (p) memset((void *)p,0,l);
+  __retres = (void *)p;
+  return_label: return __retres;
+}
+
+static char __fc_env_strings[64];
+static char __fc_initenv_init;
+static void __fc_initenv(void)
+{
+  if (! __fc_initenv_init) {
+    Frama_C_make_unknown(__fc_env_strings,(unsigned int)(64 - 1));
+    {
+      int i = 0;
+      while (i < 4096) {
+        {
+          int tmp;
+          tmp = Frama_C_interval(0,64 - 1);
+          __fc_env[i] = & __fc_env_strings[tmp];
+        }
+        i ++;
+      }
+    }
+    __fc_initenv_init = (char)1;
+  }
+  return;
+}
+
+/*@ requires valid_name: valid_read_string(name);
+    ensures null_or_valid_result: \result ≡ \null ∨ \valid(\result);
+    assigns \result;
+    assigns \result \from __fc_env[0 ..], (indirect: name), *(name + (0 ..));
+ */
+char *getenv(char const *name)
+{
+  char *__retres;
+  int tmp_0;
+  /*@ assert ¬(strchr(name, '=') ≡ \true); */ ;
+  __fc_initenv();
+  tmp_0 = Frama_C_nondet(0,1);
+  if (tmp_0) {
+    int tmp;
+    tmp = Frama_C_interval(0,4096 - 1);
+    ;
+    __retres = __fc_env[tmp];
+    goto return_label;
+  }
+  else {
+    __retres = (char *)0;
+    goto return_label;
+  }
+  return_label: return __retres;
+}
+
+/*@ requires valid_string: valid_read_string(string);
+    assigns __fc_env[0 ..], \result;
+    assigns __fc_env[0 ..] \from __fc_env[0 ..], string;
+    assigns \result \from (indirect: __fc_env[0 ..]), (indirect: string);
+ */
+int putenv(char *string)
+{
+  int __retres;
+  int tmp_3;
+  char *separator = strchr((char const *)string,'=');
+  /*@ assert string_contains_separator: separator ≢ \null; */ ;
+  /*@ assert name_is_not_empty: separator ≢ string; */ ;
+  __fc_initenv();
+  tmp_3 = Frama_C_nondet(0,1);
+  if (tmp_3) {
+    int tmp_1;
+    int tmp_2;
+    tmp_1 = Frama_C_nondet(0,1);
+    if (tmp_1) {
+      int tmp_0;
+      tmp_0 = Frama_C_interval(-2147483647 - 1,2147483647);
+      __retres = tmp_0;
+      goto return_label;
+    }
+    tmp_2 = Frama_C_interval(0,4096 - 1);
+    __fc_env[tmp_2] = string;
+  }
+  __retres = 0;
+  return_label: return __retres;
+}
+
+/*@ requires valid_name: valid_read_string(name);
+    requires valid_value: valid_read_string(value);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, __fc_env[0 ..];
+    assigns \result
+      \from __fc_env[0 ..], (indirect: name), (indirect: *(name + (0 ..))),
+            (indirect: value), (indirect: *(value + (0 ..))),
+            (indirect: overwrite);
+    assigns __fc_env[0 ..]
+      \from __fc_env[0 ..], (indirect: name), (indirect: *(name + (0 ..))),
+            (indirect: value), (indirect: *(value + (0 ..))),
+            (indirect: overwrite);
+ */
+int setenv(char const *name, char const *value, int overwrite)
+{
+  int __retres;
+  char *tmp;
+  int tmp_4;
+  tmp = strchr(name,'=');
+  if (tmp) {
+    __retres = -1;
+    goto return_label;
+  }
+  size_t namelen = strlen(name);
+  if (namelen == (size_t)0) {
+    __retres = -1;
+    goto return_label;
+  }
+  __fc_initenv();
+  tmp_4 = Frama_C_nondet(0,1);
+  if (tmp_4) {
+    __retres = -1;
+    goto return_label;
+  }
+  else {
+    int tmp_1;
+    int tmp_2;
+    int tmp_3;
+    tmp_1 = Frama_C_nondet(0,1);
+    if (tmp_1) Frama_C_make_unknown(__fc_env_strings,(unsigned int)(64 - 1));
+    tmp_2 = Frama_C_interval(0,4096 - 1);
+    tmp_3 = Frama_C_interval(0,64 - 1);
+    __fc_env[tmp_2] = & __fc_env_strings[tmp_3];
+    __retres = 0;
+    goto return_label;
+  }
+  return_label: return __retres;
+}
+
+/*@ requires valid_name: valid_read_string(name);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, __fc_env[0 ..];
+    assigns \result
+      \from __fc_env[0 ..], (indirect: name), (indirect: *(name + (0 ..)));
+    assigns __fc_env[0 ..]
+      \from __fc_env[0 ..], (indirect: name), (indirect: *(name + (0 ..)));
+ */
+int unsetenv(char const *name)
+{
+  int __retres;
+  char *tmp;
+  int tmp_2;
+  tmp = strchr(name,'=');
+  if (tmp) {
+    __retres = -1;
+    goto return_label;
+  }
+  size_t namelen = strlen(name);
+  if (namelen == (size_t)0) {
+    __retres = -1;
+    goto return_label;
+  }
+  __fc_initenv();
+  tmp_2 = Frama_C_nondet(0,1);
+  if (tmp_2) {
+    int tmp_1;
+    tmp_1 = Frama_C_interval(0,4096 - 1);
+    __fc_env[tmp_1] = (char *)0;
+  }
+  __retres = 0;
+  return_label: return __retres;
+}
+
+/*@ requires valid_memptr: \valid(memptr);
+    requires
+      alignment_is_a_suitable_power_of_two:
+        alignment ≥ sizeof(void *) ∧
+        ((size_t)alignment & ((size_t)alignment - 1)) ≡ 0;
+    assigns __fc_heap_status, \result;
+    assigns __fc_heap_status
+      \from (indirect: alignment), size, __fc_heap_status;
+    assigns \result
+      \from (indirect: alignment), (indirect: size),
+            (indirect: __fc_heap_status);
+    allocates *\old(memptr);
+    
+    behavior allocation:
+      assumes can_allocate: is_allocable(size);
+      ensures allocation: \fresh{Old, Here}(*\old(memptr),\old(size));
+      ensures result_zero: \result ≡ 0;
+      assigns __fc_heap_status, \result;
+      assigns __fc_heap_status
+        \from (indirect: alignment), size, __fc_heap_status;
+      assigns \result
+        \from (indirect: alignment), (indirect: size),
+              (indirect: __fc_heap_status);
+    
+    behavior no_allocation:
+      assumes cannot_allocate: ¬is_allocable(size);
+      ensures result_non_zero: \result < 0 ∨ \result > 0;
+      assigns \result;
+      assigns \result \from (indirect: alignment);
+      allocates \nothing;
+    
+    complete behaviors no_allocation, allocation;
+    disjoint behaviors no_allocation, allocation;
+ */
+int posix_memalign(void **memptr, size_t alignment, size_t size)
+{
+  int __retres;
+  /*@
+  assert
+  alignment_is_a_suitable_power_of_two:
+    alignment ≥ sizeof(void *) ∧
+    ((size_t)alignment & ((size_t)alignment - 1)) ≡ 0;
+   */
+  ;
+  *memptr = malloc(size);
+  if (! *memptr) {
+    __retres = 12;
+    goto return_label;
+  }
+  __retres = 0;
+  return_label: return __retres;
+}
+
+char *realpath(char const * __restrict file_name,
+               char * __restrict resolved_name)
+{
+  char *__retres;
+  int tmp;
+  if (! file_name) {
+    __fc_errno = 22;
+    __retres = (char *)0;
+    goto return_label;
+  }
+  tmp = Frama_C_interval(0,6);
+  switch (tmp) {
+    case 0: __fc_errno = 13;
+    __retres = (char *)0;
+    goto return_label;
+    case 1: __fc_errno = 5;
+    __retres = (char *)0;
+    goto return_label;
+    case 2: __fc_errno = 40;
+    __retres = (char *)0;
+    goto return_label;
+    case 3: __fc_errno = 36;
+    __retres = (char *)0;
+    goto return_label;
+    case 4: __fc_errno = 2;
+    __retres = (char *)0;
+    goto return_label;
+    case 5: __fc_errno = 20;
+    __retres = (char *)0;
+    goto return_label;
+    default: break;
+  }
+  int realpath_len = Frama_C_interval(1,256);
+  if (! resolved_name) {
+    resolved_name = (char *)malloc((unsigned int)256);
+    if (! resolved_name) {
+      __fc_errno = 12;
+      __retres = (char *)0;
+      goto return_label;
+    }
+  }
+  Frama_C_make_unknown(resolved_name,(unsigned int)realpath_len);
+  *(resolved_name + (realpath_len - 1)) = (char)'\000';
+  __retres = resolved_name;
+  return_label: return __retres;
+}
+
+/*@ requires valid_dest: valid_or_empty(dest, n);
+    requires valid_src: valid_read_or_empty(src, n);
+    requires
+      separation:
+        \separated((char *)dest + (0 .. n - 1), (char *)src + (0 .. n - 1));
+    ensures
+      copied_contents:
+        memcmp{Post, Pre}((char *)\old(dest), (char *)\old(src), \old(n)) ≡
+        0;
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *((char *)dest + (0 .. n - 1)), \result;
+    assigns *((char *)dest + (0 .. n - 1))
+      \from *((char *)src + (0 .. n - 1));
+    assigns \result \from dest;
+ */
+void *memcpy(void * __restrict dest, void const * __restrict src, size_t n)
+{
+  {
+    size_t i = (unsigned int)0;
+    /*@ loop invariant no_eva: 0 ≤ i ≤ n;
+        loop invariant
+          no_eva:
+            ∀ ℤ k;
+              0 ≤ k < i ⇒ *((char *)dest + k) ≡ *((char *)src + k);
+        loop assigns i, *((char *)dest + (0 .. n - 1));
+        loop variant n - i;
+    */
+    while (i < n) {
+      *((char *)dest + i) = *((char *)src + i);
+      i += (size_t)1;
+    }
+  }
+  return dest;
+}
+
+/*@ assigns \result;
+    assigns \result \from (indirect: p), (indirect: q), (indirect: n);
+    
+    behavior separated:
+      assumes
+        separation: no_overlap:
+          \separated(p + (0 .. n - 1), q + (0 .. n - 1));
+      ensures result_no_overlap: \result ≡ 0;
+    
+    behavior not_separated_lt:
+      assumes
+        separation: overlap: ¬\separated(p + (0 .. n - 1), q + (0 .. n - 1));
+      assumes p_before_q: p ≤ q < p + n;
+      ensures result_p_before_q: \result ≡ -1;
+    
+    behavior not_separated_gt:
+      assumes
+        separation: overlap: ¬\separated(p + (0 .. n - 1), q + (0 .. n - 1));
+      assumes p_after_q: q < p ≤ q + n;
+      ensures result_p_after_q: \result ≡ 1;
+    
+    complete behaviors not_separated_gt, not_separated_lt, separated;
+    disjoint behaviors not_separated_gt, not_separated_lt, separated;
+ */
+static int memoverlap(char const *p, char const *q, size_t n)
+{
+  int __retres;
+  uintptr_t p1 = (unsigned int)p;
+  uintptr_t p2 = (unsigned int)(p + n);
+  uintptr_t q1 = (unsigned int)q;
+  uintptr_t q2 = (unsigned int)(q + n);
+  if (p1 <= q1) {
+    if (p2 > q1) {
+      __retres = -1;
+      goto return_label;
+    }
+    else goto _LAND;
+  }
+  else {
+    _LAND: ;
+    if (q1 <= p1) 
+      if (q2 > p1) {
+        __retres = 1;
+        goto return_label;
+      }
+      else {
+        __retres = 0;
+        goto return_label;
+      }
+    else {
+      __retres = 0;
+      goto return_label;
+    }
+  }
+  return_label: return __retres;
+}
+
+/*@ requires valid_dest: valid_or_empty(dest, n);
+    requires valid_src: valid_read_or_empty(src, n);
+    ensures
+      copied_contents:
+        memcmp{Post, Pre}((char *)\old(dest), (char *)\old(src), \old(n)) ≡
+        0;
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *((char *)dest + (0 .. n - 1)), \result;
+    assigns *((char *)dest + (0 .. n - 1))
+      \from *((char *)src + (0 .. n - 1));
+    assigns \result \from dest;
+ */
+void *memmove(void *dest, void const *src, size_t n)
+{
+  void *__retres;
+  int tmp;
+  if (n == (size_t)0) {
+    __retres = dest;
+    goto return_label;
+  }
+  char *s = (char *)src;
+  char *d = (char *)dest;
+  tmp = memoverlap((char const *)dest,(char const *)src,n);
+  if (tmp <= 0) {
+    size_t i = (unsigned int)0;
+    /*@ loop invariant no_eva: 0 ≤ i ≤ n;
+        loop invariant
+          no_eva:
+            ∀ ℤ k;
+              0 ≤ k < i ⇒
+              *((char *)dest + k) ≡ \at(*((char *)src + k),LoopEntry);
+        loop invariant
+          no_eva:
+            ∀ ℤ k;
+              i ≤ k < n ⇒
+              *((char *)src + k) ≡ \at(*((char *)src + k),LoopEntry);
+        loop assigns i, *((char *)dest + (0 .. n - 1));
+        loop variant n - i;
+    */
+    while (i < n) {
+      *(d + i) = *(s + i);
+      i += (size_t)1;
+    }
+  }
+  else {
+    {
+      size_t i_0 = n - (size_t)1;
+      /*@ loop invariant no_eva: 0 ≤ i_0 < n;
+          loop invariant
+            no_eva:
+              ∀ ℤ k;
+                i_0 < k < n ⇒
+                *((char *)dest + k) ≡ \at(*((char *)src + k),LoopEntry);
+          loop invariant
+            no_eva:
+              ∀ ℤ k;
+                0 ≤ k ≤ i_0 ⇒
+                *((char *)src + k) ≡ \at(*((char *)src + k),LoopEntry);
+          loop assigns i_0, *((char *)dest + (0 .. n - 1));
+          loop variant i_0;
+      */
+      while (i_0 > (size_t)0) {
+        *(d + i_0) = *(s + i_0);
+        i_0 -= (size_t)1;
+      }
+    }
+    *(d + 0) = *(s + 0);
+  }
+  __retres = dest;
+  return_label: return __retres;
+}
+
+/*@ requires valid_string_s: valid_read_string(s);
+    ensures acsl_c_equiv: \result ≡ strlen(\old(s));
+    assigns \result;
+    assigns \result \from (indirect: *(s + (0 ..)));
+ */
+size_t strlen(char const *s)
+{
+  size_t i;
+  i = (unsigned int)0;
+  while ((int)*(s + i) != 0) i += (size_t)1;
+  return i;
+}
+
+/*@ requires valid_string_s: valid_read_nstring(s, maxlen);
+    ensures
+      result_bounded:
+        \result ≡ strlen(\old(s)) ∨ \result ≡ \old(maxlen);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s + (0 .. maxlen - 1))), (indirect: maxlen);
+ */
+size_t strnlen(char const *s, size_t maxlen)
+{
+  size_t i;
+  i = (unsigned int)0;
+  while (1) {
+    if (i < maxlen) {
+      if (! ((int)*(s + i) != 0)) break;
+    }
+    else break;
+    i += (size_t)1;
+  }
+  return i;
+}
+
+/*@ requires valid_s: valid_or_empty(s, n);
+    ensures
+      acsl_c_equiv: memset((char *)\old(s), \old(c), \old(n)) ≡ \true;
+    ensures result_ptr: \result ≡ \old(s);
+    assigns *((char *)s + (0 .. n - 1)), \result;
+    assigns *((char *)s + (0 .. n - 1)) \from c;
+    assigns \result \from s;
+ */
+void *memset(void *s, int c, size_t n)
+{
+  unsigned char *p = (unsigned char *)s;
+  {
+    size_t i = (unsigned int)0;
+    while (i < n) {
+      *(p + i) = (unsigned char)c;
+      i += (size_t)1;
+    }
+  }
+  return s;
+}
+
+/*@ requires valid_string_s1: valid_read_string(s1);
+    requires valid_string_s2: valid_read_string(s2);
+    ensures acsl_c_equiv: \result ≡ strcmp(\old(s1), \old(s2));
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s1 + (0 ..))), (indirect: *(s2 + (0 ..)));
+ */
+int strcmp(char const *s1, char const *s2)
+{
+  int __retres;
+  size_t i;
+  i = (unsigned int)0;
+  while ((int)*(s1 + i) == (int)*(s2 + i)) {
+    if ((int)*(s1 + i) == 0) {
+      __retres = 0;
+      goto return_label;
+    }
+    i += (size_t)1;
+  }
+  __retres = (int)*((unsigned char *)s1 + i) - (int)*((unsigned char *)s2 + i);
+  return_label: return __retres;
+}
+
+/*@ requires valid_string_s1: valid_read_nstring(s1, n);
+    requires valid_string_s2: valid_read_nstring(s2, n);
+    ensures acsl_c_equiv: \result ≡ strncmp(\old(s1), \old(s2), \old(n));
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s1 + (0 .. n - 1))),
+            (indirect: *(s2 + (0 .. n - 1))), (indirect: n);
+ */
+int strncmp(char const *s1, char const *s2, size_t n)
+{
+  int __retres;
+  {
+    size_t i = (unsigned int)0;
+    while (i < n) {
+      if ((int)*(s1 + i) != (int)*(s2 + i)) {
+        __retres = (int)*((unsigned char *)s1 + i) - (int)*((unsigned char *)s2 + i);
+        goto return_label;
+      }
+      if ((int)*(s1 + i) == 0) {
+        __retres = 0;
+        goto return_label;
+      }
+      i += (size_t)1;
+    }
+  }
+  __retres = 0;
+  return_label: return __retres;
+}
+
+/*@ requires valid_s1: valid_read_or_empty(s1, n);
+    requires valid_s2: valid_read_or_empty(s2, n);
+    requires initialization: s1: \initialized((char *)s1 + (0 .. n - 1));
+    requires initialization: s2: \initialized((char *)s2 + (0 .. n - 1));
+    requires danglingness: s1: non_escaping(s1, n);
+    requires danglingness: s2: non_escaping(s2, n);
+    ensures
+      logic_spec:
+        \result ≡
+        memcmp{Pre, Pre}((char *)\old(s1), (char *)\old(s2), \old(n));
+    assigns \result;
+    assigns \result
+      \from (indirect: *((char *)s1 + (0 .. n - 1))),
+            (indirect: *((char *)s2 + (0 .. n - 1)));
+ */
+int memcmp(void const *s1, void const *s2, size_t n)
+{
+  int __retres;
+  unsigned char const *p1;
+  unsigned char const *p2;
+  p1 = (unsigned char const *)s1;
+  p2 = (unsigned char const *)s2;
+  {
+    size_t i = (unsigned int)0;
+    while (i < n) {
+      if ((int)*(p1 + i) != (int)*(p2 + i)) {
+        __retres = (int)*(p1 + i) - (int)*(p2 + i);
+        goto return_label;
+      }
+      i += (size_t)1;
+    }
+  }
+  __retres = 0;
+  return_label: return __retres;
+}
+
+static int char_equal_ignore_case(char c1, char c2)
+{
+  int __retres;
+  if ((int)c1 >= 'A') 
+    if ((int)c1 <= 'Z') c1 = (char)((int)c1 - ('A' - 'a'));
+  if ((int)c2 >= 'A') 
+    if ((int)c2 <= 'Z') c2 = (char)((int)c2 - ('A' - 'a'));
+  if ((int)c1 == (int)c2) {
+    __retres = 0;
+    goto return_label;
+  }
+  else {
+    __retres = (int)((unsigned char)c2) - (int)((unsigned char)c1);
+    goto return_label;
+  }
+  return_label: return __retres;
+}
+
+/*@ requires valid_string_s1: valid_read_string(s1);
+    requires valid_string_s2: valid_read_string(s2);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s1 + (0 ..))), (indirect: *(s2 + (0 ..)));
+ */
+int strcasecmp(char const *s1, char const *s2)
+{
+  int __retres;
+  size_t i;
+  i = (unsigned int)0;
+  while (1) {
+    if ((int)*(s1 + i) != 0) {
+      if (! ((int)*(s2 + i) != 0)) break;
+    }
+    else break;
+    {
+      int res = char_equal_ignore_case(*(s1 + i),*(s2 + i));
+      if (res != 0) {
+        __retres = res;
+        goto return_label;
+      }
+    }
+    i += (size_t)1;
+  }
+  if ((int)*(s1 + i) == 0) {
+    if ((int)*(s2 + i) == 0) {
+      __retres = 0;
+      goto return_label;
+    }
+    else goto _LAND;
+  }
+  else {
+    _LAND: ;
+    if ((int)*(s1 + i) == 0) {
+      __retres = -1;
+      goto return_label;
+    }
+    else {
+      __retres = 1;
+      goto return_label;
+    }
+  }
+  return_label: return __retres;
+}
+
+/*@ requires valid_string_src: valid_read_string(src);
+    requires valid_string_dest: valid_string(dest);
+    requires room_string: \valid(dest + (0 .. strlen(dest) + strlen(src)));
+    ensures
+      sum_of_lengths: strlen(\old(dest)) ≡ \old(strlen(dest) + strlen(src));
+    ensures
+      initialization: dest:
+        \initialized(\old(dest) + (0 .. \old(strlen(dest) + strlen(src))));
+    ensures
+      dest_null_terminated:
+        *(\old(dest) + \old(strlen(dest) + strlen(src))) ≡ 0;
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *(dest +
+              (strlen{Old}(dest) .. strlen{Old}(dest) + strlen{Old}(src))),
+            \result;
+    assigns
+    *(dest + (strlen{Old}(dest) .. strlen{Old}(dest) + strlen{Old}(src)))
+      \from *(src + (0 .. strlen{Old}(src)));
+    assigns \result \from dest;
+ */
+char *strcat(char *dest, char const *src)
+{
+  size_t i;
+  size_t n = strlen((char const *)dest);
+  i = (unsigned int)0;
+  while ((int)*(src + i) != 0) {
+    *(dest + (n + i)) = *(src + i);
+    i += (size_t)1;
+  }
+  *(dest + (n + i)) = (char)0;
+  return dest;
+}
+
+/*@ requires valid_nstring_src: valid_read_nstring(src, n);
+    requires valid_string_dest: valid_string(dest);
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *(dest + (strlen{Old}(dest) .. strlen{Old}(dest) + n)), \result;
+    assigns *(dest + (strlen{Old}(dest) .. strlen{Old}(dest) + n))
+      \from *(src + (0 .. n));
+    assigns \result \from dest;
+    
+    behavior complete:
+      assumes
+        valid_string_src_fits: valid_read_string(src) ∧ strlen(src) ≤ n;
+      requires
+        room_string: \valid((dest + strlen(dest)) + (0 .. strlen(src)));
+      ensures
+        sum_of_lengths:
+          strlen(\old(dest)) ≡ \old(strlen(dest) + strlen(src));
+      assigns *(dest +
+                (strlen{Old}(dest) .. strlen{Old}(dest) + strlen{Old}(src))),
+              \result;
+      assigns
+      *(dest + (strlen{Old}(dest) .. strlen{Old}(dest) + strlen{Old}(src)))
+        \from *(src + (0 .. strlen{Old}(src)));
+      assigns \result \from dest;
+    
+    behavior partial:
+      assumes
+        valid_string_src_too_large:
+          ¬(valid_read_string(src) ∧ strlen(src) ≤ n);
+      requires room_string: \valid((dest + strlen(dest)) + (0 .. n));
+      ensures
+        sum_of_bounded_lengths:
+          strlen(\old(dest)) ≡ \old(strlen(dest)) + \old(n);
+      assigns *(dest + (strlen{Old}(dest) .. strlen{Old}(dest) + n)),
+              \result;
+      assigns *(dest + (strlen{Old}(dest) .. strlen{Old}(dest) + n))
+        \from *(src + (0 .. strlen{Old}(src)));
+      assigns \result \from dest;
+ */
+char *strncat(char *dest, char const *src, size_t n)
+{
+  size_t i;
+  size_t dest_len = strlen((char const *)dest);
+  i = (unsigned int)0;
+  while (i < n) {
+    if ((int)*(src + i) == 0) break;
+    *(dest + (dest_len + i)) = *(src + i);
+    i += (size_t)1;
+  }
+  *(dest + (dest_len + i)) = (char)0;
+  return dest;
+}
+
+/*@ requires valid_string_src: valid_read_string(src);
+    requires room_string: \valid(dest + (0 .. strlen(src)));
+    requires
+      separation:
+        \separated(dest + (0 .. strlen(src)), src + (0 .. strlen(src)));
+    ensures equal_contents: strcmp(\old(dest), \old(src)) ≡ 0;
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *(dest + (0 .. strlen{Old}(src))), \result;
+    assigns *(dest + (0 .. strlen{Old}(src)))
+      \from *(src + (0 .. strlen{Old}(src)));
+    assigns \result \from dest;
+ */
+char *strcpy(char *dest, char const *src)
+{
+  size_t i;
+  i = (unsigned int)0;
+  while ((int)*(src + i) != 0) {
+    *(dest + i) = *(src + i);
+    i += (size_t)1;
+  }
+  *(dest + i) = (char)0;
+  return dest;
+}
+
+/*@ requires valid_nstring_src: valid_read_nstring(src, n);
+    requires room_nstring: \valid(dest + (0 .. n - 1));
+    requires separation: \separated(dest + (0 .. n - 1), src + (0 .. n - 1));
+    ensures result_ptr: \result ≡ \old(dest);
+    ensures initialization: \initialized(\old(dest) + (0 .. \old(n) - 1));
+    assigns *(dest + (0 .. n - 1)), \result;
+    assigns *(dest + (0 .. n - 1)) \from *(src + (0 .. n - 1));
+    assigns \result \from dest;
+    
+    behavior complete:
+      assumes src_fits: strlen(src) < n;
+      ensures equal_after_copy: strcmp(\old(dest), \old(src)) ≡ 0;
+    
+    behavior partial:
+      assumes src_too_long: n ≤ strlen(src);
+      ensures
+        equal_prefix:
+          memcmp{Post, Post}(\old(dest), \old(src), \old(n)) ≡ 0;
+ */
+char *strncpy(char *dest, char const *src, size_t n)
+{
+  size_t i;
+  i = (unsigned int)0;
+  while (i < n) {
+    *(dest + i) = *(src + i);
+    if ((int)*(src + i) == 0) break;
+    i += (size_t)1;
+  }
+  while (i < n) {
+    *(dest + i) = (char)0;
+    i += (size_t)1;
+  }
+  return dest;
+}
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns \result;
+    assigns \result
+      \from s, (indirect: *(s + (0 .. strlen{Old}(s)))), (indirect: c);
+    
+    behavior found:
+      assumes char_found: strchr(s, c) ≡ \true;
+      ensures result_char: *\result ≡ (char)\old(c);
+      ensures result_same_base: \base_addr(\result) ≡ \base_addr(\old(s));
+      ensures
+        result_in_length: \old(s) ≤ \result ≤ \old(s) + strlen(\old(s));
+      ensures result_valid_string: valid_read_string(\result);
+      ensures
+        result_first_occur:
+          ∀ char *p; \old(s) ≤ p < \result ⇒ *p ≢ (char)\old(c);
+    
+    behavior not_found:
+      assumes char_not_found: ¬(strchr(s, c) ≡ \true);
+      ensures result_null: \result ≡ \null;
+    
+    behavior default:
+      ensures
+        result_null_or_same_base:
+          \result ≡ \null ∨ \base_addr(\result) ≡ \base_addr(\old(s));
+ */
+char *strchr(char const *s, int c)
+{
+  char *__retres;
+  size_t i;
+  char const ch = (char)c;
+  i = (unsigned int)0;
+  while ((int)*(s + i) != (int)ch) {
+    if ((int)*(s + i) == 0) {
+      __retres = (char *)0;
+      goto return_label;
+    }
+    i += (size_t)1;
+  }
+  __retres = (char *)(s + i);
+  return_label: return __retres;
+}
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns \result;
+    assigns \result \from s, *(s + (0 ..)), c;
+    
+    behavior found:
+      assumes char_found: strchr(s, c) ≡ \true;
+      ensures result_char: (int)*\result ≡ \old(c);
+      ensures result_same_base: \base_addr(\result) ≡ \base_addr(\old(s));
+      ensures result_valid_string: valid_read_string(\result);
+    
+    behavior not_found:
+      assumes char_not_found: ¬(strchr(s, c) ≡ \true);
+      ensures result_null: \result ≡ \null;
+    
+    behavior default:
+      ensures
+        result_null_or_same_base:
+          \result ≡ \null ∨ \base_addr(\result) ≡ \base_addr(\old(s));
+ */
+char *strrchr(char const *s, int c)
+{
+  char *__retres;
+  char const ch = (char)c;
+  {
+    size_t tmp;
+    tmp = strlen(s);
+    size_t i = tmp + (size_t)1;
+    while (i > (size_t)0) {
+      if ((int)*(s + (i - (size_t)1)) == (int)ch) {
+        __retres = (char *)(s + (i - (size_t)1));
+        goto return_label;
+      }
+      i -= (size_t)1;
+    }
+  }
+  __retres = (char *)0;
+  return_label: return __retres;
+}
+
+/*@ requires
+      valid:
+        valid_read_or_empty(s, n) ∨
+        \valid_read((unsigned char *)s + (0 .. memchr_off((char *)s, c, n)));
+    requires
+      initialization:
+        \initialized((unsigned char *)s + (0 .. n - 1)) ∨
+        \initialized((unsigned char *)s + (0 .. memchr_off((char *)s, c, n)));
+    requires
+      danglingness:
+        non_escaping(s, n) ∨
+        non_escaping(s, (unsigned int)(memchr_off((char *)s, c, n) + 1));
+    assigns \result;
+    assigns \result \from s, c, *((unsigned char *)s + (0 .. n - 1));
+    
+    behavior found:
+      assumes char_found: memchr((char *)s, c, n) ≡ \true;
+      ensures result_same_base: \base_addr(\result) ≡ \base_addr(\old(s));
+      ensures result_char: (int)*((char *)\result) ≡ \old(c);
+      ensures
+        result_in_str:
+          ∀ ℤ i;
+            0 ≤ i < \old(n) ⇒
+            *((unsigned char *)\old(s) + i) ≡ \old(c) ⇒
+            (unsigned char *)\result ≤ (unsigned char *)\old(s) + i;
+    
+    behavior not_found:
+      assumes char_not_found: ¬(memchr((char *)s, c, n) ≡ \true);
+      ensures result_null: \result ≡ \null;
+ */
+void *memchr(void const *s, int c, size_t n)
+{
+  void *__retres;
+  unsigned char const ch = (unsigned char)c;
+  unsigned char const *ss = (unsigned char const *)s;
+  {
+    size_t i = (unsigned int)0;
+    while (i < n) {
+      if ((int)*(ss + i) == (int)ch) {
+        __retres = (void *)(ss + i);
+        goto return_label;
+      }
+      i += (size_t)1;
+    }
+  }
+  __retres = (void *)0;
+  return_label: return __retres;
+}
+
+void *memrchr(void const *s, int c, size_t n)
+{
+  void *__retres;
+  unsigned char const ch = (unsigned char)c;
+  unsigned char const *ss = (unsigned char const *)s;
+  {
+    size_t i = n;
+    while (i > (size_t)0) {
+      if ((int)*(ss + (i - (size_t)1)) == (int)ch) {
+        __retres = (void *)(ss + (i - (size_t)1));
+        goto return_label;
+      }
+      i -= (size_t)1;
+    }
+  }
+  __retres = (void *)0;
+  return_label: return __retres;
+}
+
+/*@ requires valid_string_haystack: valid_read_string(haystack);
+    requires valid_string_needle: valid_read_string(needle);
+    ensures
+      result_null_or_in_haystack:
+        \result ≡ \null ∨
+        (\subset(\result, \old(haystack) + (0 ..)) ∧
+         \valid_read(\result) ∧
+         memcmp{Pre, Pre}(\result, \old(needle), strlen(\old(needle))) ≡ 0);
+    assigns \result;
+    assigns \result
+      \from haystack, (indirect: *(haystack + (0 ..))),
+            (indirect: *(needle + (0 ..)));
+ */
+char *strstr(char const *haystack, char const *needle)
+{
+  char *__retres;
+  if ((int)*(needle + 0) == 0) {
+    __retres = (char *)haystack;
+    goto return_label;
+  }
+  {
+    size_t i = (unsigned int)0;
+    while ((int)*(haystack + i) != 0) {
+      {
+        size_t j;
+        j = (unsigned int)0;
+        while ((int)*(haystack + (i + j)) != 0) {
+          if ((int)*(haystack + (i + j)) != (int)*(needle + j)) break;
+          j += (size_t)1;
+        }
+        if ((int)*(needle + j) == 0) {
+          __retres = (char *)(haystack + i);
+          goto return_label;
+        }
+      }
+      i += (size_t)1;
+    }
+  }
+  __retres = (char *)0;
+  return_label: return __retres;
+}
+
+static int __fc_strerror_init;
+/*@ ensures result_internal_str: \result ≡ __fc_p_strerror;
+    ensures result_nul_terminated: *(\result + 63) ≡ 0;
+    ensures result_valid_string: valid_read_string(\result);
+    assigns \result;
+    assigns \result \from __fc_p_strerror, (indirect: errnum);
+ */
+char *strerror(int errnum)
+{
+  char *__retres;
+  if (! __fc_strerror_init) {
+    Frama_C_make_unknown(__fc_strerror,(unsigned int)63);
+    __fc_strerror[63] = (char)0;
+    __fc_strerror_init = 1;
+  }
+  __retres = __fc_strerror;
+  return __retres;
+}
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s + (0 .. strlen{Old}(s)))),
+            (indirect: __fc_heap_status);
+    allocates \result;
+    
+    behavior allocation:
+      assumes can_allocate: is_allocable(strlen(s));
+      ensures allocation: \fresh{Old, Here}(\result,strlen(\old(s)));
+      ensures
+        result_valid_string_and_same_contents:
+          valid_string(\result) ∧ strcmp(\result, \old(s)) ≡ 0;
+      assigns __fc_heap_status, \result;
+      assigns __fc_heap_status \from (indirect: s), __fc_heap_status;
+      assigns \result
+        \from (indirect: *(s + (0 .. strlen{Old}(s)))),
+              (indirect: __fc_heap_status);
+    
+    behavior no_allocation:
+      assumes cannot_allocate: ¬is_allocable(strlen(s));
+      ensures result_null: \result ≡ \null;
+      assigns \result;
+      assigns \result \from \nothing;
+      allocates \nothing;
+ */
+char *strdup(char const *s)
+{
+  char *__retres;
+  size_t tmp;
+  tmp = strlen(s);
+  size_t l = tmp + (size_t)1;
+  char *p = malloc(l);
+  if (! p) {
+    __fc_errno = 12;
+    __retres = (char *)0;
+    goto return_label;
+  }
+  memcpy((void *)p,(void const *)s,l);
+  __retres = p;
+  return_label: return __retres;
+}
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s + (0 .. strlen{Old}(s)))), (indirect: n),
+            (indirect: __fc_heap_status);
+    allocates \result;
+    
+    behavior allocation:
+      assumes can_allocate: is_allocable(\min(strlen(s), n + 1));
+      ensures
+        allocation:
+          \fresh{Old, Here}(\result,\min(strlen(\old(s)), \old(n) + 1));
+      ensures
+        result_valid_string_bounded_and_same_prefix:
+          \valid(\result + (0 .. \min(strlen(\old(s)), \old(n)))) ∧
+          valid_string(\result) ∧ strlen(\result) ≤ \old(n) ∧
+          strncmp(\result, \old(s), \old(n)) ≡ 0;
+      assigns __fc_heap_status, \result;
+      assigns __fc_heap_status
+        \from (indirect: s), (indirect: n), __fc_heap_status;
+      assigns \result
+        \from (indirect: *(s + (0 .. strlen{Old}(s)))), (indirect: n),
+              (indirect: __fc_heap_status);
+    
+    behavior no_allocation:
+      assumes cannot_allocate: ¬is_allocable(\min(strlen(s), n + 1));
+      ensures result_null: \result ≡ \null;
+      assigns \result;
+      assigns \result \from \nothing;
+      allocates \nothing;
+ */
+char *strndup(char const *s, size_t n)
+{
+  char *__retres;
+  size_t l;
+  l = (unsigned int)0;
+  while (l < n) {
+    if ((int)*(s + l) == 0) break;
+    l += (size_t)1;
+  }
+  char *p = malloc(l + (size_t)1);
+  if (! p) {
+    __fc_errno = 12;
+    __retres = (char *)0;
+    goto return_label;
+  }
+  memcpy((void *)p,(void const *)s,l);
+  *(p + l) = (char)0;
+  __retres = p;
+  return_label: return __retres;
+}
+
+static int __fc_strsignal_init;
+/*@ ensures result_internal_str: \result ≡ __fc_p_strsignal;
+    ensures result_nul_terminated: *(\result + 63) ≡ 0;
+    ensures result_valid_string: valid_read_string(\result);
+    assigns \result;
+    assigns \result \from __fc_p_strsignal, (indirect: signum);
+ */
+char *strsignal(int signum)
+{
+  char *__retres;
+  if (! __fc_strsignal_init) {
+    Frama_C_make_unknown(__fc_strsignal,(unsigned int)63);
+    __fc_strsignal[63] = (char)0;
+    __fc_strsignal_init = 1;
+  }
+  __retres = __fc_strsignal;
+  return __retres;
+}
+
+/*@ ghost unsigned int volatile __fc_time __attribute__((__FRAMA_C_MODEL__));
+  */
+/*@ assigns \result;
+    assigns \result \from __fc_time; */
+extern clock_t clock(void);
+
+/*@ assigns \result;
+    assigns \result \from time1, time0; */
+extern double difftime(time_t time1, time_t time0);
+
+/*@ requires valid_timeptr: \valid(timeptr);
+    assigns *timeptr, \result;
+    assigns *timeptr \from *timeptr;
+    assigns \result \from (indirect: *timeptr);
+ */
+extern time_t mktime(struct tm *timeptr);
+
+/*@ assigns *timer, \result;
+    assigns *timer \from __fc_time;
+    assigns \result \from __fc_time;
+    
+    behavior null:
+      assumes timer_null: timer ≡ \null;
+      assigns \result;
+      assigns \result \from __fc_time;
+    
+    behavior not_null:
+      assumes timer_non_null: timer ≢ \null;
+      requires valid_timer: \valid(timer);
+      ensures initialization: timer: \initialized(\old(timer));
+      assigns *timer, \result;
+      assigns *timer \from __fc_time;
+      assigns \result \from __fc_time;
+    
+    complete behaviors not_null, null;
+    disjoint behaviors not_null, null;
+ */
+extern time_t time(time_t *timer);
+
+char __fc_ctime[26];
+char * const __fc_p_ctime = __fc_ctime;
+/*@ requires valid_timer: \valid_read(timer);
+    requires initialization: init_timer: \initialized(timer);
+    ensures result_points_to_ctime: \result ≡ __fc_p_ctime;
+    ensures result_valid_string: valid_read_string(__fc_p_ctime);
+    assigns __fc_ctime[0 .. 25], \result;
+    assigns __fc_ctime[0 .. 25]
+      \from (indirect: *timer), (indirect: __fc_time);
+    assigns \result
+      \from (indirect: *timer), (indirect: __fc_time), __fc_p_ctime;
+ */
+extern char *ctime(time_t const *timer);
+
+struct tm __fc_time_tm;
+struct tm * const __fc_p_time_tm = & __fc_time_tm;
+/*@ requires valid_timer: \valid_read(timer);
+    ensures
+      result_null_or_internal_tm:
+        \result ≡ &__fc_time_tm ∨ \result ≡ \null;
+    assigns \result, __fc_time_tm;
+    assigns \result \from __fc_p_time_tm;
+    assigns __fc_time_tm \from *timer;
+ */
+extern struct tm *gmtime(time_t const *timer);
+
+/*@ requires valid_timer: \valid_read(timer);
+    ensures
+      result_null_or_internal_tm:
+        \result ≡ &__fc_time_tm ∨ \result ≡ \null;
+    assigns \result, __fc_time_tm;
+    assigns \result \from __fc_p_time_tm;
+    assigns __fc_time_tm \from *timer;
+ */
+extern struct tm *localtime(time_t const *timer);
+
+/*@ requires dst_has_room: \valid(s + (0 .. max - 1));
+    requires valid_format: valid_read_string(format);
+    requires valid_tm: \valid_read(tm);
+    ensures result_bounded: \result ≤ \old(max);
+    assigns *(s + (0 .. max - 1)), \result;
+    assigns *(s + (0 .. max - 1))
+      \from (indirect: max), (indirect: *(format + (0 ..))), (indirect: *tm);
+    assigns \result
+      \from (indirect: max), (indirect: *(format + (0 ..))), (indirect: *tm);
+ */
+extern size_t strftime(char * __restrict s, size_t max,
+                       char const * __restrict format,
+                       struct tm const * __restrict tm);
+
+/*@ requires tp: \valid(tp);
+    assigns \result, *tp, __fc_time;
+    assigns \result \from __fc_time;
+    assigns *tp \from __fc_time;
+    assigns __fc_time \from __fc_time;
+    
+    behavior realtime_clock:
+      assumes realtime: clk_id ≡ 666;
+      ensures success: \result ≡ 0;
+      ensures initialization: \initialized(\old(tp));
+    
+    behavior monotonic_clock:
+      assumes monotonic: clk_id ≡ 1;
+      ensures success: \result ≡ 0;
+      ensures initialization: \initialized(\old(tp));
+    
+    behavior bad_clock_id:
+      assumes bad_id: clk_id ≢ 666 ∧ clk_id ≢ 1;
+      ensures error: \result ≡ 22;
+      assigns \result;
+      assigns \result \from clk_id;
+    
+    complete behaviors bad_clock_id, monotonic_clock, realtime_clock;
+    disjoint behaviors bad_clock_id, monotonic_clock, realtime_clock;
+ */
+extern int clock_gettime(clockid_t clk_id, struct timespec *tp);
+
+/*@
+axiomatic nanosleep_predicates {
+  predicate abs_clock_in_range{L}(clockid_t id, struct timespec *tm) 
+    reads __fc_time;
+  
+  predicate valid_clock_id{L}(clockid_t id) 
+    reads __fc_time;
+  
+  }
+
+*/
+/*@ ghost int volatile __fc_interrupted __attribute__((__FRAMA_C_MODEL__));
+  */
+/*@ requires valid_request: \valid_read(rqtp);
+    requires
+      initialization: initialized_request:
+        \initialized(&rqtp->tv_sec) ∧ \initialized(&rqtp->tv_nsec);
+    requires valid_nanosecs: 0 ≤ rqtp->tv_nsec < 1000000000;
+    requires valid_remaining_or_null: rmtp ≡ \null ∨ \valid(rmtp);
+    assigns \result;
+    assigns \result
+      \from (indirect: __fc_time), (indirect: __fc_interrupted),
+            (indirect: clock_id), (indirect: flags), (indirect: rqtp),
+            (indirect: *rqtp);
+    
+    behavior absolute:
+      assumes absolute_time: (flags & 1) ≢ 0;
+      assumes
+        no_einval:
+          abs_clock_in_range(clock_id, rqtp) ∧ valid_clock_id(clock_id);
+      ensures
+        result_ok_or_error:
+          \result ≡ 0 ∨ \result ≡ 4 ∨ \result ≡ 22 ∨
+          \result ≡ 95;
+      assigns \result;
+      assigns \result
+        \from (indirect: __fc_time), (indirect: __fc_interrupted),
+              (indirect: clock_id), (indirect: rqtp), (indirect: *rqtp);
+    
+    behavior relative_interrupted:
+      assumes relative_time: (flags & 1) ≡ 0;
+      assumes interrupted: __fc_interrupted ≢ 0;
+      assumes no_einval: valid_clock_id(clock_id);
+      ensures result_interrupted: \result ≡ 4;
+      ensures
+        initialization: interrupted_remaining:
+          \old(rmtp) ≢ \null ⇒
+          \initialized(&\old(rmtp)->tv_sec) ∧
+          \initialized(&\old(rmtp)->tv_nsec);
+      ensures
+        interrupted_remaining_decreases:
+          \old(rmtp) ≢ \null ⇒
+          \old(rqtp)->tv_sec * 1000000000 + \old(rqtp)->tv_nsec ≥
+          \old(rmtp)->tv_sec * 1000000000 + \old(rmtp)->tv_nsec;
+      ensures
+        remaining_valid:
+          \old(rmtp) ≢ \null ⇒ 0 ≤ \old(rmtp)->tv_nsec < 1000000000;
+      assigns \result, *rmtp;
+      assigns \result
+        \from (indirect: __fc_time), (indirect: clock_id), (indirect: rqtp),
+              (indirect: *rqtp);
+      assigns *rmtp
+        \from __fc_time, (indirect: clock_id), (indirect: rqtp),
+              (indirect: *rqtp), (indirect: rmtp);
+    
+    behavior relative_no_error:
+      assumes relative_time: (flags & 1) ≡ 0;
+      assumes not_interrupted: __fc_interrupted ≡ 0;
+      assumes no_einval: valid_clock_id(clock_id);
+      ensures result_ok: \result ≡ 0;
+      assigns \result;
+      assigns \result
+        \from (indirect: __fc_time), (indirect: clock_id), (indirect: rqtp),
+              (indirect: *rqtp);
+    
+    behavior relative_invalid_clock_id:
+      assumes relative_time: (flags & 1) ≡ 0;
+      assumes not_interrupted: __fc_interrupted ≡ 0;
+      assumes einval: ¬valid_clock_id(clock_id);
+      ensures result_einval: \result ≡ 22;
+      assigns \result;
+      assigns \result
+        \from (indirect: __fc_time), (indirect: clock_id), (indirect: rqtp),
+              (indirect: *rqtp);
+    
+    complete behaviors relative_invalid_clock_id,
+                       relative_no_error,
+                       relative_interrupted,
+                       absolute;
+    disjoint behaviors relative_invalid_clock_id,
+                       relative_no_error,
+                       relative_interrupted,
+                       absolute;
+ */
+extern int clock_nanosleep(clockid_t clock_id, int flags,
+                           struct timespec const *rqtp, struct timespec *rmtp);
+
+/*@ requires valid_timer: \valid_read(timer);
+    requires valid_result: \valid(result);
+    ensures
+      result_null_or_result: \result ≡ \old(result) ∨ \result ≡ \null;
+    assigns \result, *result;
+    assigns \result \from (indirect: *timer), result;
+    assigns *result \from (indirect: *timer);
+ */
+extern struct tm *gmtime_r(time_t const * __restrict timer,
+                           struct tm * __restrict result);
+
+/*@ requires valid_request: \valid_read(rqtp);
+    requires
+      initialization: initialized_request:
+        \initialized(&rqtp->tv_sec) ∧ \initialized(&rqtp->tv_nsec);
+    requires valid_nanosecs: 0 ≤ rqtp->tv_nsec < 1000000000;
+    requires valid_remaining_or_null: rmtp ≡ \null ∨ \valid(rmtp);
+    ensures result_elapsed_or_interrupted: \result ≡ 0 ∨ \result ≡ -1;
+    ensures
+      initialization: interrupted_remaining:
+        \old(rmtp) ≢ \null ∧ \result ≡ -1 ⇒
+        \initialized(&\old(rmtp)->tv_sec) ∧
+        \initialized(&\old(rmtp)->tv_nsec);
+    ensures
+      interrupted_remaining_decreases:
+        \old(rmtp) ≢ \null ∧ \result ≡ -1 ⇒
+        \old(rqtp)->tv_sec * 1000000000 + \old(rqtp)->tv_nsec ≥
+        \old(rmtp)->tv_sec * 1000000000 + \old(rmtp)->tv_nsec;
+    ensures
+      interrupted_remaining_valid:
+        \old(rmtp) ≢ \null ∧ \result ≡ -1 ⇒
+        0 ≤ \old(rmtp)->tv_nsec < 1000000000;
+    assigns \result, *rmtp;
+    assigns \result
+      \from (indirect: __fc_time), (indirect: rqtp), (indirect: *rqtp);
+    assigns *rmtp
+      \from (indirect: __fc_time), (indirect: rqtp), (indirect: *rqtp),
+            (indirect: rmtp);
+ */
+extern int nanosleep(struct timespec const *rqtp, struct timespec *rmtp);
+
+extern char *tzname[2];
+
+/*@ assigns *(tzname[0 .. 1] + (0 ..));
+    assigns *(tzname[0 .. 1] + (0 ..)) \from \nothing;
+ */
+extern void tzset(void);
+
+/*@ requires
+      valid:
+        valid_read_or_empty((void *)s, (unsigned int)(sizeof(wchar_t) * n)) ∨
+        \valid_read((unsigned char *)s + (0 .. wmemchr_off(s, c, n)));
+    requires
+      initialization:
+        \initialized(s + (0 .. n - 1)) ∨
+        \initialized(s + (0 .. wmemchr_off(s, c, n)));
+    requires
+      danglingness:
+        non_escaping((void *)s, (unsigned int)(sizeof(wchar_t) * n)) ∨
+        non_escaping((void *)s,
+                    (unsigned int)(sizeof(wchar_t) *
+                                   (wmemchr_off(s, c, n) + 1)));
+    ensures
+      result_null_or_inside_s:
+        \result ≡ \null ∨ \subset(\result, \old(s) + (0 .. \old(n) - 1));
+    assigns \result;
+    assigns \result
+      \from s, (indirect: *(s + (0 .. n - 1))), (indirect: c), (indirect: n);
+ */
+extern wchar_t *wmemchr(wchar_t const *s, wchar_t c, size_t n);
+
+/*@ requires
+      valid_s1:
+        valid_read_or_empty((void *)s1, (unsigned int)(sizeof(wchar_t) * n));
+    requires
+      valid_s2:
+        valid_read_or_empty((void *)s2, (unsigned int)(sizeof(wchar_t) * n));
+    requires initialization: s1: \initialized(s1 + (0 .. n - 1));
+    requires initialization: s2: \initialized(s2 + (0 .. n - 1));
+    requires
+      danglingness: s1:
+        non_escaping((void *)s1, (unsigned int)(sizeof(wchar_t) * n));
+    requires
+      danglingness: s2:
+        non_escaping((void *)s2, (unsigned int)(sizeof(wchar_t) * n));
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s1 + (0 .. n - 1))),
+            (indirect: *(s2 + (0 .. n - 1))), (indirect: n);
+ */
+extern int wmemcmp(wchar_t const *s1, wchar_t const *s2, size_t n);
+
+wchar_t *wmemcpy(wchar_t *dest, wchar_t const *src, size_t n);
+
+/*@ requires valid_src: \valid_read(src + (0 .. n - 1));
+    requires valid_dest: \valid(dest + (0 .. n - 1));
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *(dest + (0 .. n - 1)), \result;
+    assigns *(dest + (0 .. n - 1))
+      \from *(src + (0 .. n - 1)), (indirect: src), (indirect: n);
+    assigns \result \from dest;
+ */
+extern wchar_t *wmemmove(wchar_t *dest, wchar_t const *src, size_t n);
+
+wchar_t *wmemset(wchar_t *dest, wchar_t val, size_t len);
+
+wchar_t *wcscat(wchar_t *dest, wchar_t const *src);
+
+/*@ requires valid_wstring_src: valid_read_wstring(wcs);
+    ensures
+      result_null_or_inside_wcs:
+        \result ≡ \null ∨ \subset(\result, \old(wcs) + (0 ..));
+    assigns \result;
+    assigns \result \from wcs, (indirect: *(wcs + (0 ..))), (indirect: wc);
+ */
+extern wchar_t *wcschr(wchar_t const *wcs, wchar_t wc);
+
+/*@ requires valid_wstring_s1: valid_read_wstring(s1);
+    requires valid_wstring_s2: valid_read_wstring(s2);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s1 + (0 ..))), (indirect: *(s2 + (0 ..)));
+ */
+extern int wcscmp(wchar_t const *s1, wchar_t const *s2);
+
+wchar_t *wcscpy(wchar_t *dest, wchar_t const *src);
+
+/*@ requires valid_wstring_wcs: valid_read_wstring(wcs);
+    requires valid_wstring_accept: valid_read_wstring(accept);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(wcs + (0 ..))), (indirect: *(accept + (0 ..)));
+ */
+extern size_t wcscspn(wchar_t const *wcs, wchar_t const *accept);
+
+/*@ requires valid_nwstring_src: valid_read_nwstring(src, n);
+    requires valid_wstring_dest: valid_wstring(dest);
+    requires
+      room_for_concatenation:
+        \valid(dest + (wcslen(dest) .. wcslen(dest) + \min(wcslen(src), n)));
+    requires
+      separation:
+        \separated(
+          dest + (0 .. wcslen(dest) + wcslen(src)), src + (0 .. wcslen(src))
+          );
+    assigns *(dest + (0 ..)), \result;
+    assigns *(dest + (0 ..))
+      \from *(dest + (0 ..)), (indirect: dest), *(src + (0 .. n - 1)),
+            (indirect: src), (indirect: n);
+    assigns \result
+      \from (indirect: *(dest + (0 ..))), (indirect: *(src + (0 .. n - 1))),
+            (indirect: n);
+ */
+extern size_t wcslcat(wchar_t * __restrict dest,
+                      wchar_t const * __restrict src, size_t n);
+
+/*@ requires valid_wstring_src: valid_read_wstring(src);
+    requires room_nwstring: \valid(dest + (0 .. n));
+    requires
+      separation: dest: src:
+        \separated(dest + (0 .. n - 1), src + (0 .. n - 1));
+    assigns *(dest + (0 .. n - 1)), \result;
+    assigns *(dest + (0 .. n - 1))
+      \from *(src + (0 .. n - 1)), (indirect: src), (indirect: n);
+    assigns \result
+      \from (indirect: *(dest + (0 .. n - 1))), (indirect: dest),
+            (indirect: *(src + (0 .. n - 1))), (indirect: src), (indirect: n);
+ */
+extern size_t wcslcpy(wchar_t *dest, wchar_t const *src, size_t n);
+
+size_t wcslen(wchar_t const *str);
+
+wchar_t *wcsncat(wchar_t *dest, wchar_t const *src, size_t n);
+
+/*@ requires valid_wstring_s1: valid_read_wstring(s1);
+    requires valid_wstring_s2: valid_read_wstring(s2);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s1 + (0 .. n - 1))),
+            (indirect: *(s2 + (0 .. n - 1))), (indirect: n);
+ */
+extern int wcsncmp(wchar_t const *s1, wchar_t const *s2, size_t n);
+
+wchar_t *wcsncpy(wchar_t *dest, wchar_t const *src, size_t n);
+
+/*@ requires valid_wstring_wcs: valid_read_wstring(wcs);
+    requires valid_wstring_accept: valid_read_wstring(accept);
+    ensures
+      result_null_or_inside_wcs:
+        \result ≡ \null ∨ \subset(\result, \old(wcs) + (0 ..));
+    assigns \result;
+    assigns \result
+      \from wcs, (indirect: *(wcs + (0 ..))), (indirect: *(accept + (0 ..)));
+ */
+extern wchar_t *wcspbrk(wchar_t const *wcs, wchar_t const *accept);
+
+/*@ requires valid_wstring_wcs: valid_read_wstring(wcs);
+    ensures
+      result_null_or_inside_wcs:
+        \result ≡ \null ∨ \subset(\result, \old(wcs) + (0 ..));
+    assigns \result;
+    assigns \result
+      \from wcs, (indirect: *(wcs + (0 .. wcslen{Old}(wcs)))), (indirect: wc);
+ */
+extern wchar_t *wcsrchr(wchar_t const *wcs, wchar_t wc);
+
+/*@ requires valid_wstring_wcs: valid_read_wstring(wcs);
+    requires valid_wstring_accept: valid_read_wstring(accept);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(wcs + (0 .. wcslen{Old}(wcs)))),
+            (indirect: *(accept + (0 .. wcslen{Old}(accept))));
+ */
+extern size_t wcsspn(wchar_t const *wcs, wchar_t const *accept);
+
+/*@ requires valid_wstring_haystack: valid_read_wstring(haystack);
+    requires valid_wstring_needle: valid_read_wstring(needle);
+    ensures
+      result_null_or_inside_haystack:
+        \result ≡ \null ∨ \subset(\result, \old(haystack) + (0 ..));
+    assigns \result;
+    assigns \result
+      \from haystack, (indirect: *(haystack + (0 ..))),
+            (indirect: *(needle + (0 ..)));
+ */
+extern wchar_t *wcsstr(wchar_t const *haystack, wchar_t const *needle);
+
+/*@ requires room_nwstring: \valid(ws + (0 .. n - 1));
+    requires valid_stream: \valid(stream);
+    ensures result_null_or_same: \result ≡ \null ∨ \result ≡ \old(ws);
+    ensures
+      terminated_string_on_success:
+        \result ≢ \null ⇒ valid_wstring(\old(ws));
+    assigns *(ws + (0 .. n - 1)), \result;
+    assigns *(ws + (0 .. n - 1)) \from (indirect: n), (indirect: *stream);
+    assigns \result \from ws, (indirect: n), (indirect: *stream);
+ */
+extern wchar_t *fgetws(wchar_t * __restrict ws, int n,
+                       FILE * __restrict stream);
+
+/*@ axiomatic wformat_length {
+      logic ℤ wformat_length{L}(wchar_t *format) ;
+      
+      }
+
+*/
+/*@ requires
+      valid_dest:
+        valid_or_empty((void *)dest, (unsigned int)(sizeof(wchar_t) * n));
+    requires
+      valid_src:
+        valid_read_or_empty((void *)src, (unsigned int)(sizeof(wchar_t) * n));
+    requires
+      separation: dest: src:
+        \separated(dest + (0 .. n - 1), src + (0 .. n - 1));
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *(dest + (0 .. n - 1)), \result;
+    assigns *(dest + (0 .. n - 1))
+      \from *(src + (0 .. n - 1)), (indirect: src), (indirect: n);
+    assigns \result \from dest;
+ */
+wchar_t *wmemcpy(wchar_t *dest, wchar_t const *src, size_t n)
+{
+  {
+    size_t i = (unsigned int)0;
+    while (i < n) {
+      *(dest + i) = *(src + i);
+      i += (size_t)1;
+    }
+  }
+  return dest;
+}
+
+/*@ requires valid_wcs: \valid(dest + (0 .. len - 1));
+    ensures result_ptr: \result ≡ \old(dest);
+    ensures
+      initialization: wcs: \initialized(\old(dest) + (0 .. \old(len) - 1));
+    ensures
+      contents_equal_wc:
+        \subset(*(\old(dest) + (0 .. \old(len) - 1)), \old(val));
+    assigns *(dest + (0 .. len - 1)), \result;
+    assigns *(dest + (0 .. len - 1)) \from val, (indirect: len);
+    assigns \result \from dest;
+ */
+wchar_t *wmemset(wchar_t *dest, wchar_t val, size_t len)
+{
+  {
+    size_t i = (unsigned int)0;
+    while (i < len) {
+      *(dest + i) = val;
+      i += (size_t)1;
+    }
+  }
+  return dest;
+}
+
+/*@ requires valid_wstring_src: valid_read_wstring(src);
+    requires room_wstring: \valid(dest + (0 .. wcslen(src)));
+    requires
+      separation:
+        \separated(dest + (0 .. wcslen(src)), src + (0 .. wcslen(src)));
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *(dest + (0 .. wcslen{Old}(src))), \result;
+    assigns *(dest + (0 .. wcslen{Old}(src)))
+      \from *(src + (0 .. wcslen{Old}(src))), (indirect: src);
+    assigns \result \from dest;
+ */
+wchar_t *wcscpy(wchar_t *dest, wchar_t const *src)
+{
+  size_t i;
+  i = (unsigned int)0;
+  while (*(src + i) != 0) {
+    *(dest + i) = *(src + i);
+    i += (size_t)1;
+  }
+  *(dest + i) = 0;
+  return dest;
+}
+
+/*@ requires valid_string_s: valid_read_wstring(str);
+    ensures result_is_length: \result ≡ wcslen(\old(str));
+    assigns \result;
+    assigns \result \from (indirect: *(str + (0 .. wcslen{Old}(str))));
+ */
+size_t wcslen(wchar_t const *str)
+{
+  size_t i;
+  i = (unsigned int)0;
+  while (*(str + i) != 0) i += (size_t)1;
+  return i;
+}
+
+/*@ requires valid_wstring_src: valid_read_wstring(src);
+    requires room_nwstring: \valid(dest + (0 .. n - 1));
+    requires
+      separation: dest: src:
+        \separated(dest + (0 .. n - 1), src + (0 .. n - 1));
+    ensures result_ptr: \result ≡ \old(dest);
+    ensures initialization: \initialized(\old(dest) + (0 .. \old(n) - 1));
+    assigns *(dest + (0 .. n - 1)), \result;
+    assigns *(dest + (0 .. n - 1))
+      \from *(src + (0 .. n - 1)), (indirect: src), (indirect: n);
+    assigns \result \from dest;
+ */
+wchar_t *wcsncpy(wchar_t *dest, wchar_t const *src, size_t n)
+{
+  size_t i;
+  i = (unsigned int)0;
+  while (i < n) {
+    *(dest + i) = *(src + i);
+    if (*(src + i) == 0) break;
+    i += (size_t)1;
+  }
+  while (i < n) {
+    *(dest + i) = 0;
+    i += (size_t)1;
+  }
+  return dest;
+}
+
+/*@ requires valid_wstring_src: valid_read_wstring(src);
+    requires valid_wstring_dest: valid_wstring(dest);
+    requires
+      room_for_concatenation:
+        \valid(dest + (wcslen(dest) .. wcslen(dest) + wcslen(src)));
+    requires
+      separation:
+        \separated(
+          dest + (0 .. wcslen(dest) + wcslen(src)), src + (0 .. wcslen(src))
+          );
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *(dest + (0 ..)), \result;
+    assigns *(dest + (0 ..))
+      \from *(dest + (0 ..)), (indirect: dest), *(src + (0 ..)),
+            (indirect: src);
+    assigns \result \from dest;
+ */
+wchar_t *wcscat(wchar_t *dest, wchar_t const *src)
+{
+  size_t i;
+  size_t n = wcslen((wchar_t const *)dest);
+  i = (unsigned int)0;
+  while (*(src + i) != 0) {
+    *(dest + (n + i)) = *(src + i);
+    i += (size_t)1;
+  }
+  *(dest + (n + i)) = 0;
+  return dest;
+}
+
+/*@ requires valid_nwstring_src: valid_read_nwstring(src, n);
+    requires valid_wstring_dest: valid_wstring(dest);
+    requires
+      room_for_concatenation:
+        \valid(dest + (wcslen(dest) .. wcslen(dest) + \min(wcslen(src), n)));
+    requires
+      separation:
+        \separated(
+          dest + (0 .. wcslen(dest) + wcslen(src)), src + (0 .. wcslen(src))
+          );
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *(dest + (0 ..)), \result;
+    assigns *(dest + (0 ..))
+      \from *(dest + (0 ..)), (indirect: dest), *(src + (0 .. n - 1)),
+            (indirect: src), (indirect: n);
+    assigns \result \from dest;
+ */
+wchar_t *wcsncat(wchar_t *dest, wchar_t const *src, size_t n)
+{
+  size_t i;
+  size_t dest_len = wcslen((wchar_t const *)dest);
+  i = (unsigned int)0;
+  while (1) {
+    if (i < n) {
+      if (! (*(src + i) != 0)) break;
+    }
+    else break;
+    *(dest + (dest_len + i)) = *(src + i);
+    i += (size_t)1;
+  }
+  *(dest + (dest_len + i)) = 0;
+  return dest;
+}
+
+/*@ ghost extern int __fc_stack_status __attribute__((__FRAMA_C_MODEL__)); */
+
+/*@ ensures allocation: \fresh{Old, Here}(\result,\old(size));
+    assigns __fc_stack_status, \result;
+    assigns __fc_stack_status \from size, __fc_stack_status;
+    assigns \result \from (indirect: size), (indirect: __fc_stack_status);
+    allocates \result;
+ */
+extern void *alloca(size_t size);
+
+DIR __fc_opendir[16];
+DIR * const __fc_p_opendir = __fc_opendir;
+/*@ requires
+      dirp_valid_dir_stream: \subset(dirp, &__fc_opendir[0 .. 16 - 1]);
+    ensures
+      err_or_closed_on_success:
+        (\result ≡ 0 ∧ \old(dirp)->__fc_dir_inode ≡ \null) ∨
+        \result ≡ -1;
+    assigns \result, __fc_errno, *dirp;
+    assigns \result \from dirp, *dirp, __fc_p_opendir;
+    assigns __fc_errno \from dirp, *dirp, __fc_p_opendir;
+    assigns *dirp \from dirp, *dirp, __fc_p_opendir;
+ */
+extern int closedir(DIR *dirp);
+
+/*@ ensures result_null_or_valid: \result ≡ \null ∨ \valid(\result);
+    ensures
+      valid_dir_stream_on_success:
+        \result ≢ \null ⇒ \result ≡ &__fc_opendir[\result->__fc_dir_id];
+    ensures
+      stream_positioned_on_success:
+        \result ≢ \null ⇒ \result->__fc_dir_inode ≢ \null;
+    assigns \result, __fc_errno;
+    assigns \result \from *(path + (0 ..)), __fc_p_opendir;
+    assigns __fc_errno \from *(path + (0 ..)), __fc_p_opendir;
+ */
+extern DIR *opendir(char const *path);
+
+/*@ requires
+      dirp_valid_dir_stream: \subset(dirp, &__fc_opendir[0 .. 16 - 1]);
+    ensures result_null_or_valid: \result ≡ \null ∨ \valid(\result);
+    assigns \result, dirp->__fc_dir_position, __fc_errno;
+    assigns \result \from *dirp, __fc_p_opendir;
+    assigns dirp->__fc_dir_position \from dirp->__fc_dir_position;
+    assigns __fc_errno \from dirp, *dirp, __fc_p_opendir;
+ */
+extern struct dirent *readdir(DIR *dirp);
+
+/*@ requires valid_fdset: \valid(fdset);
+    requires initialization: \initialized(fdset);
+    assigns *fdset;
+    assigns *fdset \from *fdset, (indirect: fd);
+ */
+extern void FD_CLR(int fd, fd_set *fdset);
+
+/*@ requires valid_fdset: \valid_read(fdset);
+    requires initialization: \initialized(fdset);
+    assigns \result;
+    assigns \result \from (indirect: *fdset), (indirect: fd);
+ */
+extern int FD_ISSET(int fd, fd_set const *fdset);
+
+/*@ requires valid_fdset: \valid(fdset);
+    requires initialization: \initialized(fdset);
+    assigns *fdset;
+    assigns *fdset \from *fdset, (indirect: fd);
+ */
+extern void FD_SET(int fd, fd_set *fdset);
+
+/*@ requires valid_fdset: \valid(fdset);
+    ensures initialization: \initialized(\old(fdset));
+    assigns *fdset;
+    assigns *fdset \from \nothing;
+ */
+extern void FD_ZERO(fd_set *fdset);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (int)(\old(a) + \old(b));
+    ensures
+      result_overflow:
+        \old(a) + \old(b) ≡ (int)(\old(a) + \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_sadd_overflow(int a, int b, int *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (long)(\old(a) + \old(b));
+    ensures
+      result_overflow:
+        \old(a) + \old(b) ≡ (long)(\old(a) + \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_saddl_overflow(long a, long b, long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (long long)(\old(a) + \old(b));
+    ensures
+      result_overflow:
+        \old(a) + \old(b) ≡ (long long)(\old(a) + \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_saddll_overflow(long long a, long long b, long long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (unsigned int)(\old(a) + \old(b));
+    ensures
+      result_overflow:
+        \old(a) + \old(b) ≡ (unsigned int)(\old(a) + \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_uadd_overflow(unsigned int a, unsigned int b,
+                              unsigned int *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (unsigned long)(\old(a) + \old(b));
+    ensures
+      result_overflow:
+        \old(a) + \old(b) ≡ (unsigned long)(\old(a) + \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_uaddl_overflow(unsigned long a, unsigned long b,
+                               unsigned long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures
+      res_wrapped: *\old(res) ≡ (unsigned long long)(\old(a) + \old(b));
+    ensures
+      result_overflow:
+        \old(a) + \old(b) ≡ (unsigned long long)(\old(a) + \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_uaddll_overflow(unsigned long long a, unsigned long long b,
+                                unsigned long long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (int)(\old(a) - \old(b));
+    ensures
+      result_overflow:
+        \old(a) - \old(b) ≡ (int)(\old(a) - \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_ssub_overflow(int a, int b, int *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (long)(\old(a) - \old(b));
+    ensures
+      result_overflow:
+        \old(a) - \old(b) ≡ (long)(\old(a) - \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_ssubl_overflow(long a, long b, long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (long long)(\old(a) - \old(b));
+    ensures
+      result_overflow:
+        \old(a) - \old(b) ≡ (long long)(\old(a) - \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_ssubll_overflow(long long a, long long b, long long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (unsigned int)(\old(a) - \old(b));
+    ensures
+      result_overflow:
+        \old(a) - \old(b) ≡ (unsigned int)(\old(a) - \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_usub_overflow(unsigned int a, unsigned int b,
+                              unsigned int *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (unsigned long)(\old(a) - \old(b));
+    ensures
+      result_overflow:
+        \old(a) - \old(b) ≡ (unsigned long)(\old(a) - \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_usubl_overflow(unsigned long a, unsigned long b,
+                               unsigned long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures
+      res_wrapped: *\old(res) ≡ (unsigned long long)(\old(a) - \old(b));
+    ensures
+      result_overflow:
+        \old(a) - \old(b) ≡ (unsigned long long)(\old(a) - \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_usubll_overflow(unsigned long long a, unsigned long long b,
+                                unsigned long long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (int)(\old(a) * \old(b));
+    ensures
+      result_overflow:
+        \old(a) * \old(b) ≡ (int)(\old(a) * \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_smul_overflow(int a, int b, int *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (long)(\old(a) * \old(b));
+    ensures
+      result_overflow:
+        \old(a) * \old(b) ≡ (long)(\old(a) * \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_smull_overflow(long a, long b, long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (long long)(\old(a) * \old(b));
+    ensures
+      result_overflow:
+        \old(a) * \old(b) ≡ (long long)(\old(a) * \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_smulll_overflow(long long a, long long b, long long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (unsigned int)(\old(a) * \old(b));
+    ensures
+      result_overflow:
+        \old(a) * \old(b) ≡ (unsigned int)(\old(a) * \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_umul_overflow(unsigned int a, unsigned int b,
+                              unsigned int *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (unsigned long)(\old(a) * \old(b));
+    ensures
+      result_overflow:
+        \old(a) * \old(b) ≡ (unsigned long)(\old(a) * \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_umull_overflow(unsigned long a, unsigned long b,
+                               unsigned long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures
+      res_wrapped: *\old(res) ≡ (unsigned long long)(\old(a) * \old(b));
+    ensures
+      result_overflow:
+        \old(a) * \old(b) ≡ (unsigned long long)(\old(a) * \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_umulll_overflow(unsigned long long a, unsigned long long b,
+                                unsigned long long *res);
+
+/*@ requires x_nonzero: x ≢ 0;
+    ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_clz(unsigned int x);
+
+/*@ requires x_nonzero: x ≢ 0;
+    ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_clzl(unsigned long x);
+
+/*@ requires x_nonzero: x ≢ 0;
+    ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_clzll(unsigned long long x);
+
+/*@ requires x_nonzero: x ≢ 0;
+    ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_ctz(unsigned int x);
+
+/*@ requires x_nonzero: x ≢ 0;
+    ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_ctzl(unsigned long x);
+
+/*@ requires x_nonzero: x ≢ 0;
+    ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_ctzll(unsigned long long x);
+
+/*@ ensures result_is_bit_count: 0 ≤ \result ≤ 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_popcount(unsigned int x);
+
+/*@ ensures result_is_bit_count: 0 ≤ \result ≤ 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_popcountl(unsigned long x);
+
+/*@ ensures result_is_bit_count: 0 ≤ \result ≤ 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_popcountll(unsigned long long x);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    assigns \result;
+    assigns \result \from (indirect: *(filename + (0 ..))), (indirect: mode);
+ */
+extern int creat(char const *filename, mode_t mode);
+
+/*@ assigns \result;
+    assigns \result \from fd, cmd; */
+extern int fcntl(int fd, int cmd, void * const *__va_params);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(filename + (0 ..))), (indirect: flags);
+ */
+extern int open(char const *filename, int flags, void * const *__va_params);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    assigns \result;
+    assigns \result
+      \from (indirect: dirfd), (indirect: *(filename + (0 ..))),
+            (indirect: flags);
+ */
+extern int openat(int dirfd, char const *filename, int flags,
+                  void * const *__va_params);
+
+/*@ requires cmd_has_void_arg: cmd ≡ 1 ∨ cmd ≡ 3 ∨ cmd ≡ 9;
+    assigns \result;
+    assigns \result \from fd, cmd;
+ */
+extern int __va_fcntl_void(int fd, int cmd);
+
+/*@ requires
+      cmd_has_int_arg:
+        cmd ≡ 0 ∨ cmd ≡ 0x406 ∨ cmd ≡ 4 ∨ cmd ≡ 8 ∨ cmd ≡ 2;
+    assigns \result;
+    assigns \result \from fd, cmd, arg;
+ */
+extern int __va_fcntl_int(int fd, int cmd, int arg);
+
+/*@ requires cmd_as_flock_arg: cmd ≡ 5 ∨ cmd ≡ 6 ∨ cmd ≡ 7;
+    requires valid_arg: \valid(arg);
+    assigns \result, *arg;
+    assigns \result \from fd, cmd, *arg;
+    assigns *arg \from fd, cmd, *arg;
+ */
+extern int __va_fcntl_flock(int fd, int cmd, struct flock *arg);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    requires flag_not_CREAT: (flags & 0x40) ≡ 0;
+    assigns \result;
+    assigns \result
+      \from (indirect: *(filename + (0 ..))), (indirect: flags);
+ */
+extern int __va_open_void(char const *filename, int flags);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(filename + (0 ..))), (indirect: flags),
+            (indirect: mode);
+ */
+extern int __va_open_mode_t(char const *filename, int flags, mode_t mode);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    requires flag_not_CREAT: (flags & 0x40) ≡ 0;
+    assigns \result;
+    assigns \result
+      \from (indirect: dirfd), (indirect: *(filename + (0 ..))),
+            (indirect: flags);
+ */
+extern int __va_openat_void(int dirfd, char const *filename, int flags);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    assigns \result;
+    assigns \result
+      \from (indirect: dirfd), (indirect: *(filename + (0 ..))),
+            (indirect: flags), (indirect: mode);
+ */
+extern int __va_openat_mode_t(int dirfd, char const *filename, int flags,
+                              mode_t mode);
+
+/*@ ghost extern int __fc_tz __attribute__((__FRAMA_C_MODEL__)); */
+
+/*@ requires valid_path: valid_read_string(path);
+    requires
+      valid_times_or_null: \valid_read(times + (0 .. 1)) ∨ times ≡ \null;
+    assigns \result;
+    assigns \result
+      \from (indirect: *(path + (0 .. strlen{Old}(path)))),
+            (indirect: times), (indirect: *(times + (0 .. 1)));
+ */
+extern int utimes(char const *path, struct timeval const * /*[2]*/ times);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns tv->tv_sec, tv->tv_usec, *((struct timezone *)tz), \result;
+    assigns tv->tv_sec \from __fc_time;
+    assigns tv->tv_usec \from __fc_time;
+    assigns *((struct timezone *)tz) \from __fc_tz;
+    assigns \result
+      \from (indirect: tv), (indirect: tz), *tv, *((struct timezone *)tz),
+            __fc_tz;
+    
+    behavior tv_and_tz_null:
+      assumes null_tv_tz: tv ≡ \null ∧ tz ≡ \null;
+      assigns \result;
+      assigns \result \from (indirect: __fc_tz);
+    
+    behavior tv_not_null:
+      assumes non_null_tv_null_tz: tv ≢ \null ∧ tz ≡ \null;
+      ensures
+        initialization: tv_sec: tv_usec:
+          \initialized(&\old(tv)->tv_sec) ∧
+          \initialized(&\old(tv)->tv_usec);
+      ensures tv_usec_bounded: 0 ≤ \old(tv)->tv_usec ≤ 999999;
+      assigns tv->tv_sec, tv->tv_usec, \result;
+      assigns tv->tv_sec \from (indirect: __fc_time);
+      assigns tv->tv_usec \from (indirect: __fc_time);
+      assigns \result \from (indirect: *tv), (indirect: __fc_tz);
+    
+    behavior tz_not_null:
+      assumes null_tv_non_null_tz: tv ≡ \null ∧ tz ≢ \null;
+      ensures initialization: tz: \initialized((struct timezone *)\old(tz));
+      assigns *((struct timezone *)tz), \result;
+      assigns *((struct timezone *)tz) \from __fc_tz;
+      assigns \result
+        \from (indirect: *((struct timezone *)tz)), (indirect: __fc_tz);
+    
+    behavior tv_and_tz_not_null:
+      assumes non_null_tv_tz: tv ≢ \null ∧ tz ≢ \null;
+      ensures
+        initialization: tv_sec: tv_usec:
+          \initialized(&\old(tv)->tv_sec) ∧
+          \initialized(&\old(tv)->tv_usec);
+      ensures initialization: tz: \initialized((struct timezone *)\old(tz));
+      assigns tv->tv_sec, tv->tv_usec, *((struct timezone *)tz), \result;
+      assigns tv->tv_sec \from (indirect: __fc_time);
+      assigns tv->tv_usec \from (indirect: __fc_time);
+      assigns *((struct timezone *)tz) \from __fc_tz;
+      assigns \result
+        \from (indirect: *tv), (indirect: *((struct timezone *)tz)),
+              (indirect: __fc_tz);
+    
+    complete behaviors tv_and_tz_not_null,
+                       tz_not_null,
+                       tv_not_null,
+                       tv_and_tz_null;
+    disjoint behaviors tv_and_tz_not_null,
+                       tz_not_null,
+                       tv_not_null,
+                       tv_and_tz_null;
+ */
+extern int gettimeofday(struct timeval * __restrict tv, void * __restrict tz);
+
+/*@ requires valid_tv_or_null: \valid_read(tv) ∨ tv ≡ \null;
+    requires valid_tz_or_null: \valid_read(tz) ∨ tz ≡ \null;
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns __fc_time, __fc_tz, \result;
+    assigns __fc_time
+      \from tv->tv_sec, tv->tv_usec, tz->tz_dsttime, tz->tz_minuteswest;
+    assigns __fc_tz
+      \from tv->tv_sec, tv->tv_usec, tz->tz_dsttime, tz->tz_minuteswest;
+    assigns \result \from (indirect: *tv), (indirect: *tz);
+ */
+extern int settimeofday(struct timeval const *tv, struct timezone const *tz);
+
+/*@ ghost
+  struct itimerval volatile __fc_itimer_real __attribute__((__FRAMA_C_MODEL__));
+  */
+/*@ ghost
+  struct itimerval volatile __fc_itimer_virtual __attribute__((__FRAMA_C_MODEL__));
+  */
+/*@ ghost
+  struct itimerval volatile __fc_itimer_prof __attribute__((__FRAMA_C_MODEL__));
+  */
+/*@ requires valid_curr_value: \valid(curr_value);
+    ensures initialization: curr_value: \initialized(\old(curr_value));
+    assigns \result, *curr_value;
+    assigns \result \from (indirect: which);
+    assigns *curr_value
+      \from __fc_itimer_real, __fc_itimer_virtual, __fc_itimer_prof;
+    
+    behavior real:
+      assumes itimer_real: which ≡ 0;
+      ensures result_ok: \result ≡ 0;
+      assigns \result, *curr_value;
+      assigns \result \from \nothing;
+      assigns *curr_value \from __fc_itimer_real;
+    
+    behavior virtual:
+      assumes itimer_virtual: which ≡ 1;
+      ensures result_ok: \result ≡ 0;
+      assigns \result, *curr_value;
+      assigns \result \from \nothing;
+      assigns *curr_value \from __fc_itimer_virtual;
+    
+    behavior prof:
+      assumes itimer_prof: which ≡ 2;
+      ensures result_ok: \result ≡ 0;
+      assigns \result, *curr_value;
+      assigns \result \from \nothing;
+      assigns *curr_value \from __fc_itimer_prof;
+    
+    behavior invalid:
+      assumes invalid_which: which ≢ 0 ∧ which ≢ 1 ∧ which ≢ 2;
+      ensures result_error: \result ≡ -1;
+      assigns \result;
+      assigns \result \from \nothing;
+    
+    complete behaviors invalid, prof, virtual, real;
+    disjoint behaviors invalid, prof, virtual, real;
+ */
+extern int getitimer(int which, struct itimerval *curr_value);
+
+/*@ requires valid_new_value: \valid_read(new_value);
+    requires
+      old_value_null_or_valid: old_value ≡ \null ∨ \valid(old_value);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *old_value, \result;
+    assigns *old_value
+      \from (indirect: which), (indirect: old_value), (indirect: new_value),
+            __fc_itimer_real, __fc_itimer_virtual, __fc_itimer_prof;
+    assigns \result
+      \from (indirect: which), (indirect: new_value), (indirect: *new_value);
+    
+    behavior real:
+      assumes
+        itimer_real_and_valid:
+          which ≡ 0 ≤ new_value->it_value.tv_usec ≤ 999999 ∧
+          0 ≤ new_value->it_interval.tv_usec ≤ 999999;
+      ensures result_ok: \result ≡ 0;
+      ensures initialization: old_value: \initialized(\old(old_value));
+      assigns \result, *old_value, __fc_itimer_real;
+      assigns \result \from \nothing;
+      assigns *old_value \from __fc_itimer_real;
+      assigns __fc_itimer_real \from *new_value;
+    
+    behavior virtual:
+      assumes
+        itimer_virtual_and_valid:
+          which ≡ 1 ∧ 0 ≤ new_value->it_value.tv_usec ≤ 999999 ∧
+          0 ≤ new_value->it_interval.tv_usec ≤ 999999;
+      ensures result_ok: \result ≡ 0;
+      ensures initialization: old_value: \initialized(\old(old_value));
+      assigns \result, *old_value;
+      assigns \result \from \nothing;
+      assigns *old_value \from __fc_itimer_virtual;
+    
+    behavior prof:
+      assumes
+        itimer_prof_and_valid:
+          which ≡ 2 ∧ 0 ≤ new_value->it_value.tv_usec ≤ 999999 ∧
+          0 ≤ new_value->it_interval.tv_usec ≤ 999999;
+      ensures result_ok: \result ≡ 0;
+      ensures initialization: old_value: \initialized(\old(old_value));
+      assigns \result, *old_value;
+      assigns \result \from \nothing;
+      assigns *old_value \from __fc_itimer_prof;
+    
+    behavior invalid:
+      assumes
+        invalid_itimer_or_new_value:
+          (which ≢ 0 ∧ which ≢ 1 ∧ which ≢ 2) ∨
+          ¬(0 ≤ new_value->it_value.tv_usec ≤ 999999 ∧
+             0 ≤ new_value->it_interval.tv_usec ≤ 999999);
+      ensures result_error: \result ≡ -1;
+      assigns \result;
+      assigns \result \from \nothing;
+    
+    disjoint behaviors invalid, prof, virtual, real;
+ */
+extern int setitimer(int which,
+                     struct itimerval const * __restrict new_value,
+                     struct itimerval * __restrict old_value);
+
+/*@ ghost int volatile __fc_fds_state; */
+/*@ requires nfds: nfds ≥ 0;
+    requires readfs: readfds ≡ \null ∨ \valid(readfds);
+    requires writefds: writefds ≡ \null ∨ \valid(writefds);
+    requires errorfds: errorfds ≡ \null ∨ \valid(errorfds);
+    requires timeout: timeout ≡ \null ∨ \valid(timeout);
+    assigns __fc_fds_state, *readfds, *writefds, *errorfds, *timeout,
+            \result;
+    assigns __fc_fds_state \from __fc_fds_state;
+    assigns *readfds
+      \from (indirect: nfds), (indirect: readfds), (indirect: *readfds),
+            (indirect: writefds), (indirect: *writefds),
+            (indirect: errorfds), (indirect: *errorfds), (indirect: timeout),
+            (indirect: *timeout), __fc_fds_state;
+    assigns *writefds
+      \from (indirect: nfds), (indirect: readfds), (indirect: *readfds),
+            (indirect: writefds), (indirect: *writefds),
+            (indirect: errorfds), (indirect: *errorfds), (indirect: timeout),
+            (indirect: *timeout), __fc_fds_state;
+    assigns *errorfds
+      \from (indirect: nfds), (indirect: readfds), (indirect: *readfds),
+            (indirect: writefds), (indirect: *writefds),
+            (indirect: errorfds), (indirect: *errorfds), (indirect: timeout),
+            (indirect: *timeout), __fc_fds_state;
+    assigns *timeout
+      \from (indirect: nfds), (indirect: readfds), (indirect: *readfds),
+            (indirect: writefds), (indirect: *writefds),
+            (indirect: errorfds), (indirect: *errorfds), (indirect: timeout),
+            (indirect: *timeout), __fc_fds_state;
+    assigns \result
+      \from (indirect: nfds), (indirect: readfds), (indirect: *readfds),
+            (indirect: writefds), (indirect: *writefds),
+            (indirect: errorfds), (indirect: *errorfds), (indirect: timeout),
+            (indirect: *timeout), __fc_fds_state;
+    
+    behavior read_notnull:
+      assumes readfds_is_not_null: readfds ≢ \null;
+      ensures initialization: readfds: \initialized(\old(readfds));
+    
+    behavior write_notnull:
+      assumes writefds_is_not_null: writefds ≢ \null;
+      ensures initialization: writefds: \initialized(\old(writefds));
+    
+    behavior error_notnull:
+      assumes errorfds_is_not_null: errorfds ≢ \null;
+      ensures initialization: errorfds: \initialized(\old(errorfds));
+    
+    behavior timeout_notnull:
+      assumes timeout_is_not_null: timeout ≢ \null;
+      ensures initialization: timeout: \initialized(\old(timeout));
+ */
+extern int select(int nfds, fd_set *readfds, fd_set *writefds,
+                  fd_set *errorfds, struct timeval *timeout);
+
+/*@ requires valid_path: valid_read_string(path);
+    requires valid_buf: \valid(buf);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, *buf;
+    assigns \result
+      \from (indirect: path), (indirect: *(path + (0 .. strlen{Old}(path))));
+    assigns *buf
+      \from (indirect: path), (indirect: *(path + (0 .. strlen{Old}(path))));
+ */
+extern int lstat(char const *path, struct stat *buf);
+
+/*@ requires valid_path: valid_read_string(path);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: path), (indirect: *(path + (0 .. strlen{Old}(path)))),
+            (indirect: mode);
+ */
+extern int mkdir(char const *path, mode_t mode);
+
+/*@ requires valid_path: valid_read_string(path);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: path), (indirect: *(path + (0 .. strlen{Old}(path)))),
+            (indirect: mode);
+ */
+extern int mkfifo(char const *path, mode_t mode);
+
+/*@ requires valid_path: valid_read_string(path);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: path), (indirect: *(path + (0 .. strlen{Old}(path)))),
+            (indirect: mode), (indirect: dev);
+ */
+extern int mknod(char const *path, mode_t mode, dev_t dev);
+
+/*@ requires valid_pathname: valid_read_string(pathname);
+    requires valid_buf: \valid(buf);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    ensures
+      init_on_success: initialization: buf:
+        \result ≡ 0 ⇒ \initialized(\old(buf));
+    assigns \result, *buf;
+    assigns \result \from *(pathname + (0 .. strlen{Old}(pathname)));
+    assigns *buf \from *(pathname + (0 .. strlen{Old}(pathname)));
+ */
+extern int stat(char const *pathname, struct stat *buf);
+
+/*@ assigns \result;
+    assigns \result \from (indirect: cmask); */
+extern mode_t umask(mode_t cmask);
+
+/*@ assigns *(*(outbuf + (0 .. *outbytesleft - 1))), __fc_errno;
+    assigns *(*(outbuf + (0 .. *outbytesleft - 1)))
+      \from *(*(inbuf + (0 .. *inbytesleft - 1)));
+ */
+extern size_t iconv(iconv_t cd, char ** __restrict inbuf,
+                    size_t * __restrict inbytesleft,
+                    char ** __restrict outbuf,
+                    size_t * __restrict outbytesleft);
+
+/*@ ensures result_zero_or_neg: \result ≡ 0 ∨ \result ≡ -1;
+    assigns __fc_errno;
+ */
+extern int iconv_close(iconv_t);
+
+/*@ assigns \result, __fc_errno;
+    assigns \result \from *(tocode + (..)), *(fromcode + (..));
+ */
+extern iconv_t iconv_open(char const *tocode, char const *fromcode);
+
+extern char __fc_basename[256];
+
+char *__fc_p_basename = __fc_basename;
+/*@ requires
+      null_or_valid_string_path: path ≡ \null ∨ valid_read_string(path);
+    ensures
+      result_points_to_internal_storage_or_path:
+        \subset(\result, {__fc_p_basename, \old(path)});
+    assigns *(path + (0 ..)), __fc_basename[0 ..], \result;
+    assigns *(path + (0 ..)) \from *(path + (0 ..)), __fc_basename[0 ..];
+    assigns __fc_basename[0 ..] \from *(path + (0 ..)), __fc_basename[0 ..];
+    assigns \result \from __fc_p_basename, path;
+ */
+extern char *basename(char *path);
+
+extern char __fc_dirname[256];
+
+char *__fc_p_dirname = __fc_dirname;
+/*@ requires
+      null_or_valid_string_path: path ≡ \null ∨ valid_read_string(path);
+    ensures
+      result_points_to_internal_storage_or_path:
+        \subset(\result, {__fc_p_dirname, \old(path)});
+    assigns *(path + (0 ..)), __fc_dirname[0 ..], \result;
+    assigns *(path + (0 ..)) \from *(path + (0 ..)), __fc_dirname[0 ..];
+    assigns __fc_dirname[0 ..] \from *(path + (0 ..)), __fc_dirname[0 ..];
+    assigns \result \from __fc_p_dirname, path;
+ */
+extern char *dirname(char *path);
+
+/*@ requires valid_file_descriptors: \valid(fds + (0 .. nfds - 1));
+    ensures
+      error_timeout_or_bounded:
+        \result ≡ -1 ∨ \result ≡ 0 ∨ (1 ≤ \result ≤ \old(nfds));
+    ensures
+      initialization: revents:
+        \initialized(&(\old(fds) + (0 .. \old(nfds) - 1))->revents);
+    assigns (fds + (0 .. nfds - 1))->revents, \result;
+    assigns (fds + (0 .. nfds - 1))->revents
+      \from (indirect: (fds + (0 .. nfds - 1))->fd),
+            (fds + (0 .. nfds - 1))->events, (indirect: nfds),
+            (indirect: timeout), (indirect: Frama_C_entropy_source);
+    assigns \result
+      \from (indirect: (fds + (0 .. nfds - 1))->fd),
+            (indirect: (fds + (0 .. nfds - 1))->events), (indirect: nfds),
+            (indirect: timeout), (indirect: Frama_C_entropy_source);
+ */
+extern int poll(struct pollfd *fds, nfds_t nfds, int timeout);
+
+/*@ requires valid_cond: \valid(cond);
+    ensures sucess: \result ≡ 0;
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+extern int pthread_cond_broadcast(pthread_cond_t *cond);
+
+/*@ requires valid_cond: \valid(cond);
+    ensures success_or_error: \result ≡ 0 ∨ \result ≡ 16;
+    assigns \result;
+    assigns \result \from (indirect: *cond);
+ */
+extern int pthread_cond_destroy(pthread_cond_t *cond);
+
+/*@ requires valid_cond: \valid(cond);
+    requires valid_null_attr: attr ≡ \null ∨ \valid_read(attr);
+    ensures initialization: cond: \initialized(\old(cond));
+    ensures success: \result ≡ 0;
+    assigns *cond, \result;
+    assigns *cond \from *attr;
+    assigns \result \from \nothing;
+ */
+extern int pthread_cond_init(pthread_cond_t * __restrict cond,
+                             pthread_condattr_t const * __restrict attr);
+
+/*@ requires valid_cond: \valid(cond);
+    requires valid_mutex: \valid(mutex);
+    ensures success: \result ≡ 0;
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+extern int pthread_cond_wait(pthread_cond_t * __restrict cond,
+                             pthread_mutex_t * __restrict mutex);
+
+/*@ requires valid_thread: \valid(thread);
+    requires valid_null_attr: attr ≡ \null ∨ \valid_read(attr);
+    requires valid_routine: \valid_function(start_routine);
+    requires valid_null_arg: arg ≡ \null ∨ \valid((char *)arg);
+    ensures
+      success_or_error:
+        \result ≡ 0 ∨ \result ≡ 11 ∨ \result ≡ 22 ∨ \result ≡ 1;
+    assigns *thread, \result;
+    assigns *thread \from *attr;
+    assigns \result \from (indirect: *attr);
+ */
+extern int pthread_create(pthread_t * __restrict thread,
+                          pthread_attr_t const * __restrict attr,
+                          void *(*start_routine)(void *),
+                          void * __restrict arg);
+
+/*@ requires valid_or_null_retval: retval ≡ \null ∨ \valid(retval);
+    ensures
+      success_or_error:
+        \result ≡ 0 ∨ \result ≡ 35 ∨ \result ≡ 22 ∨ \result ≡ 3;
+    assigns *retval, \result;
+    assigns *retval \from thread;
+    assigns \result \from (indirect: thread);
+    
+    behavior ignore_retval:
+      assumes null_retval: retval ≡ \null;
+      assigns \result;
+      assigns \result \from (indirect: thread);
+    
+    behavior use_retval:
+      assumes valid_retval: \valid(retval);
+      assigns *retval, \result;
+      assigns *retval \from thread;
+      assigns \result \from (indirect: thread);
+ */
+extern int pthread_join(pthread_t thread, void **retval);
+
+/*@ requires mutex_valid: \valid(mutex);
+    ensures init_or_busy: \result ≡ 0 ∨ \result ≡ 16;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex;
+    assigns \result \from (indirect: *mutex);
+ */
+extern int pthread_mutex_destroy(pthread_mutex_t *mutex);
+
+/*@ requires mutex_valid: \valid(mutex);
+    requires attrs_valid_or_null: attrs ≡ \null ∨ \valid_read(attrs);
+    ensures
+      initialization: success_or_error:
+        (\result ≡ 0 ∧ \initialized(\old(mutex))) ∨ \result ≡ 11 ∨
+        \result ≡ 12 ∨ \result ≡ 1 ∨ \result ≡ 22;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex, *attrs;
+    assigns \result \from (indirect: *mutex), (indirect: *attrs);
+ */
+extern int pthread_mutex_init(pthread_mutex_t * __restrict mutex,
+                              pthread_mutexattr_t const * __restrict attrs);
+
+/*@ requires mutex_valid: \valid(mutex);
+    ensures
+      success_or_error:
+        \result ≡ 0 ∨ \result ≡ 11 ∨ \result ≡ 22 ∨
+        \result ≡ 35;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex;
+    assigns \result \from (indirect: *mutex);
+ */
+extern int pthread_mutex_lock(pthread_mutex_t *mutex);
+
+/*@ requires mutex_valid: \valid(mutex);
+    ensures success_or_error: \result ≡ 0 ∨ \result ≡ 1;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex;
+    assigns \result \from (indirect: *mutex);
+ */
+extern int pthread_mutex_unlock(pthread_mutex_t *mutex);
+
+/*@ requires valid_attr: \valid(attr);
+    ensures success_or_error: \result ≡ 0 ∨ \result ≡ 22;
+    assigns *attr, \result;
+    assigns *attr \from *attr;
+    assigns \result \from (indirect: *attr);
+ */
+extern int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
+
+/*@ requires valid_attr: \valid(attr);
+    ensures success_or_error: \result ≡ 0 ∨ \result ≡ 12;
+    assigns \result, *attr;
+    assigns \result \from \nothing;
+    assigns *attr \from \nothing;
+ */
+extern int pthread_mutexattr_init(pthread_mutexattr_t *attr);
+
+/*@ requires valid_attr: \valid(attr);
+    ensures success_or_error: \result ≡ 0 ∨ \result ≡ 22;
+    assigns \result, *attr;
+    assigns \result \from (indirect: type);
+    assigns *attr \from (indirect: type);
+ */
+extern int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);
+
+extern char __fc_getpwuid_pw_name[64];
+
+extern char __fc_getpwuid_pw_passwd[64];
+
+extern char __fc_getpwuid_pw_dir[64];
+
+extern char __fc_getpwuid_pw_shell[64];
+
+struct passwd __fc_pwd =
+  {.pw_name = __fc_getpwuid_pw_name,
+   .pw_passwd = __fc_getpwuid_pw_passwd,
+   .pw_uid = 0U,
+   .pw_gid = 0U,
+   .pw_gecos = (char *)0,
+   .pw_dir = __fc_getpwuid_pw_dir,
+   .pw_shell = __fc_getpwuid_pw_shell};
+struct passwd *__fc_p_pwd = & __fc_pwd;
+/*@ requires valid_name: valid_read_string(name);
+    ensures
+      result_null_or_internal_struct:
+        \result ≡ \null ∨ \result ≡ __fc_p_pwd;
+    assigns \result, __fc_pwd;
+    assigns \result \from __fc_p_pwd, (indirect: *(name + (0 ..)));
+    assigns __fc_pwd \from (indirect: *(name + (0 ..)));
+ */
+extern struct passwd *getpwnam(char const *name);
+
+/*@ ensures
+      result_null_or_internal_struct:
+        \result ≡ \null ∨ \result ≡ __fc_p_pwd;
+    assigns \result, __fc_pwd;
+    assigns \result \from __fc_p_pwd, (indirect: uid);
+    assigns __fc_pwd \from (indirect: uid);
+ */
+extern struct passwd *getpwuid(uid_t uid);
+
+/*@ assigns *(env + (0 .. 4)); */
+extern int setjmp(int * /*[5]*/ env);
+
+/*@ ensures never_terminates: \false;
+    assigns \nothing; */
+extern void longjmp(int * /*[5]*/ env, int val);
+
+/*@ ensures never_terminates: \false;
+    assigns \nothing; */
+extern void siglongjmp(sigjmp_buf env, int val);
+
+/*@ assigns \result;
+    assigns \result \from (indirect: fd), (indirect: request);
+ */
+extern int __va_ioctl_void(int fd, int request);
+
+/*@ assigns \result;
+    assigns \result
+      \from (indirect: fd), (indirect: request), (indirect: arg);
+ */
+extern int __va_ioctl_int(int fd, int request, int arg);
+
+/*@ assigns \result, *((char *)argp + (0 ..));
+    assigns \result
+      \from (indirect: fd), (indirect: request),
+            (indirect: *((char *)argp + (0 ..)));
+    assigns *((char *)argp + (0 ..))
+      \from (indirect: fd), (indirect: request), *((char *)argp + (0 ..));
+ */
+extern int __va_ioctl_ptr(int fd, int request, void *argp);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: fd), (indirect: operation);
+ */
+extern int flock(int fd, int operation);
+
+CODE facilitynames[23] =
+  {{.c_name = "auth", .c_val = 4 << 3},
+   {.c_name = "authpriv", .c_val = 10 << 3},
+   {.c_name = "cron", .c_val = 9 << 3},
+   {.c_name = "daemon", .c_val = 3 << 3},
+   {.c_name = "ftp", .c_val = 11 << 3},
+   {.c_name = "kern", .c_val = 0 << 3},
+   {.c_name = "lpr", .c_val = 6 << 3},
+   {.c_name = "mail", .c_val = 2 << 3},
+   {.c_name = "mark", .c_val = 24 | 0},
+   {.c_name = "news", .c_val = 7 << 3},
+   {.c_name = "security", .c_val = 4 << 3},
+   {.c_name = "syslog", .c_val = 5 << 3},
+   {.c_name = "user", .c_val = 1 << 3},
+   {.c_name = "uucp", .c_val = 8 << 3},
+   {.c_name = "local0", .c_val = 16 << 3},
+   {.c_name = "local1", .c_val = 17 << 3},
+   {.c_name = "local2", .c_val = 18 << 3},
+   {.c_name = "local3", .c_val = 19 << 3},
+   {.c_name = "local4", .c_val = 20 << 3},
+   {.c_name = "local5", .c_val = 21 << 3},
+   {.c_name = "local6", .c_val = 22 << 3},
+   {.c_name = "local7", .c_val = 23 << 3},
+   {.c_name = (char const *)0, .c_val = -1}};
+CODE prioritynames[13] =
+  {{.c_name = "alert", .c_val = 1},
+   {.c_name = "crit", .c_val = 2},
+   {.c_name = "debug", .c_val = 7},
+   {.c_name = "emerg", .c_val = 0},
+   {.c_name = "err", .c_val = 3},
+   {.c_name = "error", .c_val = 3},
+   {.c_name = "info", .c_val = 6},
+   {.c_name = "none", .c_val = 0x10},
+   {.c_name = "notice", .c_val = 5},
+   {.c_name = "panic", .c_val = 0},
+   {.c_name = "warn", .c_val = 4},
+   {.c_name = "warning", .c_val = 4},
+   {.c_name = (char const *)0, .c_val = -1}};
+/*@ assigns \nothing; */
+extern void closelog(void);
+
+/*@ assigns \nothing; */
+extern void openlog(char const *, int, int);
+
+/*@ assigns \nothing; */
+extern int setlogmask(int);
+
+/*@ assigns \nothing; */
+extern void syslog(int, char const *, void * const *__va_params);
+
+/*@ assigns \nothing; */
+extern void vsyslog(int, char const *, va_list);
+
+/*@ assigns \result;
+    assigns \result \from which, who; */
+extern int getpriority(int which, id_t who);
+
+/*@ assigns \result;
+    assigns \result \from which, who, prio; */
+extern int setpriority(int which, id_t who, int prio);
+
+/*@ requires valid_rlp: \valid(rlp);
+    assigns \result, *rlp;
+    assigns \result \from resource;
+    assigns *rlp \from resource;
+ */
+extern int getrlimit(int resource, struct rlimit *rlp);
+
+/*@ requires valid_r_usage: \valid(r_usage);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *r_usage, \result;
+    assigns *r_usage \from who;
+    assigns \result \from (indirect: who);
+ */
+extern int getrusage(int who, struct rusage *r_usage);
+
+/*@ requires valid_rlp: \valid_read(rlp);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *rlp, \result;
+    assigns *rlp \from resource;
+    assigns \result \from (indirect: resource), (indirect: *rlp);
+ */
+extern int setrlimit(int resource, struct rlimit const *rlp);
+
+/*@ requires valid_buffer: \valid(buffer);
+    assigns \result, *buffer;
+    assigns \result \from __fc_time;
+    assigns *buffer \from __fc_time;
+ */
+extern clock_t times(struct tms *buffer);
+
+/*@ requires valid_name: \valid(name);
+    ensures result_ok_or_error: -1 ≤ \result;
+    ensures initialization: name: \initialized(\old(name));
+    assigns *name, \result;
+    assigns *name \from \nothing;
+    assigns \result \from \nothing;
+ */
+extern int uname(struct utsname *name);
+
+/*@ ensures result_ok_or_error: \result ≡ -1 ∨ \result ≥ 0;
+    ensures
+      initialization: stat_loc_init_on_success:
+        \result ≥ 0 ∧ \old(stat_loc) ≢ \null ⇒
+        \initialized(\old(stat_loc));
+    assigns \result, *stat_loc;
+    assigns \result \from \nothing;
+    assigns *stat_loc \from \nothing;
+    
+    behavior stat_loc_null:
+      assumes stat_loc_null: stat_loc ≡ \null;
+      assigns \result;
+      assigns \result \from \nothing;
+    
+    behavior stat_loc_non_null:
+      assumes stat_loc_non_null: stat_loc ≢ \null;
+      requires valid_stat_loc: \valid(stat_loc);
+ */
+extern pid_t wait(int *stat_loc);
+
+/*@ ensures result_ok_or_error: \result ≡ -1 ∨ \result ≥ 0;
+    ensures
+      initialization: stat_loc_init_on_success:
+        \result ≥ 0 ∧ \old(stat_loc) ≢ \null ⇒
+        \initialized(\old(stat_loc));
+    assigns \result, *stat_loc;
+    assigns \result \from (indirect: options);
+    assigns *stat_loc \from (indirect: options);
+    
+    behavior stat_loc_null:
+      assumes stat_loc_null: stat_loc ≡ \null;
+      assigns \result;
+      assigns \result \from \nothing;
+    
+    behavior stat_loc_non_null:
+      assumes stat_loc_non_null: stat_loc ≢ \null;
+      requires valid_stat_loc: \valid(stat_loc);
+ */
+extern pid_t waitpid(pid_t pid, int *stat_loc, int options);
+
+/*@ requires valid_termios_p: \valid_read(termios_p);
+    assigns \result;
+    assigns \result \from (indirect: termios_p), *termios_p;
+ */
+extern speed_t cfgetispeed(struct termios const *termios_p);
+
+/*@ requires valid_termios_p: \valid_read(termios_p);
+    assigns \result;
+    assigns \result \from (indirect: termios_p), *termios_p;
+ */
+extern speed_t cfgetospeed(struct termios const *termios_p);
+
+/*@ requires valid_termios_p: \valid(termios_p);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, *termios_p;
+    assigns \result \from (indirect: termios_p), speed;
+    assigns *termios_p \from (indirect: termios_p), speed;
+ */
+extern int cfsetispeed(struct termios *termios_p, speed_t speed);
+
+/*@ requires valid_termios_p: \valid(termios_p);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, *termios_p;
+    assigns \result \from (indirect: termios_p), speed;
+    assigns *termios_p \from (indirect: termios_p), speed;
+ */
+extern int cfsetospeed(struct termios *termios_p, speed_t speed);
+
+/*@ requires
+      valid_queue_selector:
+        queue_selector ≡ 0 ∨ queue_selector ≡ 1 ∨
+        queue_selector ≡ 2;
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, Frama_C_entropy_source;
+    assigns \result
+      \from (indirect: fd), (indirect: queue_selector),
+            (indirect: Frama_C_entropy_source);
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern int tcflush(int fd, int queue_selector);
+
+/*@ requires valid_termios_p: \valid(termios_p);
+    assigns \result, *termios_p, Frama_C_entropy_source;
+    assigns \result \from (indirect: fd), (indirect: Frama_C_entropy_source);
+    assigns *termios_p
+      \from (indirect: fd), (indirect: Frama_C_entropy_source);
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+    
+    behavior ok:
+      assumes nondet: Frama_C_entropy_source ≡ 0;
+      ensures initialization: termios_p: \initialized(\old(termios_p));
+      ensures result_ok: \result ≡ 0;
+    
+    behavior error:
+      assumes nondet: Frama_C_entropy_source ≢ 0;
+      ensures result_error: \result ≡ -1;
+    
+    complete behaviors error, ok;
+    disjoint behaviors error, ok;
+ */
+extern int tcgetattr(int fd, struct termios *termios_p);
+
+/*@ requires valid_termios_p: \valid(termios_p);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *termios_p, Frama_C_entropy_source, \result;
+    assigns *termios_p
+      \from (indirect: fd), (indirect: optional_actions),
+            (indirect: Frama_C_entropy_source), *termios_p;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+    assigns \result
+      \from (indirect: fd), (indirect: optional_actions),
+            (indirect: Frama_C_entropy_source), (indirect: *termios_p);
+ */
+extern int tcsetattr(int fd, int optional_actions, struct termios *termios_p);
+
+void main(void)
+{
+  /*@ assert __fc_p_fopen ≡ (FILE *)(&__fc_fopen); */ ;
+  /*@ assert __fc_p_opendir ≡ (DIR *)(&__fc_opendir); */ ;
+  /*@ assert __fc_p_time_tm ≡ &__fc_time_tm; */ ;
+  /*@ assert __fc_p_strerror ≡ (char *)__fc_strerror; */ ;
+  return;
+}
+
+
+=======
+[kernel] Parsing tests/libc/fc_libc.c (with preprocessing)
+/* Generated by Frama-C */
+typedef unsigned int size_t;
+struct __fc_fenv_t {
+   unsigned short __control_word ;
+   unsigned short __unused1 ;
+   unsigned short __status_word ;
+   unsigned short __unused2 ;
+   unsigned short __tags ;
+   unsigned short __unused3 ;
+   unsigned int __eip ;
+   unsigned short __cs_selector ;
+   unsigned int __opcode : 11 ;
+   unsigned int __unused4 : 5 ;
+   unsigned int __data_offset ;
+   unsigned short __data_selector ;
+   unsigned short __unused5 ;
+};
+typedef struct __fc_fenv_t fenv_t;
+typedef int wchar_t;
+typedef int ssize_t;
+typedef unsigned int gid_t;
+typedef unsigned int uid_t;
+typedef long off_t;
+typedef int pid_t;
+typedef unsigned int useconds_t;
+struct option {
+   char const *name ;
+   int has_arg ;
+   int *flag ;
+   int val ;
+};
+struct __fc_glob_t {
+   unsigned int gl_pathc ;
+   char **gl_pathv ;
+   unsigned int gl_offs ;
+   int gl_flags ;
+   void (*gl_closedir)(void *) ;
+   void *(*gl_readdir)(void *) ;
+   void *(*gl_opendir)(char const *) ;
+   int (*gl_lstat)(char const * __restrict , void * __restrict ) ;
+   int (*gl_stat)(char const * __restrict , void * __restrict ) ;
+};
+typedef struct __fc_glob_t glob_t;
+struct __fc_div_t {
+   int quot ;
+   int rem ;
+};
+typedef struct __fc_div_t div_t;
+struct __fc_ldiv_t {
+   long quot ;
+   long rem ;
+};
+typedef struct __fc_ldiv_t ldiv_t;
+struct __fc_lldiv_t {
+   long long quot ;
+   long long rem ;
+};
+typedef struct __fc_lldiv_t lldiv_t;
+typedef unsigned char uint8_t;
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+typedef unsigned int uintptr_t;
+typedef long long intmax_t;
+struct __fc_imaxdiv_t {
+   intmax_t quot ;
+   intmax_t rem ;
+};
+typedef struct __fc_imaxdiv_t imaxdiv_t;
+struct lconv {
+   char *decimal_point ;
+   char *thousands_sep ;
+   char *grouping ;
+   char *int_curr_symbol ;
+   char *currency_symbol ;
+   char *mon_decimal_point ;
+   char *mon_thousands_sep ;
+   char *mon_grouping ;
+   char *positive_sign ;
+   char *negative_sign ;
+   char int_frac_digits ;
+   char frac_digits ;
+   char p_cs_precedes ;
+   char p_sep_by_space ;
+   char n_cs_precedes ;
+   char n_sep_by_space ;
+   char p_sign_posn ;
+   char n_sign_posn ;
+   char int_p_cs_precedes ;
+   char int_p_sep_by_space ;
+   char int_n_cs_precedes ;
+   char int_n_sep_by_space ;
+   char int_p_sign_posn ;
+   char int_n_sign_posn ;
+};
+union __fc_u_finitef {
+   float f ;
+   unsigned short w[2] ;
+};
+union __fc_u_finite {
+   double d ;
+   unsigned short w[4] ;
+};
+struct __fc_pthread_attr_t {
+   int _fc ;
+};
+typedef struct __fc_pthread_attr_t pthread_attr_t;
+struct __fc_pthread_cond_t {
+   int _fc ;
+};
+typedef struct __fc_pthread_cond_t pthread_cond_t;
+struct __fc_pthread_condattr_t {
+   int _fc ;
+};
+typedef struct __fc_pthread_condattr_t pthread_condattr_t;
+struct __fc_pthread_mutex_t {
+   int _fc ;
+};
+typedef struct __fc_pthread_mutex_t pthread_mutex_t;
+struct __fc_pthread_mutexattr_t {
+   int _fc ;
+};
+typedef struct __fc_pthread_mutexattr_t pthread_mutexattr_t;
+struct __fc_pthread_t {
+   int _fc ;
+};
+typedef struct __fc_pthread_t pthread_t;
+typedef unsigned long sigset_t;
+union sigval {
+   int sival_int ;
+   void *sival_ptr ;
+};
+struct __fc_siginfo_t {
+   int si_signo ;
+   int si_code ;
+   union sigval si_value ;
+   int si_errno ;
+   pid_t si_pid ;
+   uid_t si_uid ;
+   void *si_addr ;
+   int si_status ;
+   int si_band ;
+};
+typedef struct __fc_siginfo_t siginfo_t;
+struct sigaction {
+   void (*sa_handler)(int ) ;
+   void (*sa_sigaction)(int , siginfo_t *, void *) ;
+   sigset_t sa_mask ;
+   int sa_flags ;
+};
+typedef unsigned int socklen_t;
+typedef unsigned short sa_family_t;
+struct sockaddr {
+   sa_family_t sa_family ;
+   char sa_data[14] ;
+};
+struct iovec {
+   void *iov_base ;
+   size_t iov_len ;
+};
+struct msghdr {
+   void *msg_name ;
+   socklen_t msg_namelen ;
+   struct iovec *msg_iov ;
+   int msg_iovlen ;
+   void *msg_control ;
+   socklen_t msg_controllen ;
+   int msg_flags ;
+};
+struct __fc_sockfds_type {
+   int x ;
+};
+typedef uint32_t in_addr_t;
+struct in_addr {
+   in_addr_t s_addr ;
+};
+struct in6_addr {
+   uint8_t s6_addr[16] ;
+};
+enum __fc_ipproto {
+    IPPROTO_IP = 0,
+    IPPROTO_HOPOPTS = 0,
+    IPPROTO_ICMP = 1,
+    IPPROTO_IGMP = 2,
+    IPPROTO_IPIP = 4,
+    IPPROTO_TCP = 6,
+    IPPROTO_EGP = 8,
+    IPPROTO_PUP = 12,
+    IPPROTO_UDP = 17,
+    IPPROTO_IDP = 22,
+    IPPROTO_TP = 29,
+    IPPROTO_DCCP = 33,
+    IPPROTO_IPV6 = 41,
+    IPPROTO_ROUTING = 43,
+    IPPROTO_FRAGMENT = 44,
+    IPPROTO_RSVP = 46,
+    IPPROTO_GRE = 47,
+    IPPROTO_ESP = 50,
+    IPPROTO_AH = 51,
+    IPPROTO_ICMPV6 = 58,
+    IPPROTO_NONE = 59,
+    IPPROTO_DSTOPTS = 60,
+    IPPROTO_MTP = 92,
+    IPPROTO_ENCAP = 98,
+    IPPROTO_PIM = 103,
+    IPPROTO_COMP = 108,
+    IPPROTO_SCTP = 132,
+    IPPROTO_UDPLITE = 136,
+    IPPROTO_RAW = 255,
+    IPPROTO_MAX = 256
+};
+struct hostent {
+   char *h_name ;
+   char **h_aliases ;
+   int h_addrtype ;
+   int h_length ;
+   char **h_addr_list ;
+};
+struct addrinfo {
+   int ai_flags ;
+   int ai_family ;
+   int ai_socktype ;
+   int ai_protocol ;
+   socklen_t ai_addrlen ;
+   struct sockaddr *ai_addr ;
+   char *ai_canonname ;
+   struct addrinfo *ai_next ;
+};
+struct __fc_gethostbyname {
+   struct hostent host ;
+   unsigned char host_addr[sizeof(struct in_addr)] ;
+   char *h_addr_ptrs[2 + 1] ;
+   char *host_aliases[2] ;
+   char hostbuf[128] ;
+};
+typedef void * const * va_list;
+typedef unsigned int ino_t;
+typedef long time_t;
+typedef unsigned int blkcnt_t;
+typedef unsigned int blksize_t;
+typedef unsigned int dev_t;
+typedef unsigned int mode_t;
+typedef unsigned int nlink_t;
+struct stat {
+   dev_t st_dev ;
+   ino_t st_ino ;
+   mode_t st_mode ;
+   nlink_t st_nlink ;
+   uid_t st_uid ;
+   gid_t st_gid ;
+   dev_t st_rdev ;
+   off_t st_size ;
+   time_t st_atime ;
+   time_t st_mtime ;
+   time_t st_ctime ;
+   blksize_t st_blksize ;
+   blkcnt_t st_blocks ;
+};
+struct __fc_pos_t {
+   unsigned long __fc_stdio_position ;
+};
+typedef struct __fc_pos_t fpos_t;
+struct __fc_FILE {
+   unsigned int __fc_FILE_id ;
+   unsigned int __fc_FILE_data ;
+};
+typedef struct __fc_FILE FILE;
+typedef unsigned int id_t;
+typedef int suseconds_t;
+typedef int clockid_t;
+typedef unsigned int clock_t;
+struct tm {
+   int tm_sec ;
+   int tm_min ;
+   int tm_hour ;
+   int tm_mday ;
+   int tm_mon ;
+   int tm_year ;
+   int tm_wday ;
+   int tm_yday ;
+   int tm_isdst ;
+};
+struct timespec {
+   long tv_sec ;
+   long tv_nsec ;
+};
+struct dirent {
+   ino_t d_ino ;
+   off_t d_off ;
+   unsigned short d_reclen ;
+   unsigned char d_type ;
+   char d_name[256] ;
+};
+struct DIR {
+   unsigned int __fc_dir_id ;
+   unsigned int __fc_dir_position ;
+   struct stat *__fc_dir_inode ;
+   struct dirent **__fc_dir_entries ;
+};
+typedef struct DIR DIR;
+struct __fc_fd_set {
+   long __fc_fd_set[(unsigned int)1024 / ((unsigned int)8 * sizeof(long))] ;
+};
+typedef struct __fc_fd_set fd_set;
+struct flock {
+   short l_type ;
+   short l_whence ;
+   off_t l_start ;
+   off_t l_len ;
+   pid_t l_pid ;
+};
+struct timeval {
+   time_t tv_sec ;
+   suseconds_t tv_usec ;
+};
+struct timezone {
+   int tz_minuteswest ;
+   int tz_dsttime ;
+};
+struct itimerval {
+   struct timeval it_interval ;
+   struct timeval it_value ;
+};
+typedef void * iconv_t;
+struct pollfd {
+   int fd ;
+   short events ;
+   short revents ;
+};
+typedef unsigned long nfds_t;
+struct passwd {
+   char *pw_name ;
+   char *pw_passwd ;
+   uid_t pw_uid ;
+   gid_t pw_gid ;
+   char *pw_gecos ;
+   char *pw_dir ;
+   char *pw_shell ;
+};
+typedef int ( jmp_buf)[5];
+struct __fc_sigjmp_buf {
+   jmp_buf buf ;
+   sigset_t sigs ;
+};
+typedef struct __fc_sigjmp_buf sigjmp_buf;
+struct __fc_code {
+   char const *c_name ;
+   int c_val ;
+};
+typedef struct __fc_code CODE;
+typedef unsigned long rlim_t;
+struct rlimit {
+   rlim_t rlim_cur ;
+   rlim_t rlim_max ;
+};
+struct rusage {
+   struct timeval ru_utime ;
+   struct timeval ru_stime ;
+};
+struct tms {
+   clock_t tms_utime ;
+   clock_t tms_stime ;
+   clock_t tms_cutime ;
+   clock_t tms_cstime ;
+};
+struct utsname {
+   char sysname[65] ;
+   char nodename[65] ;
+   char release[65] ;
+   char version[65] ;
+   char machine[65] ;
+};
+typedef unsigned int tcflag_t;
+typedef unsigned char cc_t;
+typedef unsigned int speed_t;
+struct termios {
+   tcflag_t c_iflag ;
+   tcflag_t c_oflag ;
+   tcflag_t c_cflag ;
+   tcflag_t c_lflag ;
+   cc_t c_cc[32] ;
+};
+int volatile Frama_C_entropy_source __attribute__((__unused__,
+                                                   __FRAMA_C_MODEL__));
+void Frama_C_make_unknown(char *p, size_t l);
+
+int Frama_C_nondet(int a, int b);
+
+void *Frama_C_nondet_ptr(void *a, void *b);
+
+int Frama_C_interval(int min, int max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern int Frama_C_interval_split(int min, int max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern unsigned char Frama_C_unsigned_char_interval(unsigned char min,
+                                                    unsigned char max);
+
+char Frama_C_char_interval(char min, char max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern unsigned short Frama_C_unsigned_short_interval(unsigned short min,
+                                                      unsigned short max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern short Frama_C_short_interval(short min, short max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern unsigned int Frama_C_unsigned_int_interval(unsigned int min,
+                                                  unsigned int max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern int Frama_C_int_interval(int min, int max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern unsigned long Frama_C_unsigned_long_interval(unsigned long min,
+                                                    unsigned long max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern long Frama_C_long_interval(long min, long max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern unsigned long long Frama_C_unsigned_long_long_interval(unsigned long long min,
+                                                              unsigned long long max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern long long Frama_C_long_long_interval(long long min, long long max);
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern size_t Frama_C_size_t_interval(size_t min, size_t max);
+
+float Frama_C_float_interval(float min, float max);
+
+double Frama_C_double_interval(double min, double max);
+
+/*@ requires finite: \is_finite(min) ∧ \is_finite(max);
+    requires order: min ≤ max;
+    ensures
+      result_bounded:
+        \is_finite(\result) ∧ \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern double Frama_C_real_interval_as_double(double min, double max);
+
+ __attribute__((__noreturn__)) void Frama_C_abort(void);
+
+/*@ assigns \result;
+    assigns \result \from p; */
+extern size_t Frama_C_offset(void const *p);
+
+/*@ assigns \result;
+    assigns \result \from i; */
+extern long long Frama_C_abstract_cardinal(long long i);
+
+/*@ assigns \result;
+    assigns \result \from i; */
+extern long long Frama_C_abstract_max(long long i);
+
+/*@ assigns \result;
+    assigns \result \from i; */
+extern long long Frama_C_abstract_min(long long i);
+
+/*@ assigns Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+void Frama_C_update_entropy(void)
+{
+  Frama_C_entropy_source = Frama_C_entropy_source;
+  return;
+}
+
+/*@ requires valid_p: \valid(p + (0 .. l - 1));
+    ensures initialization: \initialized(\old(p) + (0 .. \old(l) - 1));
+    assigns *(p + (0 .. l - 1)), Frama_C_entropy_source;
+    assigns *(p + (0 .. l - 1)) \from Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+void Frama_C_make_unknown(char *p, size_t l)
+{
+  Frama_C_update_entropy();
+  {
+    size_t i = (unsigned int)0;
+    while (i < l) {
+      *(p + i) = (char)Frama_C_entropy_source;
+      i += (size_t)1;
+    }
+  }
+  return;
+}
+
+/*@ ensures result_a_or_b: \result ≡ \old(a) ∨ \result ≡ \old(b);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from a, b, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+int Frama_C_nondet(int a, int b)
+{
+  int tmp;
+  Frama_C_update_entropy();
+  if (Frama_C_entropy_source) tmp = a; else tmp = b;
+  return tmp;
+}
+
+/*@ ensures result_a_or_b: \result ≡ \old(a) ∨ \result ≡ \old(b);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from a, b, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+void *Frama_C_nondet_ptr(void *a, void *b)
+{
+  void *tmp;
+  Frama_C_update_entropy();
+  if (Frama_C_entropy_source) tmp = a; else tmp = b;
+  return tmp;
+}
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+int Frama_C_interval(int min, int max)
+{
+  int r;
+  int aux;
+  Frama_C_update_entropy();
+  aux = Frama_C_entropy_source;
+  if (aux >= min) 
+    if (aux <= max) r = aux; else r = min;
+  else r = min;
+  return r;
+}
+
+/*@ requires order: min ≤ max;
+    ensures result_bounded: \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+char Frama_C_char_interval(char min, char max)
+{
+  char __retres;
+  int r;
+  char aux;
+  Frama_C_update_entropy();
+  aux = (char)Frama_C_entropy_source;
+  if ((int)aux >= (int)min) 
+    if ((int)aux <= (int)max) r = (int)aux; else r = (int)min;
+  else r = (int)min;
+  __retres = (char)r;
+  return __retres;
+}
+
+/*@ requires finite: \is_finite(min) ∧ \is_finite(max);
+    requires order: min ≤ max;
+    ensures
+      result_bounded:
+        \is_finite(\result) ∧ \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+float Frama_C_float_interval(float min, float max)
+{
+  float tmp;
+  Frama_C_update_entropy();
+  if (Frama_C_entropy_source) tmp = min; else tmp = max;
+  return tmp;
+}
+
+/*@ requires finite: \is_finite(min) ∧ \is_finite(max);
+    requires order: min ≤ max;
+    ensures
+      result_bounded:
+        \is_finite(\result) ∧ \old(min) ≤ \result ≤ \old(max);
+    assigns \result, Frama_C_entropy_source;
+    assigns \result \from min, max, Frama_C_entropy_source;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+double Frama_C_double_interval(double min, double max)
+{
+  double tmp;
+  Frama_C_update_entropy();
+  if (Frama_C_entropy_source) tmp = min; else tmp = max;
+  return tmp;
+}
+
+extern  __attribute__((__noreturn__)) void __builtin_abort(void);
+
+/*@ terminates \false;
+    ensures never_terminates: \false;
+    assigns \nothing; */
+ __attribute__((__noreturn__)) void Frama_C_abort(void);
+void Frama_C_abort(void)
+{
+  __builtin_abort();
+  return;
+}
+
+void __FC_assert(int c, char const *file, int line, char const *expr);
+
+/*@ assigns \nothing; */
+extern void Frama_C_show_each_warning();
+
+/*@ requires nonnull_c: c ≢ 0;
+    terminates c ≢ 0;
+    assigns \nothing; */
+void __FC_assert(int c, char const *file, int line, char const *expr)
+{
+  if (! c) {
+    Frama_C_show_each_warning("Assertion may fail",file,line,expr);
+    Frama_C_abort();
+  }
+  return;
+}
+
+int isalnum(int c);
+
+int isalpha(int c);
+
+int isblank(int c);
+
+int iscntrl(int c);
+
+int isdigit(int c);
+
+int isgraph(int c);
+
+int islower(int c);
+
+int isprint(int c);
+
+int ispunct(int c);
+
+int isspace(int c);
+
+int isupper(int c);
+
+int isxdigit(int c);
+
+int tolower(int c);
+
+int toupper(int c);
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior match:
+      assumes c_ascii: 0 ≤ c ≤ 127;
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior no_match:
+      assumes c_non_ascii: ¬(0 ≤ c ≤ 127);
+      ensures zero_result: \result ≡ 0;
+    
+    complete behaviors no_match, match;
+    disjoint behaviors no_match, match;
+ */
+extern int isascii(int c);
+
+/*@ requires c_uchar_or_eof_or_EOF: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes
+        c_alnum:
+          ('A' ≤ c ≤ 'Z') ∨ ('a' ≤ c ≤ 'z') ∨ ('0' ≤ c ≤ '9');
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes
+        c_non_alnum:
+          c ≡ -1 ∨ (0 ≤ c ≤ 47) ∨ (58 ≤ c ≤ 64) ∨
+          (91 ≤ c ≤ 96) ∨ (123 ≤ c ≤ 127);
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int isalnum(int c)
+{
+  int tmp;
+  if (c >= 'A') {
+    if (c <= 'Z') tmp = 1; else goto _LAND_0;
+  }
+  else {
+    _LAND_0: ;
+    if (c >= 'a') {
+      if (c <= 'z') tmp = 1; else goto _LAND;
+    }
+    else {
+      _LAND: ;
+      if (c >= '0') 
+        if (c <= '9') tmp = 1; else tmp = 0;
+      else tmp = 0;
+    }
+  }
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes c_alpha: ('A' ≤ c ≤ 'Z') ∨ ('a' ≤ c ≤ 'z');
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes
+        c_non_alpha:
+          c ≡ -1 ∨ (0 ≤ c ≤ 64) ∨ (91 ≤ c ≤ 96) ∨
+          (123 ≤ c ≤ 127);
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int isalpha(int c)
+{
+  int tmp;
+  if (c >= 'A') {
+    if (c <= 'Z') tmp = 1; else goto _LAND;
+  }
+  else {
+    _LAND: ;
+    if (c >= 'a') 
+      if (c <= 'z') tmp = 1; else tmp = 0;
+    else tmp = 0;
+  }
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior match:
+      assumes c_tab_or_space: c ≡ ' ' ∨ c ≡ '\t';
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior no_match:
+      assumes c_non_blank: c ≢ ' ' ∧ c ≢ '\t';
+      ensures zero_result: \result ≡ 0;
+    
+    complete behaviors no_match, match;
+    disjoint behaviors no_match, match;
+ */
+int isblank(int c)
+{
+  int tmp;
+  if (c == ' ') tmp = 1;
+  else 
+    if (c == '\t') tmp = 1;
+    else 
+      if (c == ' ') tmp = 1;
+      else 
+        if (c == '\f') tmp = 1;
+        else 
+          if (c == '\n') tmp = 1;
+          else 
+            if (c == '\r') tmp = 1;
+            else 
+              if (c == '\t') tmp = 1;
+              else 
+                if (c == '\v') tmp = 1; else tmp = 0;
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes c_control_char: (0 ≤ c ≤ 31) ∨ c ≡ 127;
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes c_non_control_char: c ≡ -1 ∨ (32 ≤ c ≤ 126);
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int iscntrl(int c)
+{
+  int tmp;
+  tmp = Frama_C_nondet(0,1);
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior match:
+      assumes c_digit: '0' ≤ c ≤ '9';
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior no_match:
+      assumes c_non_digit: c < '0' ∨ c > '9';
+      ensures zero_result: \result ≡ 0;
+    
+    complete behaviors no_match, match;
+    disjoint behaviors no_match, match;
+ */
+int isdigit(int c)
+{
+  int tmp;
+  if (c >= '0') 
+    if (c <= '9') tmp = 1; else tmp = 0;
+  else tmp = 0;
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes c_graphical: 33 ≤ c ≤ 126;
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes c_non_graphical: c ≡ -1 ∨ (0 ≤ c ≤ 32) ∨ c ≡ 127;
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int isgraph(int c)
+{
+  int tmp;
+  tmp = Frama_C_nondet(0,1);
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes c_lower: 'a' ≤ c ≤ 'z';
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes c_non_lower: c ≡ -1 ∨ (0 ≤ c < 'a') ∨ ('z' < c < 127);
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int islower(int c)
+{
+  int tmp;
+  if (c >= 'a') 
+    if (c <= 'z') tmp = 1; else tmp = 0;
+  else tmp = 0;
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes c_printable: 32 ≤ c ≤ 126;
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes c_non_printable: c ≡ -1 ∨ (0 ≤ c ≤ 31) ∨ c ≡ 127;
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int isprint(int c)
+{
+  int tmp;
+  tmp = Frama_C_nondet(0,1);
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes
+        c_punct:
+          (33 ≤ c ≤ 47) ∨ (58 ≤ c ≤ 64) ∨ (91 ≤ c ≤ 96) ∨
+          (123 ≤ c ≤ 126);
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes
+        c_non_punct:
+          c ≡ -1 ∨ (0 ≤ c ≤ 32) ∨ (48 ≤ c ≤ 57) ∨
+          (65 ≤ c ≤ 90) ∨ (97 ≤ c ≤ 122) ∨ c ≡ 127;
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int ispunct(int c)
+{
+  int tmp;
+  tmp = Frama_C_nondet(0,1);
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes c_space: (9 ≤ c ≤ 13) ∨ c ≡ ' ';
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes
+        c_non_space:
+          c ≡ -1 ∨ (0 ≤ c ≤ 8) ∨ (14 ≤ c < ' ') ∨
+          (' ' < c ≤ 127);
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int isspace(int c)
+{
+  int tmp;
+  if (c == ' ') tmp = 1;
+  else 
+    if (c == '\f') tmp = 1;
+    else 
+      if (c == '\n') tmp = 1;
+      else 
+        if (c == '\r') tmp = 1;
+        else 
+          if (c == '\t') tmp = 1;
+          else 
+            if (c == '\v') tmp = 1; else tmp = 0;
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_match:
+      assumes c_upper: 'A' ≤ c ≤ 'Z';
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior definitely_not_match:
+      assumes
+        c_non_upper: c ≡ -1 ∨ (0 ≤ c < 'A') ∨ ('Z' < c ≤ 127);
+      ensures zero_result: \result ≡ 0;
+    
+    disjoint behaviors definitely_not_match, definitely_match;
+ */
+int isupper(int c)
+{
+  int tmp;
+  if (c >= 'A') 
+    if (c <= 'Z') tmp = 1; else tmp = 0;
+  else tmp = 0;
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior match:
+      assumes
+        c_hexa_digit:
+          ('0' ≤ c ≤ '9') ∨ ('A' ≤ c ≤ 'F') ∨ ('a' ≤ c ≤ 'f');
+      ensures nonzero_result: \result < 0 ∨ \result > 0;
+    
+    behavior no_match:
+      assumes
+        c_non_hexa_digit:
+          ¬(('0' ≤ c ≤ '9') ∨ ('A' ≤ c ≤ 'F') ∨
+             ('a' ≤ c ≤ 'f'));
+      ensures zero_result: \result ≡ 0;
+    
+    complete behaviors no_match, match;
+    disjoint behaviors no_match, match;
+ */
+int isxdigit(int c)
+{
+  int tmp;
+  if (c >= '0') {
+    if (c <= '9') tmp = 1; else goto _LAND_0;
+  }
+  else {
+    _LAND_0: ;
+    if (c >= 'a') {
+      if (c <= 'f') tmp = 1; else goto _LAND;
+    }
+    else {
+      _LAND: ;
+      if (c >= 'A') 
+        if (c <= 'F') tmp = 1; else tmp = 0;
+      else tmp = 0;
+    }
+  }
+  return tmp;
+}
+
+/*@ requires c_uchar_or_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    ensures result_uchar_of_eof: (0 ≤ \result ≤ 255) ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_changed:
+      assumes c_ascii_upper: 'A' ≤ c ≤ 'Z';
+      ensures result_ascii_lower: \result ≡ \old(c) + 32;
+    
+    behavior definitely_not_changed:
+      assumes
+        c_ascii_but_non_upper:
+          c ≡ -1 ∨ (0 ≤ c < 'A') ∨ ('Z' < c ≤ 127);
+      ensures result_unchanged: \result ≡ \old(c);
+    
+    disjoint behaviors definitely_not_changed, definitely_changed;
+ */
+int tolower(int c)
+{
+  int __retres;
+  if (c >= 'A') 
+    if (c <= 'Z') {
+      __retres = c + 0x20;
+      goto return_label;
+    }
+  __retres = c;
+  return_label: return __retres;
+}
+
+/*@ requires c_uchar_of_eof: (0 ≤ c ≤ 255) ∨ c ≡ -1;
+    ensures result_uchar_of_eof: (0 ≤ \result ≤ 255) ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from c;
+    
+    behavior definitely_changed:
+      assumes c_ascii_lower: 'a' ≤ c ≤ 'z';
+      ensures result_ascii_upper: \result ≡ \old(c) - 32;
+    
+    behavior definitely_not_changed:
+      assumes
+        c_ascii_but_non_lower:
+          c ≡ -1 ∨ (0 ≤ c < 'a') ∨ ('z' < c ≤ 127);
+      ensures result_unchanged: \result ≡ \old(c);
+    
+    disjoint behaviors definitely_not_changed, definitely_changed;
+ */
+int toupper(int c)
+{
+  int __retres;
+  if (c >= 'a') 
+    if (c <= 'z') {
+      __retres = c - 0x20;
+      goto return_label;
+    }
+  __retres = c;
+  return_label: return __retres;
+}
+
+int __fc_errno;
+
+int __fc_errno = 0;
+int fetestexcept(int excepts);
+
+int feholdexcept(fenv_t *envp);
+
+int fesetenv(fenv_t const *envp);
+
+static int volatile fetestexcept___fc_random_fetestexcept __attribute__((
+  __FRAMA_C_MODEL__));
+int fetestexcept(int excepts)
+{
+  int __retres;
+  __retres = 0x00FF & fetestexcept___fc_random_fetestexcept;
+  return __retres;
+}
+
+fenv_t volatile __fc_fenv_state __attribute__((__FRAMA_C_MODEL__));
+int feholdexcept(fenv_t *envp)
+{
+  int __retres;
+  *envp = __fc_fenv_state;
+  __retres = 0;
+  return __retres;
+}
+
+int fesetenv(fenv_t const *envp)
+{
+  int __retres;
+  __fc_fenv_state = *envp;
+  __retres = 0;
+  return __retres;
+}
+
+/*@
+axiomatic MemCmp {
+  logic ℤ memcmp{L1, L2}(char *s1, char *s2, ℤ n) 
+    reads \at(*(s1 + (0 .. n - 1)),L1), \at(*(s2 + (0 .. n - 1)),L2);
+  
+  axiom memcmp_zero{L1, L2}:
+    ∀ char *s1, char *s2;
+    ∀ ℤ n;
+      memcmp{L1, L2}(s1, s2, n) ≡ 0 ⇔
+      (∀ ℤ i; 0 ≤ i < n ⇒ \at(*(s1 + i),L1) ≡ \at(*(s2 + i),L2));
+  
+  }
+ */
+/*@
+axiomatic MemChr {
+  logic 𝔹 memchr{L}(char *s, ℤ c, ℤ n) 
+    reads *(s + (0 .. n - 1));
+  
+  logic ℤ memchr_off{L}(char *s, ℤ c, ℤ n) 
+    reads *(s + (0 .. n - 1));
+  
+  axiom memchr_def{L}:
+    ∀ char *s;
+    ∀ ℤ c;
+    ∀ ℤ n;
+      memchr(s, c, n) ≡ \true ⇔
+      (∃ int i; 0 ≤ i < n ∧ *(s + i) ≡ c);
+  
+  }
+ */
+/*@
+axiomatic MemSet {
+  logic 𝔹 memset{L}(char *s, ℤ c, ℤ n) 
+    reads *(s + (0 .. n - 1));
+  
+  axiom memset_def{L}:
+    ∀ char *s;
+    ∀ ℤ c;
+    ∀ ℤ n;
+      memset(s, c, n) ≡ \true ⇔
+      (∀ ℤ i; 0 ≤ i < n ⇒ *(s + i) ≡ c);
+  
+  }
+ */
+/*@
+axiomatic StrLen {
+  logic ℤ strlen{L}(char *s) 
+    reads *(s + (0 ..));
+  
+  axiom strlen_pos_or_null{L}:
+    ∀ char *s;
+    ∀ ℤ i;
+      0 ≤ i ∧ (∀ ℤ j; 0 ≤ j < i ⇒ *(s + j) ≢ '\000') ∧
+      *(s + i) ≡ '\000' ⇒ strlen(s) ≡ i;
+  
+  axiom strlen_neg{L}:
+    ∀ char *s;
+      (∀ ℤ i; 0 ≤ i ⇒ *(s + i) ≢ '\000') ⇒ strlen(s) < 0;
+  
+  axiom strlen_before_null{L}:
+    ∀ char *s;
+    ∀ ℤ i; 0 ≤ i < strlen(s) ⇒ *(s + i) ≢ '\000';
+  
+  axiom strlen_at_null{L}:
+    ∀ char *s; 0 ≤ strlen(s) ⇒ *(s + strlen(s)) ≡ '\000';
+  
+  axiom strlen_not_zero{L}:
+    ∀ char *s;
+    ∀ ℤ i;
+      0 ≤ i ≤ strlen(s) ∧ *(s + i) ≢ '\000' ⇒ i < strlen(s);
+  
+  axiom strlen_zero{L}:
+    ∀ char *s;
+    ∀ ℤ i;
+      0 ≤ i ≤ strlen(s) ∧ *(s + i) ≡ '\000' ⇒ i ≡ strlen(s);
+  
+  axiom strlen_sup{L}:
+    ∀ char *s;
+    ∀ ℤ i; 0 ≤ i ∧ *(s + i) ≡ '\000' ⇒ 0 ≤ strlen(s) ≤ i;
+  
+  axiom strlen_shift{L}:
+    ∀ char *s;
+    ∀ ℤ i; 0 ≤ i ≤ strlen(s) ⇒ strlen(s + i) ≡ strlen(s) - i;
+  
+  axiom strlen_create{L}:
+    ∀ char *s;
+    ∀ ℤ i; 0 ≤ i ∧ *(s + i) ≡ '\000' ⇒ 0 ≤ strlen(s) ≤ i;
+  
+  axiom strlen_create_shift{L}:
+    ∀ char *s;
+    ∀ ℤ i;
+    ∀ ℤ k;
+      0 ≤ k ≤ i ∧ *(s + i) ≡ '\000' ⇒ 0 ≤ strlen(s + k) ≤ i - k;
+  
+  axiom memcmp_strlen_left{L}:
+    ∀ char *s1, char *s2;
+    ∀ ℤ n;
+      memcmp{L, L}(s1, s2, n) ≡ 0 ∧ strlen(s1) < n ⇒
+      strlen(s1) ≡ strlen(s2);
+  
+  axiom memcmp_strlen_right{L}:
+    ∀ char *s1, char *s2;
+    ∀ ℤ n;
+      memcmp{L, L}(s1, s2, n) ≡ 0 ∧ strlen(s2) < n ⇒
+      strlen(s1) ≡ strlen(s2);
+  
+  axiom memcmp_strlen_shift_left{L}:
+    ∀ char *s1, char *s2;
+    ∀ ℤ k, ℤ n;
+      memcmp{L, L}(s1, s2 + k, n) ≡ 0 ≤ k ∧ strlen(s1) < n ⇒
+      0 ≤ strlen(s2) ≤ k + strlen(s1);
+  
+  axiom memcmp_strlen_shift_right{L}:
+    ∀ char *s1, char *s2;
+    ∀ ℤ k, ℤ n;
+      memcmp{L, L}(s1 + k, s2, n) ≡ 0 ≤ k ∧ strlen(s2) < n ⇒
+      0 ≤ strlen(s1) ≤ k + strlen(s2);
+  
+  }
+ */
+/*@
+axiomatic StrCmp {
+  logic ℤ strcmp{L}(char *s1, char *s2) 
+    reads *(s1 + (0 .. strlen(s1))), *(s2 + (0 .. strlen(s2)));
+  
+  axiom strcmp_zero{L}:
+    ∀ char *s1, char *s2;
+      strcmp(s1, s2) ≡ 0 ⇔
+      strlen(s1) ≡ strlen(s2) ∧
+      (∀ ℤ i; 0 ≤ i ≤ strlen(s1) ⇒ *(s1 + i) ≡ *(s2 + i));
+  
+  }
+ */
+/*@
+axiomatic StrNCmp {
+  logic ℤ strncmp{L}(char *s1, char *s2, ℤ n) 
+    reads *(s1 + (0 .. n - 1)), *(s2 + (0 .. n - 1));
+  
+  axiom strncmp_zero{L}:
+    ∀ char *s1, char *s2;
+    ∀ ℤ n;
+      strncmp(s1, s2, n) ≡ 0 ⇔
+      (strlen(s1) < n ∧ strcmp(s1, s2) ≡ 0) ∨
+      (∀ ℤ i; 0 ≤ i < n ⇒ *(s1 + i) ≡ *(s2 + i));
+  
+  }
+ */
+/*@
+axiomatic StrChr {
+  logic 𝔹 strchr{L}(char *s, ℤ c) 
+    reads *(s + (0 .. strlen(s)));
+  
+  axiom strchr_def{L}:
+    ∀ char *s;
+    ∀ ℤ c;
+      strchr(s, c) ≡ \true ⇔
+      (∃ ℤ i; 0 ≤ i ≤ strlen(s) ∧ *(s + i) ≡ (char)c);
+  
+  }
+ */
+/*@
+axiomatic WMemChr {
+  logic 𝔹 wmemchr{L}(wchar_t *s, wchar_t c, ℤ n) 
+    reads *(s + (0 .. n - 1));
+  
+  logic ℤ wmemchr_off{L}(wchar_t *s, wchar_t c, ℤ n) 
+    reads *(s + (0 .. n - 1));
+  
+  axiom wmemchr_def{L}:
+    ∀ wchar_t *s;
+    ∀ int c;
+    ∀ ℤ n;
+      wmemchr(s, c, n) ≡ \true ⇔
+      (∃ int i; 0 ≤ i < n ∧ *(s + i) ≡ c);
+  
+  }
+ */
+/*@
+axiomatic WcsLen {
+  logic ℤ wcslen{L}(wchar_t *s) 
+    reads *(s + (0 ..));
+  
+  axiom wcslen_pos_or_null{L}:
+    ∀ wchar_t *s;
+    ∀ ℤ i;
+      0 ≤ i ∧ (∀ ℤ j; 0 ≤ j < i ⇒ *(s + j) ≢ 0) ∧
+      *(s + i) ≡ 0 ⇒ wcslen(s) ≡ i;
+  
+  axiom wcslen_neg{L}:
+    ∀ wchar_t *s; (∀ ℤ i; 0 ≤ i ⇒ *(s + i) ≢ 0) ⇒ wcslen(s) < 0;
+  
+  axiom wcslen_before_null{L}:
+    ∀ wchar_t *s;
+    ∀ int i; 0 ≤ i < wcslen(s) ⇒ *(s + i) ≢ 0;
+  
+  axiom wcslen_at_null{L}:
+    ∀ wchar_t *s; 0 ≤ wcslen(s) ⇒ *(s + wcslen(s)) ≡ 0;
+  
+  axiom wcslen_not_zero{L}:
+    ∀ wchar_t *s;
+    ∀ int i; 0 ≤ i ≤ wcslen(s) ∧ *(s + i) ≢ 0 ⇒ i < wcslen(s);
+  
+  axiom wcslen_zero{L}:
+    ∀ wchar_t *s;
+    ∀ int i; 0 ≤ i ≤ wcslen(s) ∧ *(s + i) ≡ 0 ⇒ i ≡ wcslen(s);
+  
+  axiom wcslen_sup{L}:
+    ∀ wchar_t *s;
+    ∀ int i; 0 ≤ i ∧ *(s + i) ≡ 0 ⇒ 0 ≤ wcslen(s) ≤ i;
+  
+  axiom wcslen_shift{L}:
+    ∀ wchar_t *s;
+    ∀ int i; 0 ≤ i ≤ wcslen(s) ⇒ wcslen(s + i) ≡ wcslen(s) - i;
+  
+  axiom wcslen_create{L}:
+    ∀ wchar_t *s;
+    ∀ int i; 0 ≤ i ∧ *(s + i) ≡ 0 ⇒ 0 ≤ wcslen(s) ≤ i;
+  
+  axiom wcslen_create_shift{L}:
+    ∀ wchar_t *s;
+    ∀ int i;
+    ∀ int k;
+      0 ≤ k ≤ i ∧ *(s + i) ≡ 0 ⇒ 0 ≤ wcslen(s + k) ≤ i - k;
+  
+  }
+ */
+/*@
+axiomatic WcsCmp {
+  logic ℤ wcscmp{L}(wchar_t *s1, wchar_t *s2) 
+    reads *(s1 + (0 .. wcslen(s1))), *(s2 + (0 .. wcslen(s2)));
+  
+  axiom wcscmp_zero{L}:
+    ∀ wchar_t *s1, wchar_t *s2;
+      wcscmp(s1, s2) ≡ 0 ⇔
+      wcslen(s1) ≡ wcslen(s2) ∧
+      (∀ ℤ i; 0 ≤ i ≤ wcslen(s1) ⇒ *(s1 + i) ≡ *(s2 + i));
+  
+  }
+ */
+/*@
+axiomatic WcsNCmp {
+  logic ℤ wcsncmp{L}(wchar_t *s1, wchar_t *s2, ℤ n) 
+    reads *(s1 + (0 .. n - 1)), *(s2 + (0 .. n - 1));
+  
+  axiom wcsncmp_zero{L}:
+    ∀ wchar_t *s1, wchar_t *s2;
+    ∀ ℤ n;
+      wcsncmp(s1, s2, n) ≡ 0 ⇔
+      (wcslen(s1) < n ∧ wcscmp(s1, s2) ≡ 0) ∨
+      (∀ ℤ i; 0 ≤ i < n ⇒ *(s1 + i) ≡ *(s2 + i));
+  
+  }
+ */
+/*@
+axiomatic WcsChr {
+  logic 𝔹 wcschr{L}(wchar_t *wcs, ℤ wc) 
+    reads *(wcs + (0 .. wcslen(wcs)));
+  
+  axiom wcschr_def{L}:
+    ∀ wchar_t *wcs;
+    ∀ ℤ wc;
+      wcschr(wcs, wc) ≡ \true ⇔
+      (∃ ℤ i; 0 ≤ i ≤ wcslen(wcs) ∧ *(wcs + i) ≡ (int)wc);
+  
+  }
+ */
+/*@ logic ℤ minimum(ℤ i, ℤ j) = i < j? i: j;
+ */
+/*@ logic ℤ maximum(ℤ i, ℤ j) = i < j? j: i;
+ */
+/*@
+predicate valid_string{L}(char *s) =
+  0 ≤ strlen(s) ∧ \valid(s + (0 .. strlen(s)));
+ */
+/*@
+predicate valid_read_string{L}(char *s) =
+  0 ≤ strlen(s) ∧ \valid_read(s + (0 .. strlen(s)));
+ */
+/*@
+predicate valid_read_nstring{L}(char *s, ℤ n) =
+  (\valid_read(s + (0 .. n - 1)) ∧ \initialized(s + (0 .. n - 1))) ∨
+  valid_read_string(s);
+ */
+/*@
+predicate valid_string_or_null{L}(char *s) = s ≡ \null ∨ valid_string(s);
+ */
+/*@
+predicate valid_wstring{L}(wchar_t *s) =
+  0 ≤ wcslen(s) ∧ \valid(s + (0 .. wcslen(s)));
+ */
+/*@
+predicate valid_read_wstring{L}(wchar_t *s) =
+  0 ≤ wcslen(s) ∧ \valid_read(s + (0 .. wcslen(s)));
+ */
+/*@
+predicate valid_read_nwstring{L}(wchar_t *s, ℤ n) =
+  (\valid_read(s + (0 .. n - 1)) ∧ \initialized(s + (0 .. n - 1))) ∨
+  valid_read_wstring(s);
+ */
+/*@
+predicate valid_wstring_or_null{L}(wchar_t *s) =
+  s ≡ \null ∨ valid_wstring(s);
+
+*/
+/*@ ghost int __fc_fds[1024]; */
+/*@ requires valid_string_path: valid_read_string(path);
+    requires valid_amode: (amode & ~((4 | 2) | 1)) ≡ 0 ∨ amode ≡ 0;
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: path), (indirect: *(path + (0 ..))), (indirect: amode);
+ */
+extern int access(char const *path, int amode);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: path), (indirect: *(path + (0 ..)));
+ */
+extern int chdir(char const *path);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: path), (indirect: *(path + (0 ..)));
+ */
+extern int chroot(char const *path);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: path), (indirect: *(path + (0 ..))),
+            (indirect: owner), (indirect: group);
+ */
+extern int chown(char const *path, uid_t owner, gid_t group);
+
+/*@ requires valid_fd: 0 ≤ fd < 1024;
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns __fc_fds[fd], \result;
+    assigns __fc_fds[fd] \from fd, __fc_fds[fd];
+    assigns \result \from (indirect: fd), (indirect: __fc_fds[fd]);
+ */
+extern int close(int fd);
+
+/*@ requires valid_fildes: 0 ≤ fildes < 1024;
+    ensures
+      result_valid_fildes_or_error:
+        \result ≡ -1 ∨ (\old(fildes) ≤ \result < 1024);
+    assigns __fc_fds[fildes ..], \result;
+    assigns __fc_fds[fildes ..] \from fildes;
+    assigns \result \from fildes;
+ */
+extern int dup(int fildes);
+
+/*@ requires valid_fildes: 0 ≤ fildes < 1024;
+    requires valid_fildes2: 0 ≤ fildes2 < 1024;
+    ensures
+      result_fildes2_or_error: \result ≡ \old(fildes2) ∨ \result ≡ -1;
+    assigns __fc_fds[fildes2], \result;
+    assigns __fc_fds[fildes2] \from fildes, fildes2, __fc_fds[fildes2];
+    assigns \result
+      \from fildes, fildes2, __fc_fds[fildes], __fc_fds[fildes2];
+ */
+extern int dup2(int fildes, int fildes2);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    requires valid_string_arg: valid_read_string(arg);
+    assigns \result;
+    assigns \result \from *(path + (0 ..)), *(arg + (0 ..));
+ */
+extern int execl(char const *path, char const *arg, void * const *__va_params);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    requires valid_string_arg: valid_read_string(arg);
+    assigns \result;
+    assigns \result \from *(path + (0 ..)), *(arg + (0 ..));
+ */
+extern int execle(char const *path, char const *arg,
+                  void * const *__va_params);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    requires valid_string_arg: valid_read_string(arg);
+    assigns \result;
+    assigns \result \from *(path + (0 ..)), *(arg + (0 ..));
+ */
+extern int execlp(char const *path, char const *arg,
+                  void * const *__va_params);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    requires valid_string_argv0: valid_read_string(*(argv + 0));
+    assigns \result;
+    assigns \result \from *(path + (0 ..)), *(argv + (0 ..));
+ */
+extern int execv(char const *path, char * const *argv);
+
+/*@ requires valid_path: valid_read_string(path);
+    requires valid_argv0: valid_read_string(*(argv + 0));
+    assigns \result;
+    assigns \result \from *(path + (0 ..)), *(argv + (0 ..));
+ */
+extern int execve(char const *path, char * const *argv, char * const *env);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    requires valid_string_argv0: valid_read_string(*(argv + 0));
+    assigns \result;
+    assigns \result \from *(path + (0 ..)), *(argv + (0 ..));
+ */
+extern int execvp(char const *path, char * const *argv);
+
+/*@ ensures never_terminates: \false;
+    assigns \nothing; */
+extern  __attribute__((__noreturn__)) void _exit(int);
+
+/*@ ensures
+      result_ok_child_or_error:
+        \result ≡ 0 ∨ \result > 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+extern pid_t fork(void);
+
+/*@ requires valid_buf: \valid(buf + (0 .. size - 1));
+    ensures result_ok_or_error: \result ≡ \null ∨ \result ≡ \old(buf);
+    assigns *(buf + (0 .. size - 1)), \result;
+    assigns *(buf + (0 .. size - 1)) \from (indirect: buf), (indirect: size);
+    assigns \result \from buf, (indirect: size);
+ */
+extern char *getcwd(char *buf, size_t size);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern gid_t getegid(void);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern uid_t geteuid(void);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern gid_t getgid(void);
+
+extern char volatile __fc_hostname[64];
+
+/*@ requires name_has_room: \valid(name + (0 .. len - 1));
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, *(name + (0 .. len - 1));
+    assigns \result
+      \from (indirect: __fc_hostname[0 .. len]), (indirect: len);
+    assigns *(name + (0 .. len - 1))
+      \from (indirect: __fc_hostname[0 .. len]), (indirect: len);
+ */
+extern int gethostname(char *name, size_t len);
+
+/*@ requires name_valid_string: valid_read_nstring(name, len);
+    requires bounded_len: len ≤ 64;
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns __fc_hostname[0 .. len], \result;
+    assigns __fc_hostname[0 .. len]
+      \from *(name + (0 .. len - 1)), (indirect: len);
+    assigns \result \from (indirect: __fc_hostname[0 .. len]);
+ */
+extern int sethostname(char const *name, size_t len);
+
+/*@ assigns \result;
+    assigns \result \from (indirect: pid); */
+extern pid_t getpgid(pid_t pid);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern pid_t getpgrp(void);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern pid_t getpid(void);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern pid_t getppid(void);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern pid_t getsid(pid_t);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern uid_t getuid(void);
+
+/*@ ensures result_true_or_false: \result ≡ 0 ∨ \result ≡ 1;
+    assigns \result;
+    assigns \result \from (indirect: fd), (indirect: __fc_fds[fd]);
+ */
+extern int isatty(int fd);
+
+/*@ requires valid_fd: 0 ≤ fd < 1024;
+    requires valid_whence: whence ≡ 0 ∨ whence ≡ 1 ∨ whence ≡ 2;
+    ensures result_error_or_offset: \result ≡ -1 ∨ 0 ≤ \result;
+    assigns \result, __fc_fds[fd];
+    assigns \result
+      \from (indirect: fd), (indirect: __fc_fds[fd]), (indirect: offset),
+            (indirect: whence);
+    assigns __fc_fds[fd]
+      \from (indirect: fd), __fc_fds[fd], (indirect: offset),
+            (indirect: whence);
+ */
+extern off_t lseek(int fd, off_t offset, int whence);
+
+/*@ requires valid_path: valid_read_string(path);
+    assigns \result;
+    assigns \result \from (indirect: *(path + (0 ..))), (indirect: name);
+ */
+extern long pathconf(char const *path, int name);
+
+/*@ requires valid_pipefd: \valid(pipefd + (0 .. 1));
+    ensures initialization: pipefd: \initialized(\old(pipefd) + (0 .. 1));
+    ensures valid_fd0: 0 ≤ *(\old(pipefd) + 0) < 1024;
+    ensures valid_fd1: 0 ≤ *(\old(pipefd) + 1) < 1024;
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *(pipefd + (0 .. 1)), \result;
+    assigns *(pipefd + (0 .. 1)) \from (indirect: __fc_fds[0 ..]);
+    assigns \result \from (indirect: __fc_fds[0 ..]);
+ */
+extern int pipe(int * /*[2]*/ pipefd);
+
+/*@ requires valid_fd: 0 ≤ fd < 1024;
+    requires buf_has_room: \valid((char *)buf + (0 .. count - 1));
+    ensures
+      result_error_or_read_length:
+        (0 ≤ \result ≤ \old(count)) ∨ \result ≡ -1;
+    ensures
+      initialization: buf:
+        \initialized((char *)\old(buf) + (0 .. \result - 1));
+    assigns __fc_fds[fd], \result, *((char *)buf + (0 .. count - 1));
+    assigns __fc_fds[fd] \from __fc_fds[fd];
+    assigns \result \from (indirect: __fc_fds[fd]), (indirect: count);
+    assigns *((char *)buf + (0 .. count - 1))
+      \from (indirect: __fc_fds[fd]), (indirect: count);
+ */
+extern ssize_t read(int fd, void *buf, size_t count);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: gid);
+ */
+extern int setegid(gid_t gid);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: uid);
+ */
+extern int seteuid(uid_t uid);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: gid);
+ */
+extern int setgid(gid_t gid);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: pid), (indirect: pgid);
+ */
+extern int setpgid(pid_t pid, pid_t pgid);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: rgid), (indirect: egid);
+ */
+extern int setregid(gid_t rgid, gid_t egid);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: ruid), (indirect: euid);
+ */
+extern int setreuid(uid_t ruid, uid_t euid);
+
+/*@ ensures result_pgid_or_error: \result ≡ -1 ∨ \result ≥ 0;
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+extern pid_t setsid(void);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: uid);
+ */
+extern int setuid(uid_t uid);
+
+/*@ assigns \nothing; */
+extern void sync(void);
+
+/*@ assigns \result;
+    assigns \result \from (indirect: name); */
+extern long sysconf(int name);
+
+char volatile __fc_ttyname[32];
+char volatile *__fc_p_ttyname = __fc_ttyname;
+/*@ requires valid_fildes: 0 ≤ fildes < 1024;
+    ensures
+      result_name_or_null: \result ≡ __fc_p_ttyname ∨ \result ≡ \null;
+    assigns \result;
+    assigns \result \from __fc_p_ttyname, (indirect: fildes);
+ */
+extern char *ttyname(int fildes);
+
+/*@ requires valid_string_path: valid_read_string(path);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from *(path + (0 ..));
+ */
+extern int unlink(char const *path);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, Frama_C_entropy_source;
+    assigns \result
+      \from (indirect: usec), (indirect: Frama_C_entropy_source);
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern int usleep(useconds_t usec);
+
+/*@ requires valid_fd: 0 ≤ fd < 1024;
+    requires buf_has_room: \valid_read((char *)buf + (0 .. count - 1));
+    ensures
+      result_error_or_written_bytes:
+        \result ≡ -1 ∨ (0 ≤ \result ≤ \old(count));
+    assigns __fc_fds[fd], \result;
+    assigns __fc_fds[fd]
+      \from (indirect: fd), (indirect: count), __fc_fds[fd];
+    assigns \result
+      \from (indirect: fd), (indirect: count), (indirect: __fc_fds[fd]);
+ */
+extern ssize_t write(int fd, void const *buf, size_t count);
+
+/*@ requires valid_ruid: \valid(ruid);
+    requires valid_euid: \valid(suid);
+    requires valid_suid: \valid(euid);
+    ensures
+      initialization: result_ok_or_error:
+        (\result ≡ 0 ∧ \initialized(\old(ruid)) ∧
+         \initialized(\old(euid)) ∧ \initialized(\old(suid))) ∨
+        \result ≡ -1;
+    assigns *ruid, *euid, *suid, \result;
+    assigns *ruid \from \nothing;
+    assigns *euid \from \nothing;
+    assigns *suid \from \nothing;
+    assigns \result
+      \from (indirect: ruid), (indirect: euid), (indirect: suid);
+ */
+int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: ruid), (indirect: euid), (indirect: suid);
+ */
+int setresuid(uid_t ruid, uid_t euid, uid_t suid);
+
+/*@ requires valid_rgid: \valid(rgid);
+    requires valid_egid: \valid(sgid);
+    requires valid_sgid: \valid(egid);
+    ensures
+      initialization: result_ok_or_error:
+        (\result ≡ 0 ∧ \initialized(\old(rgid)) ∧
+         \initialized(\old(egid)) ∧ \initialized(\old(sgid))) ∨
+        \result ≡ -1;
+    assigns *rgid, *egid, *sgid, \result;
+    assigns *rgid \from \nothing;
+    assigns *egid \from \nothing;
+    assigns *sgid \from \nothing;
+    assigns \result
+      \from (indirect: rgid), (indirect: egid), (indirect: sgid);
+ */
+int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: rgid), (indirect: egid), (indirect: sgid);
+ */
+int setresgid(gid_t rgid, gid_t egid, gid_t sgid);
+
+extern char *optarg;
+
+int optind;
+
+extern int opterr;
+
+extern int optopt;
+
+/*@ assigns \result, *optarg, optind, opterr, optopt;
+    assigns \result
+      \from argc, *(argv + (0 .. argc - 1)), *(optstring + (0 ..));
+    assigns *optarg
+      \from argc, *(argv + (0 .. argc - 1)), *(optstring + (0 ..));
+    assigns optind
+      \from argc, *(argv + (0 .. argc - 1)), *(optstring + (0 ..));
+    assigns opterr
+      \from argc, *(argv + (0 .. argc - 1)), *(optstring + (0 ..));
+    assigns optopt
+      \from argc, *(argv + (0 .. argc - 1)), *(optstring + (0 ..));
+ */
+extern int getopt(int argc, char * const *argv, char const *optstring);
+
+/*@ assigns \result, *optarg, optind, opterr, optopt,
+            *((longopts + (0 ..))->flag);
+    assigns \result
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns *optarg
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns optind
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns opterr
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns optopt
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns *((longopts + (0 ..))->flag)
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+ */
+extern int getopt_long(int argc, char * const *argv, char const *shortopts,
+                       struct option const *longopts, int *longind);
+
+/*@ assigns \result, *optarg, optind, opterr, optopt,
+            *((longopts + (0 ..))->flag);
+    assigns \result
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns *optarg
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns optind
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns opterr
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns optopt
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+    assigns *((longopts + (0 ..))->flag)
+      \from argc, *(argv + (0 .. argc - 1)), *(shortopts + (0 ..)),
+            *(longopts + (0 ..));
+ */
+extern int getopt_long_only(int argc, char * const *argv,
+                            char const *shortopts,
+                            struct option const *longopts, int *longind);
+
+int optind = 1;
+int glob(char const *pattern, int flags,
+         int (*errfunc)(char const *epath, int eerrno), glob_t *pglob);
+
+void globfree(glob_t *pglob);
+
+/*@ ghost extern int __fc_heap_status __attribute__((__FRAMA_C_MODEL__)); */
+
+/*@
+axiomatic dynamic_allocation {
+  predicate is_allocable{L}(ℤ n) 
+    reads __fc_heap_status;
+  
+  axiom never_allocable{L}:
+    ∀ ℤ i; i < 0 ∨ i > 4294967295U ⇒ ¬is_allocable(i);
+  
+  }
+
+*/
+/*@ requires valid_nptr: \valid_read(nptr);
+    assigns \result;
+    assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+ */
+extern double atof(char const *nptr);
+
+int atoi(char const *p);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    assigns \result;
+    assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+ */
+extern long atol(char const *nptr);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    assigns \result;
+    assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+ */
+extern long long atoll(char const *nptr);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    requires separation: \separated(nptr, endptr);
+    assigns \result, *endptr;
+    assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+    assigns *endptr
+      \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr);
+    
+    behavior no_storage:
+      assumes null_endptr: endptr ≡ \null;
+      assigns \result;
+      assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+    
+    behavior store_position:
+      assumes nonnull_endptr: endptr ≢ \null;
+      requires valid_endptr: \valid(endptr);
+      ensures initialization: \initialized(\old(endptr));
+      ensures valid_endptr: \valid_read(\old(endptr));
+      ensures position_subset: \subset(*\old(endptr), \old(nptr) + (0 ..));
+      assigns \result, *endptr;
+      assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+      assigns *endptr
+        \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr);
+    
+    complete behaviors store_position, no_storage;
+    disjoint behaviors store_position, no_storage;
+ */
+extern double strtod(char const * __restrict nptr, char ** __restrict endptr);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    requires separation: \separated(nptr, endptr);
+    assigns \result, *endptr;
+    assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+    assigns *endptr
+      \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr);
+    
+    behavior no_storage:
+      assumes null_endptr: endptr ≡ \null;
+      assigns \result;
+      assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+    
+    behavior store_position:
+      assumes nonnull_endptr: endptr ≢ \null;
+      requires valid_endptr: \valid(endptr);
+      ensures initialization: \initialized(\old(endptr));
+      ensures valid_endptr: \valid_read(\old(endptr));
+      ensures position_subset: \subset(*\old(endptr), \old(nptr) + (0 ..));
+      assigns \result, *endptr;
+      assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+      assigns *endptr
+        \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr);
+    
+    complete behaviors store_position, no_storage;
+    disjoint behaviors store_position, no_storage;
+ */
+extern float strtof(char const * __restrict nptr, char ** __restrict endptr);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    requires separation: \separated(nptr, endptr);
+    assigns \result, *endptr;
+    assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+    assigns *endptr
+      \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr);
+    
+    behavior no_storage:
+      assumes null_endptr: endptr ≡ \null;
+      assigns \result;
+      assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+    
+    behavior store_position:
+      assumes nonnull_endptr: endptr ≢ \null;
+      requires valid_endptr: \valid(endptr);
+      ensures initialization: \initialized(\old(endptr));
+      ensures valid_endptr: \valid_read(\old(endptr));
+      ensures position_subset: \subset(*\old(endptr), \old(nptr) + (0 ..));
+      assigns \result, *endptr;
+      assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
+      assigns *endptr
+        \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr);
+    
+    complete behaviors store_position, no_storage;
+    disjoint behaviors store_position, no_storage;
+ */
+extern long double strtold(char const * __restrict nptr,
+                           char ** __restrict endptr);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    requires separation: \separated(nptr, endptr);
+    requires base_range: base ≡ 0 ∨ (2 ≤ base ≤ 36);
+    assigns \result, *endptr;
+    assigns \result
+      \from (indirect: nptr), (indirect: *(nptr + (0 ..))), (indirect: base);
+    assigns *endptr
+      \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr),
+            (indirect: base);
+    
+    behavior no_storage:
+      assumes null_endptr: endptr ≡ \null;
+      assigns \result;
+      assigns \result
+        \from (indirect: nptr), (indirect: *(nptr + (0 ..))),
+              (indirect: base);
+    
+    behavior store_position:
+      assumes nonnull_endptr: endptr ≢ \null;
+      requires valid_endptr: \valid(endptr);
+      ensures initialization: \initialized(\old(endptr));
+      ensures valid_endptr: \valid_read(\old(endptr));
+      ensures position_subset: \subset(*\old(endptr), \old(nptr) + (0 ..));
+      assigns \result, *endptr;
+      assigns \result
+        \from (indirect: nptr), (indirect: *(nptr + (0 ..))),
+              (indirect: base);
+      assigns *endptr
+        \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr),
+              (indirect: base);
+    
+    complete behaviors store_position, no_storage;
+    disjoint behaviors store_position, no_storage;
+ */
+extern long strtol(char const * __restrict nptr, char ** __restrict endptr,
+                   int base);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    requires separation: \separated(nptr, endptr);
+    requires base_range: base ≡ 0 ∨ (2 ≤ base ≤ 36);
+    assigns \result, *endptr;
+    assigns \result
+      \from (indirect: nptr), (indirect: *(nptr + (0 ..))), (indirect: base);
+    assigns *endptr
+      \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr),
+            (indirect: base);
+    
+    behavior no_storage:
+      assumes null_endptr: endptr ≡ \null;
+      assigns \result;
+      assigns \result
+        \from (indirect: nptr), (indirect: *(nptr + (0 ..))),
+              (indirect: base);
+    
+    behavior store_position:
+      assumes nonnull_endptr: endptr ≢ \null;
+      requires valid_endptr: \valid(endptr);
+      ensures initialization: \initialized(\old(endptr));
+      ensures valid_endptr: \valid_read(\old(endptr));
+      ensures position_subset: \subset(*\old(endptr), \old(nptr) + (0 ..));
+      assigns \result, *endptr;
+      assigns \result
+        \from (indirect: nptr), (indirect: *(nptr + (0 ..))),
+              (indirect: base);
+      assigns *endptr
+        \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr),
+              (indirect: base);
+    
+    complete behaviors store_position, no_storage;
+    disjoint behaviors store_position, no_storage;
+ */
+extern long long strtoll(char const * __restrict nptr,
+                         char ** __restrict endptr, int base);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    requires separation: \separated(nptr, endptr);
+    requires base_range: base ≡ 0 ∨ (2 ≤ base ≤ 36);
+    assigns \result, *endptr;
+    assigns \result
+      \from (indirect: nptr), (indirect: *(nptr + (0 ..))), (indirect: base);
+    assigns *endptr
+      \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr),
+            (indirect: base);
+    
+    behavior no_storage:
+      assumes null_endptr: endptr ≡ \null;
+      assigns \result;
+      assigns \result
+        \from (indirect: nptr), (indirect: *(nptr + (0 ..))),
+              (indirect: base);
+    
+    behavior store_position:
+      assumes nonnull_endptr: endptr ≢ \null;
+      requires valid_endptr: \valid(endptr);
+      ensures initialization: \initialized(\old(endptr));
+      ensures valid_endptr: \valid_read(\old(endptr));
+      ensures position_subset: \subset(*\old(endptr), \old(nptr) + (0 ..));
+      assigns \result, *endptr;
+      assigns \result
+        \from (indirect: nptr), (indirect: *(nptr + (0 ..))),
+              (indirect: base);
+      assigns *endptr
+        \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr),
+              (indirect: base);
+    
+    complete behaviors store_position, no_storage;
+    disjoint behaviors store_position, no_storage;
+ */
+extern unsigned long strtoul(char const * __restrict nptr,
+                             char ** __restrict endptr, int base);
+
+/*@ requires valid_nptr: \valid_read(nptr);
+    requires separation: \separated(nptr, endptr);
+    requires base_range: base ≡ 0 ∨ (2 ≤ base ≤ 36);
+    assigns \result, *endptr;
+    assigns \result
+      \from (indirect: nptr), (indirect: *(nptr + (0 ..))), (indirect: base);
+    assigns *endptr
+      \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr),
+            (indirect: base);
+    
+    behavior no_storage:
+      assumes null_endptr: endptr ≡ \null;
+      assigns \result;
+      assigns \result
+        \from (indirect: nptr), (indirect: *(nptr + (0 ..))),
+              (indirect: base);
+    
+    behavior store_position:
+      assumes nonnull_endptr: endptr ≢ \null;
+      requires valid_endptr: \valid(endptr);
+      ensures initialization: \initialized(\old(endptr));
+      ensures valid_endptr: \valid_read(\old(endptr));
+      ensures position_subset: \subset(*\old(endptr), \old(nptr) + (0 ..));
+      assigns \result, *endptr;
+      assigns \result
+        \from (indirect: nptr), (indirect: *(nptr + (0 ..))),
+              (indirect: base);
+      assigns *endptr
+        \from nptr, (indirect: *(nptr + (0 ..))), (indirect: endptr),
+              (indirect: base);
+    
+    complete behaviors store_position, no_storage;
+    disjoint behaviors store_position, no_storage;
+ */
+extern unsigned long long strtoull(char const * __restrict nptr,
+                                   char ** __restrict endptr, int base);
+
+/*@ ghost
+extern int __fc_random_counter __attribute__((__unused__, __FRAMA_C_MODEL__));
+*/
+
+unsigned long const __fc_rand_max = (unsigned long)32767;
+/*@ ensures result_range: 0 ≤ \result ≤ __fc_rand_max;
+    assigns \result, __fc_random_counter;
+    assigns \result \from __fc_random_counter;
+    assigns __fc_random_counter \from __fc_random_counter;
+ */
+extern int rand(void);
+
+/*@ assigns __fc_random_counter;
+    assigns __fc_random_counter \from seed; */
+extern void srand(unsigned int seed);
+
+/*@ ensures result_range: 0 ≤ \result ≤ __fc_rand_max;
+    assigns \result;
+    assigns \result \from __fc_random_counter;
+ */
+extern long random(void);
+
+/*@ assigns __fc_random_counter;
+    assigns __fc_random_counter \from seed; */
+extern void srandom(unsigned int seed);
+
+int __fc_random48_init __attribute__((__FRAMA_C_MODEL__));
+unsigned short __fc_random48_counter[3] __attribute__((__FRAMA_C_MODEL__));
+unsigned short *__fc_p_random48_counter = __fc_random48_counter;
+/*@ ensures random48_initialized: __fc_random48_init ≡ 1;
+    assigns __fc_random48_counter[0 .. 2], __fc_random48_init;
+    assigns __fc_random48_counter[0 .. 2] \from seed;
+    assigns __fc_random48_init \from \nothing;
+ */
+extern void srand48(long seed);
+
+/*@ requires
+      initialization: initialized_seed16v: \initialized(seed16v + (0 .. 2));
+    ensures random48_initialized: __fc_random48_init ≡ 1;
+    ensures result_counter: \result ≡ __fc_p_random48_counter;
+    assigns __fc_random48_counter[0 .. 2], __fc_random48_init, \result;
+    assigns __fc_random48_counter[0 .. 2]
+      \from (indirect: *(seed16v + (0 .. 2)));
+    assigns __fc_random48_init \from \nothing;
+    assigns \result \from __fc_p_random48_counter;
+ */
+extern unsigned short *seed48(unsigned short * /*[3]*/ seed16v);
+
+/*@ ensures random48_initialized: __fc_random48_init ≡ 1;
+    assigns __fc_random48_counter[0 .. 2], __fc_random48_init;
+    assigns __fc_random48_counter[0 .. 2] \from *(param + (0 .. 5));
+    assigns __fc_random48_init \from \nothing;
+ */
+extern void lcong48(unsigned short * /*[7]*/ param);
+
+/*@ requires random48_initialized: __fc_random48_init ≡ 1;
+    ensures result_range: \is_finite(\result) ∧ 0.0 ≤ \result < 1.0;
+    assigns __fc_random48_counter[0 .. 2], \result;
+    assigns __fc_random48_counter[0 .. 2]
+      \from __fc_random48_counter[0 .. 2];
+    assigns \result \from __fc_random48_counter[0 .. 2];
+ */
+extern double drand48(void);
+
+/*@ requires
+      initialization: initialized_xsubi: \initialized(xsubi + (0 .. 2));
+    ensures result_range: \is_finite(\result) ∧ 0.0 ≤ \result < 1.0;
+    assigns __fc_random48_counter[0 .. 2], \result;
+    assigns __fc_random48_counter[0 .. 2]
+      \from __fc_random48_counter[0 .. 2];
+    assigns \result \from __fc_random48_counter[0 .. 2];
+ */
+extern double erand48(unsigned short * /*[3]*/ xsubi);
+
+/*@ requires random48_initialized: __fc_random48_init ≡ 1;
+    ensures result_range: 0 ≤ \result < 2147483648;
+    assigns __fc_random48_counter[0 .. 2], \result;
+    assigns __fc_random48_counter[0 .. 2]
+      \from __fc_random48_counter[0 .. 2];
+    assigns \result \from __fc_random48_counter[0 .. 2];
+ */
+extern long lrand48(void);
+
+/*@ requires
+      initialization: initialized_xsubi: \initialized(xsubi + (0 .. 2));
+    ensures result_range: 0 ≤ \result < 2147483648;
+    assigns __fc_random48_counter[0 .. 2], \result;
+    assigns __fc_random48_counter[0 .. 2]
+      \from __fc_random48_counter[0 .. 2];
+    assigns \result \from __fc_random48_counter[0 .. 2];
+ */
+extern long nrand48(unsigned short * /*[3]*/ xsubi);
+
+/*@ requires random48_initialized: __fc_random48_init ≡ 1;
+    ensures result_range: -2147483648 ≤ \result < 2147483648;
+    assigns __fc_random48_counter[0 .. 2], \result;
+    assigns __fc_random48_counter[0 .. 2]
+      \from __fc_random48_counter[0 .. 2];
+    assigns \result \from __fc_random48_counter[0 .. 2];
+ */
+extern long mrand48(void);
+
+/*@ requires
+      initialization: initialized_xsubi: \initialized(xsubi + (0 .. 2));
+    ensures result_range: -2147483648 ≤ \result < 2147483648;
+    assigns __fc_random48_counter[0 .. 2], \result;
+    assigns __fc_random48_counter[0 .. 2]
+      \from __fc_random48_counter[0 .. 2];
+    assigns \result \from __fc_random48_counter[0 .. 2];
+ */
+extern long jrand48(unsigned short * /*[3]*/ xsubi);
+
+void *calloc(size_t nmemb, size_t size);
+
+/*@ assigns __fc_heap_status, \result;
+    assigns __fc_heap_status \from size, __fc_heap_status;
+    assigns \result \from (indirect: size), (indirect: __fc_heap_status);
+    allocates \result;
+    
+    behavior allocation:
+      assumes can_allocate: is_allocable(size);
+      ensures allocation: \fresh{Old, Here}(\result,\old(size));
+      assigns __fc_heap_status, \result;
+      assigns __fc_heap_status \from size, __fc_heap_status;
+      assigns \result \from (indirect: size), (indirect: __fc_heap_status);
+    
+    behavior no_allocation:
+      assumes cannot_allocate: ¬is_allocable(size);
+      ensures null_result: \result ≡ \null;
+      assigns \result;
+      assigns \result \from \nothing;
+      allocates \nothing;
+    
+    complete behaviors no_allocation, allocation;
+    disjoint behaviors no_allocation, allocation;
+ */
+extern void *malloc(size_t size);
+
+/*@ requires freeable: p ≡ \null ∨ \freeable(p);
+    assigns __fc_heap_status;
+    assigns __fc_heap_status \from __fc_heap_status;
+    frees p;
+    
+    behavior deallocation:
+      assumes nonnull_p: p ≢ \null;
+      ensures freed: \allocable(\old(p));
+      assigns __fc_heap_status;
+      assigns __fc_heap_status \from __fc_heap_status;
+    
+    behavior no_deallocation:
+      assumes null_p: p ≡ \null;
+      assigns \nothing;
+      allocates \nothing;
+    
+    complete behaviors no_deallocation, deallocation;
+    disjoint behaviors no_deallocation, deallocation;
+ */
+extern void free(void *p);
+
+/*@ requires freeable: ptr ≡ \null ∨ \freeable(ptr);
+    assigns __fc_heap_status, \result;
+    assigns __fc_heap_status \from __fc_heap_status;
+    assigns \result \from size, ptr, __fc_heap_status;
+    frees ptr;
+    allocates \result;
+    
+    behavior allocation:
+      assumes can_allocate: is_allocable(size);
+      ensures allocation: \fresh{Old, Here}(\result,\old(size));
+      assigns \result;
+      assigns \result \from size, __fc_heap_status;
+      allocates \result;
+    
+    behavior deallocation:
+      assumes nonnull_ptr: ptr ≢ \null;
+      assumes can_allocate: is_allocable(size);
+      ensures freed: \allocable(\old(ptr));
+      ensures freeable: \result ≡ \null ∨ \freeable(\result);
+      frees ptr;
+    
+    behavior fail:
+      assumes cannot_allocate: ¬is_allocable(size);
+      ensures null_result: \result ≡ \null;
+      assigns \result;
+      assigns \result \from size, __fc_heap_status;
+      allocates \nothing;
+    
+    complete behaviors fail, deallocation, allocation;
+    disjoint behaviors allocation, fail;
+    disjoint behaviors deallocation, fail;
+ */
+extern void *realloc(void *ptr, size_t size);
+
+/*@ exits status: \exit_status ≢ 0;
+    ensures never_terminates: \false;
+    
+    assigns \exit_status \from \nothing;
+ */
+extern  __attribute__((__noreturn__)) void abort(void);
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern int atexit(void (*func)(void));
+
+/*@ assigns \result;
+    assigns \result \from \nothing; */
+extern int at_quick_exit(void (*func)(void));
+
+/*@ exits status: \exit_status ≡ \old(status);
+    ensures never_terminates: \false;
+    
+    assigns \exit_status \from status;
+ */
+extern  __attribute__((__noreturn__)) void exit(int status);
+
+/*@ ensures never_terminates: \false;
+    assigns \nothing; */
+extern  __attribute__((__noreturn__)) void _Exit(int status);
+
+char *__fc_env[4096] __attribute__((__FRAMA_C_MODEL__));
+char *getenv(char const *name);
+
+int putenv(char *string);
+
+int setenv(char const *name, char const *value, int overwrite);
+
+int unsetenv(char const *name);
+
+/*@ ensures never_terminates: \false;
+    assigns \nothing; */
+extern  __attribute__((__noreturn__)) void quick_exit(int status);
+
+/*@ requires
+      null_or_valid_string_command:
+        command ≡ \null ∨ valid_read_string(command);
+    assigns \result;
+    assigns \result
+      \from (indirect: command), (indirect: *(command + (0 ..)));
+ */
+extern int system(char const *command);
+
+/*@ requires valid_function_compar: \valid_function(compar);
+    ensures
+      null_or_correct_result:
+        \result ≡ \null ∨
+        \subset(\result,
+               (void *)((char *)\old(base) +
+                        (0 .. \old(size) * (\old(nmemb) - 1))));
+    assigns \result;
+    assigns \result
+      \from (indirect: key), *((char *)key + (0 .. size - 1)), base,
+            *((char *)base + (0 .. size * (nmemb - 1))), (indirect: nmemb),
+            (indirect: size), (indirect: *compar);
+ */
+extern void *bsearch(void const *key, void const *base, size_t nmemb,
+                     size_t size, int (*compar)(void const *, void const *));
+
+/*@ requires valid_function_compar: \valid_function(compar);
+    assigns *((char *)base + (0 ..));
+    assigns *((char *)base + (0 ..))
+      \from (indirect: base), *((char *)base + (0 ..)), (indirect: nmemb),
+            (indirect: size), (indirect: compar), (indirect: *compar);
+ */
+extern void qsort(void *base, size_t nmemb, size_t size,
+                  int (*compar)(void const *, void const *));
+
+int abs(int i);
+
+/*@ requires abs_representable: j > -2147483647L - 1L;
+    assigns \result;
+    assigns \result \from j;
+    
+    behavior negative:
+      assumes negative: j < 0;
+      ensures opposite_result: \result ≡ -\old(j);
+    
+    behavior nonnegative:
+      assumes nonnegative: j ≥ 0;
+      ensures same_result: \result ≡ \old(j);
+    
+    complete behaviors nonnegative, negative;
+    disjoint behaviors nonnegative, negative;
+ */
+extern long labs(long j);
+
+/*@ requires abs_representable: j > -9223372036854775807LL - 1LL;
+    assigns \result;
+    assigns \result \from j;
+    
+    behavior negative:
+      assumes negative: j < 0;
+      ensures opposite_result: \result ≡ -\old(j);
+    
+    behavior nonnegative:
+      assumes nonnegative: j ≥ 0;
+      ensures same_result: \result ≡ \old(j);
+    
+    complete behaviors nonnegative, negative;
+    disjoint behaviors nonnegative, negative;
+ */
+extern long long llabs(long long j);
+
+/*@ assigns \result;
+    assigns \result \from numer, denom; */
+extern div_t div(int numer, int denom);
+
+/*@ assigns \result;
+    assigns \result \from numer, denom; */
+extern ldiv_t ldiv(long numer, long denom);
+
+/*@ assigns \result;
+    assigns \result \from numer, denom; */
+extern lldiv_t lldiv(long long numer, long long denom);
+
+/*@ ghost extern int __fc_mblen_state; */
+
+/*@ assigns \result, __fc_mblen_state;
+    assigns \result
+      \from (indirect: s), (indirect: *(s + (0 ..))), (indirect: n),
+            __fc_mblen_state;
+    assigns __fc_mblen_state
+      \from (indirect: s), (indirect: *(s + (0 ..))), (indirect: n),
+            __fc_mblen_state;
+ */
+extern int mblen(char const *s, size_t n);
+
+/*@ ghost extern int __fc_mbtowc_state; */
+
+/*@ requires separation: \separated(pwc, s);
+    ensures consumed_range: \result ≤ \old(n);
+    assigns \result, *(pwc + (0 .. \result - 1)), __fc_mbtowc_state;
+    assigns \result
+      \from (indirect: s), (indirect: *(s + (0 .. n - 1))), (indirect: n),
+            __fc_mbtowc_state;
+    assigns *(pwc + (0 .. \result - 1))
+      \from (indirect: s), *(s + (0 .. n - 1)), (indirect: n),
+            __fc_mbtowc_state;
+    assigns __fc_mbtowc_state
+      \from (indirect: s), *(s + (0 .. n - 1)), (indirect: n),
+            __fc_mbtowc_state;
+ */
+extern int mbtowc(wchar_t * __restrict pwc, char const * __restrict s,
+                  size_t n);
+
+/*@ ghost extern int __fc_wctomb_state; */
+
+/*@ assigns \result, *(s + (0 ..)), __fc_wctomb_state;
+    assigns \result \from (indirect: wc), __fc_wctomb_state;
+    assigns *(s + (0 ..)) \from wc, __fc_wctomb_state;
+    assigns __fc_wctomb_state \from wc, __fc_wctomb_state;
+ */
+extern int wctomb(char *s, wchar_t wc);
+
+/*@ requires separation: \separated(pwcs, s);
+    assigns \result, *(pwcs + (0 .. n - 1));
+    assigns \result
+      \from (indirect: s), (indirect: *(s + (0 .. n - 1))), (indirect: n);
+    assigns *(pwcs + (0 .. n - 1))
+      \from (indirect: s), *(s + (0 .. n - 1)), (indirect: n);
+ */
+extern size_t mbstowcs(wchar_t * __restrict pwcs, char const * __restrict s,
+                       size_t n);
+
+/*@ requires separation: \separated(s, pwcs);
+    assigns \result, *(s + (0 .. n - 1));
+    assigns \result
+      \from (indirect: pwcs), (indirect: *(pwcs + (0 .. n - 1))),
+            (indirect: n);
+    assigns *(s + (0 .. n - 1))
+      \from (indirect: pwcs), *(pwcs + (0 .. n - 1)), (indirect: n);
+ */
+extern size_t wcstombs(char * __restrict s, wchar_t const * __restrict pwcs,
+                       size_t n);
+
+int posix_memalign(void **memptr, size_t alignment, size_t size);
+
+/*@ requires valid_template: valid_string(templat);
+    ensures
+      result_error_or_valid_fd: \result ≡ -1 ∨ (0 ≤ \result < 16);
+    assigns *(templat + (0 ..)), \result;
+    assigns *(templat + (0 ..)) \from \nothing;
+    assigns \result \from \nothing;
+ */
+extern int mkstemp(char *templat);
+
+char *realpath(char const * __restrict file_name,
+               char * __restrict resolved_name);
+
+int glob(char const *pattern, int flags,
+         int (*errfunc)(char const *epath, int eerrno), glob_t *pglob)
+{
+  int __retres;
+  int tmp;
+  unsigned int tmp_0;
+  char **tmp_1;
+  int tmp_4;
+  tmp = Frama_C_interval(0,10);
+  pglob->gl_pathc = (unsigned int)tmp;
+  if (flags & (1 << 3)) tmp_0 = pglob->gl_offs; else tmp_0 = (unsigned int)0;
+  size_t reserve_offs = tmp_0;
+  size_t prev_len = (unsigned int)0;
+  if (flags & (1 << 5)) 
+    while (*(pglob->gl_pathv + (reserve_offs + prev_len))) prev_len += (size_t)1;
+  if (flags & (1 << 5)) tmp_1 = pglob->gl_pathv; else tmp_1 = (char **)0;
+  char **path = tmp_1;
+  if (pglob->gl_pathc == (unsigned int)0) 
+    if (flags & (1 << 4)) {
+      pglob->gl_pathv = (char **)realloc((void *)path,
+                                         ((reserve_offs + prev_len) + (size_t)2) * sizeof(char *));
+      if (! pglob->gl_pathv) {
+        __retres = 1;
+        goto return_label;
+      }
+      {
+        size_t i = (unsigned int)0;
+        while (i < reserve_offs) {
+          *(pglob->gl_pathv + i) = (char *)0;
+          i += (size_t)1;
+        }
+      }
+      *(pglob->gl_pathv + (reserve_offs + prev_len)) = (char *)pattern;
+      *(pglob->gl_pathv + ((reserve_offs + prev_len) + (size_t)1)) = (char *)0;
+      __retres = 0;
+      goto return_label;
+    }
+    else {
+      __retres = 3;
+      goto return_label;
+    }
+  pglob->gl_pathv = (char **)realloc((void *)path,
+                                     (((reserve_offs + prev_len) + pglob->gl_pathc) + (size_t)1) * sizeof(char *));
+  if (! pglob->gl_pathv) {
+    __retres = 1;
+    goto return_label;
+  }
+  {
+    size_t i_0 = (unsigned int)0;
+    while (i_0 < reserve_offs) {
+      *(pglob->gl_pathv + i_0) = (char *)0;
+      i_0 += (size_t)1;
+    }
+  }
+  {
+    size_t i_1 = (unsigned int)0;
+    while (i_1 < pglob->gl_pathc) {
+      *(pglob->gl_pathv + ((reserve_offs + prev_len) + i_1)) = (char *)"glob result";
+      i_1 += (size_t)1;
+    }
+  }
+  *(pglob->gl_pathv + ((prev_len + reserve_offs) + pglob->gl_pathc)) = (char *)0;
+  tmp_4 = Frama_C_nondet(0,1);
+  if (tmp_4) {
+    __retres = 0;
+    goto return_label;
+  }
+  else {
+    if (errfunc) {
+      int tmp_3;
+      int tmp_2;
+      tmp_2 = Frama_C_interval(0,255);
+      tmp_3 = (*errfunc)("glob.c error path",tmp_2);
+      int res = tmp_3;
+      if (res) {
+        __retres = 2;
+        goto return_label;
+      }
+      else 
+        if (flags & (1 << 0)) {
+          __retres = 2;
+          goto return_label;
+        }
+    }
+    __retres = 0;
+    goto return_label;
+  }
+  return_label: return __retres;
+}
+
+void globfree(glob_t *pglob)
+{
+  if (pglob->gl_pathc > (unsigned int)0) free((void *)pglob->gl_pathv);
+  return;
+}
+
+intmax_t imaxabs(intmax_t c);
+
+imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom);
+
+/*@ assigns \result, *(endptr + (..)), __fc_errno;
+    assigns \result \from *(nptr + (..)), base;
+    assigns *(endptr + (..)) \from *(nptr + (..)), base;
+    assigns __fc_errno \from *(nptr + (..)), base;
+ */
+extern intmax_t strtoimax(char const * __restrict nptr,
+                          char ** __restrict endptr, int base);
+
+/*@ requires abs_representable: (long long)(-c) ≢ c;
+    assigns \result;
+    assigns \result \from c;
+ */
+intmax_t imaxabs(intmax_t c)
+{
+  intmax_t __retres;
+  if (c > (intmax_t)0) {
+    __retres = c;
+    goto return_label;
+  }
+  else {
+    __retres = - c;
+    goto return_label;
+  }
+  return_label: return __retres;
+}
+
+/*@ requires no_div_by_zero: denom ≢ 0;
+    requires no_overflow: denom ≢ -1 ∨ (long long)(-numer) ≢ numer;
+    ensures correct_div: \result.quot ≡ \old(numer) / \old(denom);
+    ensures correct_mod: \result.rem ≡ \old(numer) % \old(denom);
+    assigns \result;
+    assigns \result \from numer, denom;
+ */
+imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom)
+{
+  imaxdiv_t r;
+  r.quot = numer / denom;
+  r.rem = numer % denom;
+  return r;
+}
+
+extern struct lconv *__fc_locale;
+
+extern char *__fc_locale_names[512];
+
+char *setlocale(int category, char const *locale);
+
+struct lconv *localeconv(void);
+
+struct lconv __C_locale =
+  {.decimal_point = (char *)".",
+   .thousands_sep = (char *)"",
+   .grouping = (char *)"",
+   .int_curr_symbol = (char *)"",
+   .currency_symbol = (char *)"",
+   .mon_decimal_point = (char *)"",
+   .mon_thousands_sep = (char *)"",
+   .mon_grouping = (char *)"",
+   .positive_sign = (char *)"",
+   .negative_sign = (char *)"",
+   .int_frac_digits = (char)127,
+   .frac_digits = (char)127,
+   .p_cs_precedes = (char)127,
+   .p_sep_by_space = (char)127,
+   .n_cs_precedes = (char)127,
+   .n_sep_by_space = (char)127,
+   .p_sign_posn = (char)127,
+   .n_sign_posn = (char)127,
+   .int_p_cs_precedes = (char)127,
+   .int_p_sep_by_space = (char)127,
+   .int_n_cs_precedes = (char)127,
+   .int_n_sep_by_space = (char)127,
+   .int_p_sign_posn = (char)127,
+   .int_n_sign_posn = (char)127};
+struct lconv *__frama_c_locale = & __C_locale;
+char *__frama_c_locale_names[512] = {(char *)"C"};
+/*@ requires
+      locale_null_or_valid_string:
+        locale ≡ \null ∨ valid_read_string(locale);
+    ensures
+      result_null_or_locale_name:
+        \result ≡ \null ∨
+        (\valid(\result) ∧ (∃ ℤ i; \result ≡ __fc_locale_names[i]));
+    assigns __fc_locale, \result;
+    assigns __fc_locale \from category, *(locale + (..));
+    assigns \result \from __fc_locale, category, *(locale + (..));
+ */
+char *setlocale(int category, char const *locale)
+{
+  char *__retres;
+  if ((int)*locale == 'C') {
+    __frama_c_locale = & __C_locale;
+    __retres = __frama_c_locale_names[0];
+    goto return_label;
+  }
+  __retres = (char *)0;
+  return_label: return __retres;
+}
+
+/*@ ensures result_current_locale: \result ≡ __fc_locale;
+    assigns \nothing;
+ */
+struct lconv *localeconv(void)
+{
+  return __frama_c_locale;
+}
+
+/*@ assigns \result;
+    assigns \result \from x;
+    
+    behavior nan:
+      assumes is_nan: \is_NaN(x);
+      ensures fp_nan: \result ≡ 0;
+    
+    behavior inf:
+      assumes is_infinite: ¬\is_NaN(x) ∧ ¬\is_finite(x);
+      ensures fp_infinite: \result ≡ 1;
+    
+    behavior zero:
+      assumes is_a_zero: x ≡ 0.0;
+      ensures fp_zero: \result ≡ 2;
+    
+    behavior subnormal:
+      assumes is_finite: \is_finite(x);
+      assumes
+        is_subnormal:
+          (x > 0.0 ∧ x < 0x1p-126) ∨ (x < 0.0 ∧ x > -0x1p-126);
+      ensures fp_subnormal: \result ≡ 3;
+    
+    behavior normal:
+      assumes is_finite: \is_finite(x);
+      assumes not_subnormal: x ≤ -0x1p-126 ∨ x ≥ 0x1p-126;
+      ensures fp_normal: \result ≡ 4;
+    
+    complete behaviors normal, subnormal, zero, inf, nan;
+    disjoint behaviors normal, subnormal, zero, inf, nan;
+ */
+int __fc_fpclassifyf(float x);
+
+/*@ assigns \result;
+    assigns \result \from x;
+    
+    behavior nan:
+      assumes is_nan: \is_NaN(x);
+      ensures fp_nan: \result ≡ 0;
+    
+    behavior inf:
+      assumes is_infinite: ¬\is_NaN(x) ∧ ¬\is_finite(x);
+      ensures fp_infinite: \result ≡ 1;
+    
+    behavior zero:
+      assumes is_a_zero: x ≡ 0.0;
+      ensures fp_zero: \result ≡ 2;
+    
+    behavior subnormal:
+      assumes is_finite: \is_finite(x);
+      assumes
+        is_subnormal:
+          (x > 0.0 ∧ x < 0x1p-1022) ∨ (x < 0.0 ∧ x > -0x1p-1022);
+      ensures fp_subnormal: \result ≡ 3;
+    
+    behavior normal:
+      assumes is_finite: \is_finite(x);
+      assumes not_subnormal: x ≤ -0x1p-1022 ∨ x ≥ 0x1p-1022;
+      ensures fp_normal: \result ≡ 4;
+    
+    complete behaviors normal, subnormal, zero, inf, nan;
+    disjoint behaviors normal, subnormal, zero, inf, nan;
+ */
+int __fc_fpclassify(double x);
+
+/*@ requires in_domain: \is_finite(x) ∧ \abs(x) ≤ 1;
+    ensures positive_result: \is_finite(\result) ∧ \result ≥ 0;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double acos(double x);
+
+/*@ requires in_domain: \is_finite(x) ∧ \abs(x) ≤ 1;
+    ensures positive_result: \is_finite(\result) ∧ \result ≥ 0;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float acosf(float x);
+
+/*@ requires in_domain: \is_finite(x) ∧ \abs(x) ≤ 1;
+    ensures positive_result: \is_finite(\result) ∧ \result ≥ 0;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double acosl(long double x);
+
+/*@ requires in_domain: \is_finite(x) ∧ \abs(x) ≤ 1;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double asin(double x);
+
+/*@ requires in_domain: \is_finite(x) ∧ \abs(x) ≤ 1;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float asinf(float x);
+
+/*@ requires in_domain: \is_finite(x) ∧ \abs(x) ≤ 1;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double asinl(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1.571 ≤ \result ≤ 1.571;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float atanf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1.571 ≤ \result ≤ 1.571;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double atan(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1.571 ≤ \result ≤ 1.571;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double atanl(long double x);
+
+/*@ requires finite_args: \is_finite(x) ∧ \is_finite(y);
+    requires finite_result: \is_finite(atan2(x, y));
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x, y;
+ */
+extern double atan2(double y, double x);
+
+/*@ requires finite_args: \is_finite(x) ∧ \is_finite(y);
+    requires finite_logic_result: \is_finite(atan2f(x, y));
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x, y;
+ */
+extern float atan2f(float y, float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1. ≤ \result ≤ 1.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double cos(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1. ≤ \result ≤ 1.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float cosf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1. ≤ \result ≤ 1.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double cosl(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1. ≤ \result ≤ 1.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double sin(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1. ≤ \result ≤ 1.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float sinf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    ensures result_domain: -1. ≤ \result ≤ 1.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double sinl(long double x);
+
+/*@ assigns __fc_errno, \result;
+    assigns __fc_errno \from x;
+    assigns \result \from x;
+    
+    behavior normal:
+      assumes in_domain: \is_finite(x) ∧ x ≥ 1;
+      ensures positive_result: \is_finite(\result) ∧ \result ≥ 0;
+      assigns \result;
+      assigns \result \from x;
+    
+    behavior infinite:
+      assumes is_plus_infinity: \is_plus_infinity(x);
+      ensures result_plus_infinity: \is_plus_infinity(\result);
+      assigns \result;
+      assigns \result \from x;
+    
+    behavior domain_error:
+      assumes
+        out_of_domain: \is_minus_infinity(x) ∨ (\is_finite(x) ∧ x < 1);
+      ensures errno_set: __fc_errno ≡ 1;
+      assigns __fc_errno, \result;
+      assigns __fc_errno \from x;
+      assigns \result \from x;
+    
+    disjoint behaviors domain_error, infinite, normal;
+ */
+extern double acosh(double x);
+
+/*@ assigns __fc_errno, \result;
+    assigns __fc_errno \from x;
+    assigns \result \from x;
+    
+    behavior normal:
+      assumes in_domain: \is_finite(x) ∧ x ≥ 1;
+      ensures positive_result: \is_finite(\result) ∧ \result ≥ 0;
+      assigns \result;
+      assigns \result \from x;
+    
+    behavior infinite:
+      assumes is_plus_infinity: \is_plus_infinity(x);
+      ensures result_plus_infinity: \is_plus_infinity(\result);
+      assigns \result;
+      assigns \result \from x;
+    
+    behavior domain_error:
+      assumes
+        out_of_domain: \is_minus_infinity(x) ∨ (\is_finite(x) ∧ x < 1);
+      ensures errno_set: __fc_errno ≡ 1;
+      assigns __fc_errno, \result;
+      assigns __fc_errno \from x;
+      assigns \result \from x;
+    
+    disjoint behaviors domain_error, infinite, normal;
+ */
+extern float acoshf(float x);
+
+/*@ assigns __fc_errno, \result;
+    assigns __fc_errno \from x;
+    assigns \result \from x;
+    
+    behavior normal:
+      assumes in_domain: \is_finite(x) ∧ x ≥ 1;
+      ensures positive_result: \is_finite(\result) ∧ \result ≥ 0;
+      assigns \result;
+      assigns \result \from x;
+    
+    behavior infinite:
+      assumes is_plus_infinity: \is_plus_infinity(x);
+      ensures result_plus_infinity: \is_plus_infinity(\result);
+      assigns \result;
+      assigns \result \from x;
+    
+    behavior domain_error:
+      assumes
+        out_of_domain: \is_minus_infinity(x) ∨ (\is_finite(x) ∧ x < 1);
+      ensures errno_set: __fc_errno ≡ 1;
+      assigns __fc_errno, \result;
+      assigns __fc_errno \from x;
+      assigns \result \from x;
+    
+    disjoint behaviors domain_error, infinite, normal;
+ */
+extern long double acoshl(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires finite_domain: x ≤ 0x1.62e42fefa39efp+9;
+    ensures res_finite: \is_finite(\result);
+    ensures positive_result: \result > 0.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double exp(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires res_finite: x ≤ 0x1.62e42ep+6;
+    ensures res_finite: \is_finite(\result);
+    ensures positive_result: \result > 0.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float expf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double log(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float logf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_pos: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double logl(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double log10(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float log10f(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_postive: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double log10l(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double log2(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float log2f(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x > 0;
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double log2l(long double x);
+
+double fabs(double x);
+
+float fabsf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures res_finite: \is_finite(\result);
+    ensures positive_result: \result ≥ 0.;
+    ensures
+      equal_magnitude_result: \result ≡ \old(x) ∨ \result ≡ -\old(x);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double fabsl(long double x);
+
+/*@ requires finite_args: \is_finite(x) ∧ \is_finite(y);
+    requires finite_logic_res: \is_finite(pow(x, y));
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x, y;
+ */
+extern double pow(double x, double y);
+
+/*@ requires finite_args: \is_finite(x) ∧ \is_finite(y);
+    requires finite_logic_res: \is_finite(powf(x, y));
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x, y;
+ */
+extern float powf(float x, float y);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x ≥ -0.;
+    ensures finite_result: \is_finite(\result);
+    ensures positive_result: \result ≥ -0.;
+    ensures result_value: \result ≡ sqrt(\old(x));
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double sqrt(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x ≥ -0.;
+    ensures finite_result: \is_finite(\result);
+    ensures positive_result: \result ≥ -0.;
+    ensures result_value: \result ≡ sqrtf(\old(x));
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float sqrtf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    requires arg_positive: x ≥ -0.;
+    ensures finite_result: \is_finite(\result);
+    ensures positive_result: \result ≥ -0.;
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double sqrtl(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double ceil(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float ceilf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double ceill(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double floor(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float floorf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double floorl(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double round(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float roundf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double roundl(long double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern double trunc(double x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern float truncf(float x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x;
+ */
+extern long double truncl(long double x);
+
+/*@ requires finite_args: \is_finite(x) ∧ \is_finite(y);
+    requires finite_logic_result: \is_finite(fmod(x, y));
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x, y;
+ */
+extern double fmod(double x, double y);
+
+/*@ requires finite_args: \is_finite(x) ∧ \is_finite(y);
+    requires finite_logic_result: \is_finite(fmodf(x, y));
+    ensures finite_result: \is_finite(\result);
+    assigns \result;
+    assigns \result \from x, y;
+ */
+extern float fmodf(float x, float y);
+
+/*@ requires tagp_valid_string: valid_read_string(tagp);
+    ensures result_is_nan: \is_NaN(\result);
+    assigns \result;
+    assigns \result \from (indirect: *(tagp + (0 ..)));
+ */
+extern double nan(char const *tagp);
+
+/*@ requires tagp_valid_string: valid_read_string(tagp);
+    ensures result_is_nan: \is_NaN(\result);
+    assigns \result;
+    assigns \result \from (indirect: *(tagp + (0 ..)));
+ */
+extern float nanf(char const *tagp);
+
+/*@ requires tagp_valid_string: valid_read_string(tagp);
+    ensures result_is_nan: \is_NaN(\result);
+    assigns \result;
+    assigns \result \from (indirect: *(tagp + (0 ..)));
+ */
+extern long double nanl(char const *tagp);
+
+int __finitef(float f);
+
+int __finite(double d);
+
+/*@ logic float __fc_infinity(ℤ x) = \plus_infinity;
+ */
+/*@ logic float __fc_nan(ℤ x) = \NaN;
+
+*/
+/*@ ensures result_is_infinity: \is_plus_infinity(\result);
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+extern float __fc_infinity(int x);
+
+/*@ ensures result_is_nan: \is_NaN(\result);
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+extern float __fc_nan(int x);
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures res_finite: \is_finite(\result);
+    ensures positive_result: \result ≥ 0.;
+    ensures
+      equal_magnitude_result: \result ≡ \old(x) ∨ \result ≡ -\old(x);
+    assigns \result;
+    assigns \result \from x;
+ */
+double fabs(double x)
+{
+  double __retres;
+  if (x == 0.0) {
+    __retres = 0.0;
+    goto return_label;
+  }
+  if (x > 0.0) {
+    __retres = x;
+    goto return_label;
+  }
+  __retres = - x;
+  return_label: return __retres;
+}
+
+/*@ requires finite_arg: \is_finite(x);
+    ensures res_finite: \is_finite(\result);
+    ensures positive_result: \result ≥ 0.;
+    ensures
+      equal_magnitude_result: \result ≡ \old(x) ∨ \result ≡ -\old(x);
+    assigns \result;
+    assigns \result \from x;
+ */
+float fabsf(float x)
+{
+  float __retres;
+  if (x == 0.0f) {
+    __retres = 0.0f;
+    goto return_label;
+  }
+  else 
+    if (x > 0.0f) {
+      __retres = x;
+      goto return_label;
+    }
+    else {
+      __retres = - x;
+      goto return_label;
+    }
+  return_label: return __retres;
+}
+
+int __finitef(float f)
+{
+  int __retres;
+  union __fc_u_finitef u;
+  unsigned short usExp;
+  u.f = f;
+  usExp = (unsigned short)((int)u.w[1] & 0x7F80);
+  usExp = (unsigned short)((int)usExp >> 7);
+  __retres = ! ((int)usExp == 0xff);
+  return __retres;
+}
+
+int __finite(double d)
+{
+  int __retres;
+  union __fc_u_finite u;
+  unsigned short usExp;
+  u.d = d;
+  usExp = (unsigned short)((int)u.w[3] & 0x7F80);
+  usExp = (unsigned short)((int)usExp >> 7);
+  __retres = ! ((int)usExp == 0xff);
+  return __retres;
+}
+
+/*@ assigns \nothing; */
+extern void (*signal(int sig, void (*func)(int )))(int );
+
+/*@ ensures never_terminates: \false;
+    assigns \nothing; */
+extern int raise(int sig);
+
+/*@ requires valid_set: \valid(set);
+    ensures initialization: set: \initialized(\old(set));
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *set, \result;
+    assigns *set \from \nothing;
+    assigns \result \from \nothing;
+ */
+extern int sigemptyset(sigset_t *set);
+
+/*@ requires valid_set: \valid(set);
+    ensures initialization: set: \initialized(\old(set));
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *set, \result;
+    assigns *set \from \nothing;
+    assigns \result \from \nothing;
+ */
+extern int sigfillset(sigset_t *set);
+
+/*@ requires valid_set: \valid(set);
+    requires initialization: set: \initialized(set);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *set, \result;
+    assigns *set \from (indirect: signum);
+    assigns \result \from signum;
+ */
+extern int sigaddset(sigset_t *set, int signum);
+
+/*@ requires valid_set: \valid(set);
+    requires initialization: set: \initialized(set);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *set, \result;
+    assigns *set \from (indirect: signum);
+    assigns \result \from signum;
+ */
+extern int sigdelset(sigset_t *set, int signum);
+
+/*@ requires valid_read_set: \valid_read(set);
+    requires initialization: set: \initialized(set);
+    ensures
+      result_found_not_found_or_error:
+        \result ≡ 0 ∨ \result ≡ 1 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from *set, signum;
+ */
+extern int sigismember(sigset_t const *set, int signum);
+
+struct sigaction __fc_sigaction[64 + 1];
+struct sigaction *__fc_p_sigaction = __fc_sigaction;
+/*@ requires valid_signal: 0 ≤ signum ≤ 64;
+    requires valid_oldact_or_null: oldact ≡ \null ∨ \valid(oldact);
+    requires valid_read_act_or_null: act ≡ \null ∨ \valid_read(act);
+    requires separation: separated_acts: \separated(act, oldact);
+    ensures
+      act_changed:
+        \old(act) ≡ \null ∨
+        \subset(*(__fc_p_sigaction + \old(signum)), *\old(act));
+    ensures
+      oldact_assigned:
+        \old(oldact) ≡ \null ∨
+        *\old(oldact) ∈ *(__fc_p_sigaction + \old(signum));
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *oldact, *(__fc_p_sigaction + signum), \result;
+    assigns *oldact \from __fc_p_sigaction;
+    assigns *(__fc_p_sigaction + signum) \from *act;
+    assigns \result
+      \from (indirect: signum), (indirect: act), (indirect: *act),
+            (indirect: oldact), (indirect: *oldact);
+ */
+extern int sigaction(int signum, struct sigaction const * __restrict act,
+                     struct sigaction * __restrict oldact);
+
+/*@ requires valid_set_or_null: set ≡ \null ∨ \valid_read(set);
+    requires valid_how: set ≢ \null ⇒ how ∈ {0, 2, 1};
+    requires valid_oldset_or_null: oldset ≡ \null ∨ \valid(oldset);
+    requires
+      separation: (set ≡ oldset ≡ \null) ∨ \separated(set, oldset);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    ensures
+      initialization: oldset_initialized:
+        \old(oldset) ≢ \null ∧ \result ≡ 0 ⇒
+        \initialized(\old(oldset));
+    assigns \result, *oldset;
+    assigns \result
+      \from (indirect: how), (indirect: set), (indirect: oldset);
+    assigns *oldset \from (indirect: how), (indirect: oldset);
+ */
+extern int sigprocmask(int how, sigset_t const * __restrict set,
+                       sigset_t * __restrict oldset);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: pid), (indirect: sig);
+ */
+extern int kill(pid_t pid, int sig);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: pgrp), (indirect: sig);
+ */
+extern int killpg(pid_t pgrp, int sig);
+
+/*@ requires valid_read_iov: \valid_read(iov + (0 .. iovcnt - 1));
+    assigns *((char *)(iov + (0 .. iovcnt - 1))->iov_base + (0 ..));
+ */
+extern ssize_t readv(int fd, struct iovec const *iov, int iovcnt);
+
+/*@ ghost struct __fc_sockfds_type __fc_sockfds[1024]; */
+/*@ ghost extern int __fc_socket_counter __attribute__((__FRAMA_C_MODEL__));
+*/
+
+/*@ ghost int volatile __fc_open_sock_fds; */
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    ensures
+      result_error_or_valid_new_sockfd:
+        \result ≡ -1 ∨ (0 ≤ \result < 1024);
+    assigns \result, *((char *)addr + (0 .. *addrlen - 1)),
+            __fc_sockfds[sockfd];
+    assigns \result \from *addr, *addrlen, __fc_sockfds[sockfd];
+    assigns *((char *)addr + (0 .. *addrlen - 1))
+      \from *addr, *addrlen, __fc_sockfds[sockfd];
+    assigns __fc_sockfds[sockfd] \from *addr, *addrlen, __fc_sockfds[sockfd];
+    
+    behavior addr_null:
+      assumes addr_is_null: addr ≡ \null;
+      requires addrlen_should_be_null: addrlen ≡ \null;
+      assigns \result, __fc_sockfds[sockfd];
+      assigns \result \from __fc_sockfds[sockfd];
+      assigns __fc_sockfds[sockfd] \from __fc_sockfds[sockfd];
+    
+    behavior addr_not_null:
+      assumes addr_is_not_null: addr ≢ \null;
+      requires valid_addrlen: \valid(addrlen);
+      requires addr_has_room: \valid((char *)addr + (0 .. *addrlen - 1));
+      ensures
+        initialization: addr:
+          \initialized((char *)\old(addr) + (0 .. *\old(addrlen) - 1));
+    
+    disjoint behaviors addr_not_null, addr_null;
+ */
+extern int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
+
+/*@ requires valid_sockfd: sockfd: 0 ≤ sockfd < 1024;
+    requires valid_read_addr: \valid_read((char *)addr + (0 .. addrlen - 1));
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns __fc_sockfds[sockfd], \result;
+    assigns __fc_sockfds[sockfd]
+      \from sockfd, *addr, addrlen, __fc_sockfds[sockfd];
+    assigns \result
+      \from (indirect: sockfd), (indirect: *addr), (indirect: addrlen),
+            (indirect: __fc_sockfds[sockfd]);
+ */
+extern int bind(int sockfd, struct sockaddr const *addr, socklen_t addrlen);
+
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    requires valid_read_addr: \valid_read((char *)addr + (0 .. addrlen - 1));
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns __fc_sockfds[sockfd], \result;
+    assigns __fc_sockfds[sockfd]
+      \from __fc_sockfds[sockfd], (indirect: sockfd), (indirect: addr),
+            (indirect: *addr), (indirect: addrlen);
+    assigns \result
+      \from (indirect: __fc_sockfds[sockfd]), (indirect: sockfd),
+            (indirect: addr), (indirect: *addr), (indirect: addrlen);
+ */
+extern int connect(int sockfd, struct sockaddr const *addr, socklen_t addrlen);
+
+/*@ requires valid_sockfd: 0 ≤ socket < 1024;
+    requires valid_address_len: \valid(address_len);
+    requires initialization: address_len: \initialized(address_len);
+    requires
+      valid_address: \valid((char *)address + (0 .. *address_len - 1));
+    ensures new_address_len: *\old(address_len) ≤ \old(*address_len);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *address_len, \result,
+            *((char *)address + (0 .. *address_len - 1));
+    assigns *address_len \from (indirect: socket), __fc_sockfds[socket];
+    assigns \result
+      \from (indirect: __fc_sockfds[socket]), (indirect: socket);
+    assigns *((char *)address + (0 .. *address_len - 1))
+      \from (indirect: __fc_sockfds[socket]), (indirect: socket);
+ */
+extern int getsockname(int socket, struct sockaddr * __restrict address,
+                       socklen_t * __restrict address_len);
+
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    requires valid_optlen: \valid(optlen);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *((char *)optval + (0 ..)), \result, *optlen;
+    assigns *((char *)optval + (0 ..))
+      \from (indirect: sockfd), (indirect: level), (indirect: optname),
+            (indirect: *optlen), (indirect: optval),
+            (indirect: __fc_sockfds[sockfd]);
+    assigns \result
+      \from (indirect: sockfd), (indirect: level), (indirect: optname),
+            (indirect: *optlen), (indirect: optval),
+            (indirect: __fc_sockfds[sockfd]);
+    assigns *optlen
+      \from (indirect: sockfd), (indirect: level), (indirect: optname),
+            *optlen, (indirect: optval), (indirect: __fc_sockfds[sockfd]);
+    
+    behavior so_error:
+      assumes optname_is_error: level ≡ 1 ∧ optname ≡ 4;
+      requires valid_optlen: \valid(optlen);
+      requires optlen_value: *optlen ≡ sizeof(int);
+      requires valid_optval: \valid((int *)optval);
+      assigns *((int *)optval), \result;
+      assigns *((int *)optval)
+        \from (indirect: sockfd), (indirect: optlen),
+              (indirect: __fc_sockfds[sockfd]);
+      assigns \result
+        \from (indirect: sockfd), (indirect: optlen),
+              (indirect: __fc_sockfds[sockfd]);
+    
+    behavior other_options:
+      assumes optname_not_error: ¬(level ≡ 1 ∧ optname ≡ 4);
+      requires
+        optval_null_or_valid:
+          optval ≡ \null ∨ \valid((char *)optval + (0 ..));
+      assigns *((char *)optval + (0 ..)), \result, *optlen;
+      assigns *((char *)optval + (0 ..))
+        \from (indirect: sockfd), (indirect: level), (indirect: optname),
+              (indirect: *optlen), (indirect: optval),
+              (indirect: __fc_sockfds[sockfd]);
+      assigns \result
+        \from (indirect: sockfd), (indirect: level), (indirect: optname),
+              (indirect: *optlen), (indirect: optval),
+              (indirect: __fc_sockfds[sockfd]);
+      assigns *optlen
+        \from (indirect: sockfd), (indirect: level), (indirect: optname),
+              *optlen, (indirect: optval), (indirect: __fc_sockfds[sockfd]);
+    
+    complete behaviors other_options, so_error;
+    disjoint behaviors other_options, so_error;
+ */
+extern int getsockopt(int sockfd, int level, int optname, void *optval,
+                      socklen_t *optlen);
+
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, __fc_sockfds[sockfd];
+    assigns \result \from sockfd, __fc_sockfds[sockfd];
+    assigns __fc_sockfds[sockfd] \from sockfd, backlog, __fc_sockfds[sockfd];
+ */
+extern int listen(int sockfd, int backlog);
+
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    requires valid_buffer_length: \valid((char *)buf + (0 .. len - 1));
+    ensures
+      result_error_or_received_length:
+        \result ≡ -1 ∨ (0 ≤ \result ≤ \old(len));
+    ensures
+      initialization: \initialized((char *)\old(buf) + (0 .. \result - 1));
+    assigns *((char *)buf + (0 .. len - 1)), __fc_sockfds[sockfd], \result;
+    assigns *((char *)buf + (0 .. len - 1))
+      \from sockfd, len, flags, __fc_sockfds[sockfd];
+    assigns __fc_sockfds[sockfd]
+      \from sockfd, len, flags, __fc_sockfds[sockfd];
+    assigns \result \from sockfd, len, flags, __fc_sockfds[sockfd];
+ */
+extern ssize_t recv(int sockfd, void *buf, size_t len, int flags);
+
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    requires
+      msg_control_has_room:
+        \valid((char *)hdr->msg_control + (0 .. hdr->msg_controllen - 1));
+    requires
+      msg_iov_has_room: \valid(hdr->msg_iov + (0 .. hdr->msg_iovlen - 1));
+    requires
+      msg_name_null_or_has_room:
+        hdr->msg_name ≡ \null ∨
+        \valid((char *)hdr->msg_name + (0 .. hdr->msg_namelen - 1));
+    ensures
+      result_error_or_received_length:
+        \result ≡ -1 ∨ (0 ≤ \result ≤ \old(hdr)->msg_iovlen);
+    assigns *((char *)hdr->msg_name + (0 .. hdr->msg_namelen - 1)),
+            hdr->msg_namelen,
+            *((char *)(hdr->msg_iov + (0 .. hdr->msg_iovlen - 1))->iov_base +
+              (0 ..)),
+            *((char *)hdr->msg_control + (0 .. hdr->msg_controllen - 1)),
+            \result, hdr->msg_controllen, hdr->msg_flags,
+            __fc_sockfds[sockfd];
+    assigns *((char *)hdr->msg_name + (0 .. hdr->msg_namelen - 1))
+      \from __fc_sockfds[sockfd];
+    assigns hdr->msg_namelen \from __fc_sockfds[sockfd];
+    assigns
+    *((char *)(hdr->msg_iov + (0 .. hdr->msg_iovlen - 1))->iov_base + (0 ..))
+      \from __fc_sockfds[sockfd];
+    assigns *((char *)hdr->msg_control + (0 .. hdr->msg_controllen - 1))
+      \from __fc_sockfds[sockfd];
+    assigns \result \from __fc_sockfds[sockfd];
+    assigns hdr->msg_controllen \from __fc_sockfds[sockfd];
+    assigns hdr->msg_flags \from __fc_sockfds[sockfd];
+    assigns __fc_sockfds[sockfd] \from __fc_sockfds[sockfd];
+ */
+extern ssize_t recvmsg(int sockfd, struct msghdr *hdr, int flags);
+
+/*@ requires available_sockfd: 0 ≤ sockfd < 1024;
+    requires buf_len_ok: \valid_read((char *)buf + (0 .. len - 1));
+    ensures
+      error_or_chars_sent: \result ≡ -1 ∨ (0 ≤ \result ≤ \old(len));
+    assigns __fc_errno, __fc_sockfds[sockfd], \result;
+    assigns __fc_errno
+      \from (indirect: sockfd), (indirect: __fc_sockfds[sockfd]),
+            (indirect: *((char *)buf + (0 .. len))), flags;
+    assigns __fc_sockfds[sockfd]
+      \from __fc_sockfds[sockfd], *((char *)buf + (0 .. len)), flags;
+    assigns \result
+      \from (indirect: sockfd), (indirect: __fc_sockfds[sockfd]),
+            (indirect: *((char *)buf + (0 .. len))), (indirect: flags);
+ */
+extern ssize_t send(int sockfd, void const *buf, size_t len, int flags);
+
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    requires
+      optval_null_or_has_room:
+        optval ≡ \null ∨ \valid_read((char *)optval + (0 .. optlen - 1));
+    ensures result_error_or_ok: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, __fc_sockfds[sockfd];
+    assigns \result
+      \from __fc_sockfds[sockfd], level, optname,
+            *((char *)optval + (0 .. optlen - 1)), optlen;
+    assigns __fc_sockfds[sockfd]
+      \from __fc_sockfds[sockfd], level, optname,
+            *((char *)optval + (0 .. optlen - 1)), optlen;
+ */
+extern int setsockopt(int sockfd, int level, int optname, void const *optval,
+                      socklen_t optlen);
+
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    ensures result_error_or_ok: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, __fc_sockfds[sockfd];
+    assigns \result \from how, __fc_sockfds[sockfd];
+    assigns __fc_sockfds[sockfd] \from how, __fc_sockfds[sockfd];
+ */
+extern int shutdown(int sockfd, int how);
+
+/*@ ensures
+      result_error_or_valid_new_sockfd:
+        (0 ≤ \result < 1024) ∨ \result ≡ -1;
+    assigns \result, __fc_socket_counter;
+    assigns \result
+      \from (indirect: domain), (indirect: type), (indirect: protocol),
+            (indirect: __fc_socket_counter);
+    assigns __fc_socket_counter
+      \from (indirect: domain), (indirect: type), (indirect: protocol),
+            __fc_socket_counter;
+ */
+extern int socket(int domain, int type, int protocol);
+
+/*@ requires valid_socket_sector: \valid(sv + (0 .. 1));
+    ensures result_error_or_ok: \result ≡ 0 ∨ \result ≡ -1;
+    ensures initialization: sv: \initialized(\old(sv) + (0 .. 1));
+    ensures valid_new_sockfd: sv0: 0 ≤ *(\old(sv) + 0) < 1024;
+    ensures valid_new_sockfd: sv1: 0 ≤ *(\old(sv) + 1) < 1024;
+    assigns \result, __fc_socket_counter, *(sv + (0 .. 1));
+    assigns \result \from __fc_socket_counter;
+    assigns __fc_socket_counter \from __fc_socket_counter;
+    assigns *(sv + (0 .. 1)) \from __fc_socket_counter;
+ */
+extern int socketpair(int domain, int type, int protocol, int * /*[2]*/ sv);
+
+struct in6_addr const in6addr_any = {.s6_addr = {(unsigned char)0}};
+struct in6_addr const in6addr_loopback =
+  {.s6_addr = {(unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF,
+               (unsigned char)0xFF}};
+/*@ assigns \result;
+    assigns \result \from arg; */
+extern uint32_t htonl(uint32_t arg);
+
+/*@ assigns \result;
+    assigns \result \from arg; */
+extern uint16_t htons(uint16_t arg);
+
+/*@ assigns \result;
+    assigns \result \from arg; */
+extern uint32_t ntohl(uint32_t arg);
+
+/*@ assigns \result;
+    assigns \result \from arg; */
+extern uint16_t ntohs(uint16_t arg);
+
+/*@ requires valid_arg: valid_read_string(arg);
+    assigns \result;
+    assigns \result \from (indirect: *(arg + (0 ..)));
+ */
+extern in_addr_t inet_addr(char const *arg);
+
+char volatile __fc_inet_ntoa_array[16];
+char *__fc_inet_ntoa = (char *)(__fc_inet_ntoa_array);
+/*@ ensures result_static_string: \result ≡ __fc_inet_ntoa;
+    ensures result_null_terminated: *(\result + 15) ≡ 0;
+    ensures result_valid_string: valid_read_string(\result);
+    assigns \result, *(__fc_inet_ntoa + (0 ..));
+    assigns \result \from (indirect: arg), __fc_inet_ntoa;
+    assigns *(__fc_inet_ntoa + (0 ..)) \from (indirect: arg);
+ */
+extern char *inet_ntoa(struct in_addr arg);
+
+/*@ assigns \result, *(dst + (0 .. size - 1));
+    assigns \result \from dst, af, *((char *)src + (0 ..));
+    assigns *(dst + (0 .. size - 1)) \from af, *((char *)src + (0 ..));
+ */
+extern char const *inet_ntop(int af, void const *src, char *dst,
+                             socklen_t size);
+
+/*@ assigns \result, *((char *)dst + (0 ..));
+    assigns \result \from af, *(src + (..));
+    assigns *((char *)dst + (0 ..)) \from af, *(src + (0 ..));
+ */
+extern int inet_pton(int af, char const *src, void *dst);
+
+int h_errno;
+/*@ requires addrinfo_valid: \valid(addrinfo);
+    ensures allocation: \allocable(\old(addrinfo));
+    assigns \nothing;
+    frees addrinfo;
+ */
+extern void freeaddrinfo(struct addrinfo *addrinfo);
+
+char *__fc_gai_strerror = (char *)"<error message reported by gai_strerror>";
+/*@ ensures result_string: \result ≡ __fc_gai_strerror;
+    ensures result_valid_string: valid_read_string(\result);
+    assigns \result;
+    assigns \result \from (indirect: errcode), __fc_gai_strerror;
+ */
+extern char const *gai_strerror(int errcode);
+
+int getaddrinfo(char const * __restrict nodename,
+                char const * __restrict servname,
+                struct addrinfo const * __restrict hints,
+                struct addrinfo ** __restrict res);
+
+struct hostent *gethostbyname(char const *name);
+
+/*@
+predicate non_escaping{L}(void *s, ℤ n) =
+  ∀ ℤ i; 0 ≤ i < n ⇒ ¬\dangling((char *)s + i);
+ */
+/*@
+predicate empty_block{L}(void *s) =
+  \block_length((char *)s) ≡ 0 ∧ \offset((char *)s) ≡ 0;
+ */
+/*@
+predicate valid_or_empty{L}(void *s, size_t n) =
+  (empty_block(s) ∨ \valid_read((char *)s)) ∧
+  \valid((char *)s + (0 .. n - 1));
+ */
+/*@
+predicate valid_read_or_empty{L}(void *s, size_t n) =
+  (empty_block(s) ∨ \valid_read((char *)s)) ∧
+  \valid_read((char *)s + (1 .. n - 1));
+
+*/
+int memcmp(void const *s1, void const *s2, size_t n);
+
+void *memchr(void const *s, int c, size_t n);
+
+void *memcpy(void * __restrict dest, void const * __restrict src, size_t n);
+
+void *memmove(void *dest, void const *src, size_t n);
+
+void *memset(void *s, int c, size_t n);
+
+size_t strlen(char const *s);
+
+size_t strnlen(char const *s, size_t maxlen);
+
+int strcmp(char const *s1, char const *s2);
+
+int strncmp(char const *s1, char const *s2, size_t n);
+
+/*@ requires valid_string_s1: valid_read_string(s1);
+    requires valid_string_s2: valid_read_string(s2);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s1 + (0 ..))), (indirect: *(s2 + (0 ..)));
+ */
+extern int strcoll(char const *s1, char const *s2);
+
+char *strchr(char const *s, int c);
+
+/*@ requires valid_string_s: valid_read_string(s);
+    ensures
+      result_same_base: \subset(\result, \old(s) + (0 .. strlen(\old(s))));
+    assigns \result;
+    assigns \result
+      \from s, (indirect: *(s + (0 .. strlen{Old}(s)))), (indirect: c);
+ */
+extern char *strchrnul(char const *s, int c);
+
+char *strrchr(char const *s, int c);
+
+/*@ requires valid_string_s: valid_read_string(s);
+    requires valid_string_reject: valid_read_string(reject);
+    ensures result_bounded: 0 ≤ \result ≤ strlen(\old(s));
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s + (0 ..))), (indirect: *(reject + (0 ..)));
+ */
+extern size_t strcspn(char const *s, char const *reject);
+
+/*@ requires valid_string_s: valid_read_string(s);
+    requires valid_string_accept: valid_read_string(accept);
+    ensures result_bounded: 0 ≤ \result ≤ strlen(\old(s));
+    assigns \result, \result;
+    assigns \result \from *(s + (0 ..)), *(accept + (0 ..));
+    assigns \result
+      \from (indirect: *(s + (0 ..))), (indirect: *(accept + (0 ..)));
+ */
+extern size_t strspn(char const *s, char const *accept);
+
+/*@ requires valid_string_s: valid_read_string(s);
+    requires valid_string_accept: valid_read_string(accept);
+    ensures
+      result_null_or_same_base:
+        \result ≡ \null ∨ \base_addr(\result) ≡ \base_addr(\old(s));
+    assigns \result;
+    assigns \result \from s, *(s + (0 ..)), *(accept + (0 ..));
+ */
+extern char *strpbrk(char const *s, char const *accept);
+
+char *strstr(char const *haystack, char const *needle);
+
+/*@ requires valid_string_haystack: valid_read_string(haystack);
+    requires valid_string_needle: valid_read_string(needle);
+    ensures
+      result_null_or_in_haystack:
+        \result ≡ \null ∨
+        (\subset(\result, \old(haystack) + (0 ..)) ∧ \valid_read(\result));
+    assigns \result;
+    assigns \result
+      \from haystack, (indirect: *(haystack + (0 ..))),
+            (indirect: *(needle + (0 ..)));
+ */
+extern char *strcasestr(char const *haystack, char const *needle);
+
+char *__fc_strtok_ptr;
+/*@ requires valid_string_delim: valid_read_string(delim);
+    assigns *(s + (0 ..)), *(__fc_strtok_ptr + (0 ..)), \result,
+            __fc_strtok_ptr;
+    assigns *(s + (0 ..))
+      \from *(s + (0 ..)), (indirect: s), (indirect: __fc_strtok_ptr),
+            (indirect: *(delim + (0 ..)));
+    assigns *(__fc_strtok_ptr + (0 ..))
+      \from *(__fc_strtok_ptr + (0 ..)), (indirect: s),
+            (indirect: __fc_strtok_ptr), (indirect: *(delim + (0 ..)));
+    assigns \result
+      \from s, __fc_strtok_ptr, (indirect: *(s + (0 ..))),
+            (indirect: *(__fc_strtok_ptr + (0 ..))),
+            (indirect: *(delim + (0 ..)));
+    assigns __fc_strtok_ptr
+      \from \old(__fc_strtok_ptr), s,
+            (indirect: *(__fc_strtok_ptr + (0 ..))),
+            (indirect: *(delim + (0 ..)));
+    
+    behavior new_str:
+      assumes s_not_null: s ≢ \null;
+      requires
+        valid_string_s_or_delim_not_found:
+          valid_string(s) ∨
+          (valid_read_string(s) ∧
+           (∀ int i;
+              0 ≤ i < strlen(delim) ⇒
+              ¬(strchr(s, *(delim + i)) ≡ \true)));
+      ensures
+        result_subset:
+          \result ≡ \null ∨ \subset(\result, \old(s) + (0 ..));
+      ensures ptr_subset: \subset(__fc_strtok_ptr, \old(s) + (0 ..));
+      assigns __fc_strtok_ptr, *(s + (0 ..)), \result;
+      assigns __fc_strtok_ptr
+        \from s, (indirect: *(s + (0 ..))), (indirect: *(delim + (0 ..)));
+      assigns *(s + (0 ..))
+        \from *(s + (0 ..)), (indirect: s), (indirect: *(delim + (0 ..)));
+      assigns \result
+        \from s, (indirect: *(s + (0 ..))), (indirect: *(delim + (0 ..)));
+    
+    behavior resume_str:
+      assumes s_null: s ≡ \null;
+      requires not_first_call: __fc_strtok_ptr ≢ \null;
+      ensures
+        result_subset:
+          \result ≡ \null ∨
+          \subset(\result, \old(__fc_strtok_ptr) + (0 ..));
+      ensures
+        ptr_subset: \subset(__fc_strtok_ptr, \old(__fc_strtok_ptr) + (0 ..));
+      assigns *(__fc_strtok_ptr + (0 ..)), __fc_strtok_ptr, \result;
+      assigns *(__fc_strtok_ptr + (0 ..))
+        \from *(__fc_strtok_ptr + (0 ..)), (indirect: __fc_strtok_ptr),
+              (indirect: *(delim + (0 ..)));
+      assigns __fc_strtok_ptr
+        \from \old(__fc_strtok_ptr), (indirect: *(__fc_strtok_ptr + (0 ..))),
+              (indirect: *(delim + (0 ..)));
+      assigns \result
+        \from __fc_strtok_ptr, (indirect: *(__fc_strtok_ptr + (0 ..))),
+              (indirect: *(delim + (0 ..)));
+    
+    complete behaviors resume_str, new_str;
+    disjoint behaviors resume_str, new_str;
+ */
+extern char *strtok(char * __restrict s, char const * __restrict delim);
+
+/*@ requires valid_string_delim: valid_read_string(delim);
+    requires valid_saveptr: \valid(saveptr);
+    assigns *(s + (0 ..)), *(*saveptr + (0 ..)), \result, *saveptr;
+    assigns *(s + (0 ..))
+      \from *(s + (0 ..)), (indirect: s), (indirect: *saveptr),
+            (indirect: *(delim + (0 ..)));
+    assigns *(*saveptr + (0 ..))
+      \from *(*saveptr + (0 ..)), (indirect: s), (indirect: *saveptr),
+            (indirect: *(delim + (0 ..)));
+    assigns \result
+      \from s, *saveptr, (indirect: *(s + (0 ..))),
+            (indirect: *(*saveptr + (0 ..))), (indirect: *(delim + (0 ..)));
+    assigns *saveptr
+      \from \old(*saveptr), s, (indirect: *(*saveptr + (0 ..))),
+            (indirect: *(delim + (0 ..)));
+    
+    behavior new_str:
+      assumes s_not_null: s ≢ \null;
+      requires
+        valid_string_s_or_delim_not_found:
+          valid_string(s) ∨
+          (valid_read_string(s) ∧
+           (∀ int i;
+              0 ≤ i < strlen(delim) ⇒
+              ¬(strchr(s, *(delim + i)) ≡ \true)));
+      ensures
+        result_subset:
+          \result ≡ \null ∨ \subset(\result, \old(s) + (0 ..));
+      ensures initialization: \initialized(\old(saveptr));
+      ensures saveptr_subset: \subset(*\old(saveptr), \old(s) + (0 ..));
+      assigns *saveptr, *(s + (0 ..)), \result;
+      assigns *saveptr
+        \from s, (indirect: *(s + (0 ..))), (indirect: *(delim + (0 ..)));
+      assigns *(s + (0 ..))
+        \from *(s + (0 ..)), (indirect: s), (indirect: *(delim + (0 ..)));
+      assigns \result
+        \from s, (indirect: *(s + (0 ..))), (indirect: *(delim + (0 ..)));
+    
+    behavior resume_str:
+      assumes s_null: s ≡ \null;
+      requires not_first_call: *saveptr ≢ \null;
+      requires initialization: saveptr: \initialized(saveptr);
+      ensures
+        result_subset:
+          \result ≡ \null ∨ \subset(\result, \old(*saveptr) + (0 ..));
+      ensures
+        saveptr_subset: \subset(*\old(saveptr), \old(*saveptr) + (0 ..));
+      assigns *(*saveptr + (0 ..)), *saveptr, \result;
+      assigns *(*saveptr + (0 ..))
+        \from *(*saveptr + (0 ..)), (indirect: *saveptr),
+              (indirect: *(delim + (0 ..)));
+      assigns *saveptr
+        \from \old(*saveptr), (indirect: *(*saveptr + (0 ..))),
+              (indirect: *(delim + (0 ..)));
+      assigns \result
+        \from *saveptr, (indirect: *(*saveptr + (0 ..))),
+              (indirect: *(delim + (0 ..)));
+    
+    complete behaviors resume_str, new_str;
+    disjoint behaviors resume_str, new_str;
+ */
+extern char *strtok_r(char * __restrict s, char const * __restrict delim,
+                      char ** __restrict saveptr);
+
+/*@ requires
+      valid_string_stringp: \valid(stringp) ∧ valid_string(*stringp);
+    requires valid_string_delim: valid_read_string(delim);
+    assigns *stringp, \result;
+    assigns *stringp \from *(delim + (..)), *(*(stringp + (..)));
+    assigns \result \from *(delim + (..)), *(*(stringp + (..)));
+ */
+extern char *strsep(char **stringp, char const *delim);
+
+char __fc_strerror[64];
+char * const __fc_p_strerror = __fc_strerror;
+char *strerror(int errnum);
+
+char *strcpy(char *dest, char const *src);
+
+char *strncpy(char *dest, char const *src, size_t n);
+
+/*@ requires valid_string_src: valid_read_string(src);
+    requires room_nstring: \valid(dest + (0 .. n - 1));
+    requires
+      separation:
+        \separated(
+          dest + (0 .. n - 1), src + (0 .. \max(n - 1, strlen(src)))
+          );
+    ensures
+      initialization:
+        \initialized(\old(dest) + (0 .. \min(strlen(\old(src)), \old(n) - 1)));
+    ensures bounded_result: \result ≡ strlen(\old(src));
+    assigns *(dest + (0 .. n - 1)), \result;
+    assigns *(dest + (0 .. n - 1)) \from *(src + (0 .. n - 1));
+    assigns \result
+      \from (indirect: src), (indirect: *(src + (0 .. n - 1))), (indirect: n);
+ */
+size_t strlcpy(char * __restrict dest, char const * __restrict src, size_t n);
+
+/*@ requires valid_string_src: valid_read_string(src);
+    requires room_string: \valid(dest + (0 .. strlen(src)));
+    requires
+      separation:
+        \separated(dest + (0 .. strlen(src)), src + (0 .. strlen(src)));
+    ensures equal_contents: strcmp(\old(dest), \old(src)) ≡ 0;
+    ensures points_to_end: \result ≡ \old(dest) + strlen(\old(dest));
+    assigns *(dest + (0 .. strlen{Old}(src))), \result;
+    assigns *(dest + (0 .. strlen{Old}(src)))
+      \from *(src + (0 .. strlen{Old}(src)));
+    assigns \result \from dest;
+ */
+extern char *stpcpy(char * __restrict dest, char const * __restrict src);
+
+char *strcat(char *dest, char const *src);
+
+char *strncat(char *dest, char const *src, size_t n);
+
+/*@ requires valid_string_src: valid_read_string(src);
+    requires valid_string_dest: valid_string(dest);
+    requires room_nstring: \valid(dest + (0 .. n - 1));
+    ensures
+      bounded_result: \result ≡ strlen(\old(dest)) + strlen(\old(src));
+    assigns *(dest + (strlen{Old}(dest) .. n)), \result;
+    assigns *(dest + (strlen{Old}(dest) .. n))
+      \from (indirect: n), *(src + (0 .. strlen{Old}(src)));
+    assigns \result
+      \from (indirect: src), (indirect: *(src + (0 .. n - 1))), (indirect: n);
+ */
+extern size_t strlcat(char * __restrict dest, char const * __restrict src,
+                      size_t n);
+
+/*@ requires valid_dest: \valid(dest + (0 .. n - 1));
+    requires valid_string_src: valid_read_string(src);
+    assigns *(dest + (0 .. n - 1)), \result;
+    assigns *(dest + (0 .. n - 1))
+      \from (indirect: *(src + (0 ..))), (indirect: n);
+    assigns \result \from dest;
+ */
+extern size_t strxfrm(char * __restrict dest, char const * __restrict src,
+                      size_t n);
+
+char *strdup(char const *s);
+
+char *strndup(char const *s, size_t n);
+
+char __fc_strsignal[64];
+char * const __fc_p_strsignal = __fc_strsignal;
+char *strsignal(int signum);
+
+/*@ requires valid_memory_area: \valid((char *)s + (0 .. n - 1));
+    ensures
+      s_initialized: initialization:
+        \initialized((char *)\old(s) + (0 .. \old(n) - 1));
+    ensures
+      zero_initialized: \subset(*((char *)\old(s) + (0 .. \old(n) - 1)), {0});
+    assigns *((char *)s + (0 .. n - 1));
+    assigns *((char *)s + (0 .. n - 1)) \from \nothing;
+ */
+extern void bzero(void *s, size_t n);
+
+int strcasecmp(char const *s1, char const *s2);
+
+/*@ requires valid_string_s1: valid_read_nstring(s1, n);
+    requires valid_string_s2: valid_read_nstring(s2, n);
+    assigns \result;
+    assigns \result
+      \from (indirect: n), (indirect: *(s1 + (0 .. n - 1))),
+            (indirect: *(s2 + (0 .. n - 1)));
+ */
+extern int strncasecmp(char const *s1, char const *s2, size_t n);
+
+static unsigned int volatile getaddrinfo_net_state;
+/*@ requires
+      nodename_string: nodename ≡ \null ∨ valid_read_string(nodename);
+    requires
+      servname_string: servname ≡ \null ∨ valid_read_string(servname);
+    requires hints_option: hints ≡ \null ∨ \valid_read(hints);
+    requires valid_res: \valid(res);
+    assigns *res, \result, __fc_errno;
+    assigns *res
+      \from (indirect: nodename), (indirect: servname), (indirect: hints);
+    assigns \result
+      \from (indirect: nodename), (indirect: servname), (indirect: hints);
+    assigns __fc_errno
+      \from (indirect: nodename), (indirect: servname), (indirect: hints);
+    allocates *\old(res);
+    
+    behavior empty_request:
+      assumes empty: nodename ≡ \null ∧ servname ≡ \null;
+      ensures no_name: \result ≡ -2;
+      assigns \result;
+      assigns \result \from (indirect: nodename), (indirect: servname);
+    
+    behavior normal_request:
+      assumes has_name: nodename ≢ \null ∨ servname ≢ \null;
+      ensures
+        initialization: allocation: success_or_error:
+          (\result ≡ 0 ∧
+           \fresh{Old, Here}(*\old(res),sizeof(*\old(res))) ∧
+           \initialized(*\old(res))) ∨
+          \result ≡ -3 ∨ \result ≡ -1 ∨ \result ≡ -4 ∨
+          \result ≡ -6 ∨ \result ≡ -10 ∨ \result ≡ -8 ∨
+          \result ≡ -7 ∨ \result ≡ -11;
+    
+    complete behaviors normal_request, empty_request;
+    disjoint behaviors normal_request, empty_request;
+ */
+int getaddrinfo(char const * __restrict nodename,
+                char const * __restrict servname,
+                struct addrinfo const * __restrict hints,
+                struct addrinfo ** __restrict res)
+{
+  int __retres;
+  if (nodename == (char const *)0) 
+    if (servname == (char const *)0) {
+      __retres = -2;
+      goto return_label;
+    }
+  switch (getaddrinfo_net_state) {
+    case (unsigned int)0: __retres = -1;
+    goto return_label;
+    case (unsigned int)1: __retres = -3;
+    goto return_label;
+    case (unsigned int)2: __retres = -4;
+    goto return_label;
+    case (unsigned int)3: __retres = -6;
+    goto return_label;
+    case (unsigned int)5: __retres = -8;
+    goto return_label;
+    case (unsigned int)6: __retres = -7;
+    goto return_label;
+    case (unsigned int)7:
+    {
+      __fc_errno = 5;
+      __retres = -11;
+      goto return_label;
+    }
+    default:
+    {
+      struct addrinfo *tmp_0;
+      struct sockaddr *tmp_2;
+      int tmp_3;
+      struct addrinfo *ai = malloc(sizeof(*tmp_0));
+      if (! ai) {
+        __retres = -10;
+        goto return_label;
+      }
+      struct sockaddr *sa = malloc(sizeof(*tmp_2));
+      if (! sa) {
+        __retres = -10;
+        goto return_label;
+      }
+      tmp_3 = Frama_C_interval(0,43);
+      sa->sa_family = (unsigned short)tmp_3;
+      /*@ slevel 15; */
+      {
+        int i = 0;
+        while (i < 14) {
+          {
+            int tmp_4;
+            tmp_4 = Frama_C_interval(-128,127);
+            sa->sa_data[i] = (char)tmp_4;
+          }
+          i ++;
+        }
+      }
+      /*@ slevel default; */
+      ai->ai_flags = 0;
+      ai->ai_family = (int)sa->sa_family;
+      ai->ai_socktype = Frama_C_interval(0,5);
+      ai->ai_protocol = Frama_C_interval(0,IPPROTO_MAX);
+      ai->ai_addrlen = sizeof(*sa);
+      ai->ai_addr = sa;
+      ai->ai_canonname = (char *)"dummy";
+      ai->ai_next = (struct addrinfo *)0;
+      *res = ai;
+      __retres = 0;
+      goto return_label;
+    }
+  }
+  return_label: return __retres;
+}
+
+struct __fc_gethostbyname __fc_ghbn;
+int res_search(char const *dname, int class, int type, char *answer,
+               int anslen)
+{
+  int tmp;
+  {
+    int i = 0;
+    while (i < anslen - 1) {
+      *(answer + i) = Frama_C_char_interval((char)(-128),(char)127);
+      i ++;
+    }
+  }
+  *(answer + (anslen - 1)) = (char)0;
+  tmp = Frama_C_interval(-1,anslen);
+  return tmp;
+}
+
+struct hostent *gethostbyname(char const *name)
+{
+  struct hostent *__retres;
+  char buf[128];
+  char const *cp;
+  int n;
+  int tmp;
+  __fc_ghbn.host.h_addrtype = 2;
+  __fc_ghbn.host.h_length = (int)sizeof(struct in_addr);
+  if ((int)*name >= '0') 
+    if ((int)*name <= '9') {
+      cp = name;
+      while (1) {
+        if (! *cp) {
+          struct in_addr addr;
+          cp --;
+          ;
+          if ((int)*cp == '.') break;
+          addr.s_addr = inet_addr(name);
+          if (addr.s_addr == 0xffffffff) {
+            __retres = (struct hostent *)0;
+            goto return_label;
+          }
+          memcpy((void *)(__fc_ghbn.host_addr),(void const *)(& addr),
+                 (unsigned int)__fc_ghbn.host.h_length);
+          strncpy(__fc_ghbn.hostbuf,name,(unsigned int)(128 - 1));
+          __fc_ghbn.hostbuf[128 - 1] = (char)'\000';
+          __fc_ghbn.host.h_name = __fc_ghbn.hostbuf;
+          __fc_ghbn.host.h_aliases = __fc_ghbn.host_aliases;
+          __fc_ghbn.host_aliases[0] = (char *)0;
+          __fc_ghbn.h_addr_ptrs[0] = (char *)(__fc_ghbn.host_addr);
+          __fc_ghbn.h_addr_ptrs[1] = (char *)0;
+          __fc_ghbn.host.h_addr_list = __fc_ghbn.h_addr_ptrs;
+          __retres = & __fc_ghbn.host;
+          goto return_label;
+        }
+        if ((int)*cp < '0') 
+          if ((int)*cp > '9') 
+            if ((int)*cp != '.') break;
+        cp ++;
+      }
+    }
+  n = res_search(name,1,1,buf,(int)sizeof(buf));
+  if (n < 0) {
+    __retres = (struct hostent *)0;
+    goto return_label;
+  }
+  tmp = Frama_C_nondet(0,1);
+  if (tmp) {
+    __retres = (struct hostent *)0;
+    goto return_label;
+  }
+  else {
+    struct in_addr addr_0;
+    addr_0.s_addr = inet_addr(name);
+    memcpy((void *)(__fc_ghbn.host_addr),(void const *)(& addr_0),
+           (unsigned int)__fc_ghbn.host.h_length);
+    strncpy(__fc_ghbn.hostbuf,name,(unsigned int)(128 - 1));
+    __fc_ghbn.hostbuf[128 - 1] = (char)'\000';
+    __fc_ghbn.host.h_name = __fc_ghbn.hostbuf;
+    __fc_ghbn.host.h_aliases = __fc_ghbn.host_aliases;
+    __fc_ghbn.host_aliases[0] = (char *)0;
+    __fc_ghbn.h_addr_ptrs[0] = (char *)(__fc_ghbn.host_addr);
+    __fc_ghbn.h_addr_ptrs[1] = (char *)0;
+    __fc_ghbn.host.h_addr_list = __fc_ghbn.h_addr_ptrs;
+    __retres = & __fc_ghbn.host;
+    goto return_label;
+  }
+  return_label: return __retres;
+}
+
+FILE *__fc_stderr;
+
+FILE *__fc_stdin;
+
+FILE *__fc_stdout;
+
+/*@ requires valid_filename: valid_read_string(filename);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: *(filename + (0 .. strlen{Old}(filename))));
+ */
+extern int remove(char const *filename);
+
+/*@ requires valid_old_name: valid_read_string(old_name);
+    requires valid_new_name: valid_read_string(new_name);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: *(old_name + (0 .. strlen{Old}(old_name)))),
+            (indirect: *(new_name + (0 .. strlen{Old}(new_name))));
+ */
+extern int rename(char const *old_name, char const *new_name);
+
+FILE __fc_fopen[16];
+FILE * const __fc_p_fopen = __fc_fopen;
+/*@ ensures
+      result_null_or_valid_fd:
+        \result ≡ \null ∨ \subset(\result, &__fc_fopen[0 .. 16 - 1]);
+    assigns \result;
+    assigns \result \from __fc_p_fopen;
+ */
+extern FILE *tmpfile(void);
+
+char __fc_tmpnam[2048];
+char * const __fc_p_tmpnam = __fc_tmpnam;
+/*@ requires valid_s_or_null: s ≡ \null ∨ \valid(s + (0 .. 2048));
+    ensures
+      result_string_or_null:
+        \result ≡ \null ∨ \result ≡ \old(s) ∨
+        \result ≡ __fc_p_tmpnam;
+    assigns *(__fc_p_tmpnam + (0 .. 2048)), *(s + (0 .. 2048)), \result;
+    assigns *(__fc_p_tmpnam + (0 .. 2048))
+      \from *(__fc_p_tmpnam + (0 .. 2048)), (indirect: s);
+    assigns *(s + (0 .. 2048))
+      \from (indirect: s), *(__fc_p_tmpnam + (0 .. 2048));
+    assigns \result \from s, __fc_p_tmpnam;
+ */
+extern char *tmpnam(char *s);
+
+/*@ requires valid_stream: \valid(stream);
+    ensures result_zero_or_EOF: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: stream), (indirect: *stream);
+ */
+extern int fclose(FILE *stream);
+
+/*@ requires null_or_valid_stream: stream ≡ \null ∨ \valid_read(stream);
+    ensures result_zero_or_EOF: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, *stream, __fc_fopen[0 .. 16 - 1];
+    assigns \result
+      \from (indirect: *stream), (indirect: __fc_fopen[0 .. 16 - 1]);
+    assigns *stream
+      \from (indirect: stream), *stream, __fc_fopen[0 .. 16 - 1];
+    assigns __fc_fopen[0 .. 16 - 1]
+      \from (indirect: stream), *stream, __fc_fopen[0 .. 16 - 1];
+    
+    behavior flush_all:
+      assumes all_streams: stream ≡ \null;
+      assigns __fc_fopen[0 .. 16 - 1], \result;
+      assigns __fc_fopen[0 .. 16 - 1] \from __fc_fopen[0 .. 16 - 1];
+      assigns \result \from (indirect: __fc_fopen[0 .. 16 - 1]);
+    
+    behavior flush_stream:
+      assumes single_stream: stream ≢ \null;
+      assigns *stream, \result;
+      assigns *stream \from *stream;
+      assigns \result \from (indirect: *stream);
+    
+    complete behaviors flush_stream, flush_all;
+    disjoint behaviors flush_stream, flush_all;
+ */
+extern int fflush(FILE *stream);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    requires valid_mode: valid_read_string(mode);
+    ensures
+      result_null_or_valid_fd:
+        \result ≡ \null ∨ \subset(\result, &__fc_fopen[0 .. 16 - 1]);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(filename + (0 .. strlen{Old}(filename)))),
+            (indirect: *(mode + (0 .. strlen{Old}(mode)))), __fc_p_fopen;
+ */
+extern FILE *fopen(char const * __restrict filename,
+                   char const * __restrict mode);
+
+/*@ requires valid_mode: valid_read_string(mode);
+    ensures
+      result_null_or_valid_fd:
+        \result ≡ \null ∨ \subset(\result, &__fc_fopen[0 .. 16 - 1]);
+    assigns \result, __fc_fopen[fd];
+    assigns \result
+      \from (indirect: fd), (indirect: *(mode + (0 .. strlen{Old}(mode)))),
+            (indirect: __fc_fopen[fd]), __fc_p_fopen;
+    assigns __fc_fopen[fd]
+      \from (indirect: fd), (indirect: *(mode + (0 .. strlen{Old}(mode)))),
+            (indirect: __fc_fopen[fd]), __fc_p_fopen;
+ */
+extern FILE *fdopen(int fd, char const *mode);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    requires valid_mode: valid_read_string(mode);
+    requires valid_stream: \valid(stream);
+    ensures
+      result_null_or_valid_fd:
+        \result ≡ \null ∨ \result ∈ &__fc_fopen[0 .. 16 - 1];
+    ensures stream_opened: *\old(stream) ∈ __fc_fopen[0 .. 16 - 1];
+    assigns \result, *stream;
+    assigns \result
+      \from (indirect: *(filename + (..))), (indirect: *(mode + (..))),
+            __fc_p_fopen, (indirect: stream);
+    assigns *stream
+      \from (indirect: *(filename + (..))), (indirect: *(mode + (..))),
+            __fc_p_fopen, (indirect: stream);
+ */
+extern FILE *freopen(char const * __restrict filename,
+                     char const * __restrict mode, FILE * __restrict stream);
+
+/*@ assigns *stream;
+    assigns *stream \from buf; */
+extern void setbuf(FILE * __restrict stream, char * __restrict buf);
+
+/*@ assigns *stream;
+    assigns *stream \from buf, mode, size; */
+extern int setvbuf(FILE * __restrict stream, char * __restrict buf, int mode,
+                   size_t size);
+
+/*@ axiomatic format_length {
+      logic ℤ format_length{L}(char *format) ;
+      
+      }
+
+*/
+/*@ assigns *stream;
+    assigns *stream \from *(format + (..)), arg; */
+extern int vfprintf(FILE * __restrict stream, char const * __restrict format,
+                    va_list arg);
+
+/*@ assigns *stream;
+    assigns *stream \from *(format + (..)), *stream; */
+extern int vfscanf(FILE * __restrict stream, char const * __restrict format,
+                   va_list arg);
+
+/*@ assigns *__fc_stdout;
+    assigns *__fc_stdout \from arg; */
+extern int vprintf(char const * __restrict format, va_list arg);
+
+/*@ assigns *__fc_stdin;
+    assigns *__fc_stdin \from *(format + (..)); */
+extern int vscanf(char const * __restrict format, va_list arg);
+
+/*@ assigns *(s + (0 .. n - 1));
+    assigns *(s + (0 .. n - 1)) \from *(format + (..)), arg;
+ */
+extern int vsnprintf(char * __restrict s, size_t n,
+                     char const * __restrict format, va_list arg);
+
+/*@ assigns *(s + (0 ..));
+    assigns *(s + (0 ..)) \from *(format + (..)), arg;
+ */
+extern int vsprintf(char * __restrict s, char const * __restrict format,
+                    va_list arg);
+
+/*@ requires valid_stream: \valid(stream);
+    ensures result_uchar_or_eof: (0 ≤ \result ≤ 255) ∨ \result ≡ -1;
+    assigns *stream, \result;
+    assigns *stream \from *stream;
+    assigns \result \from (indirect: *stream);
+ */
+extern int fgetc(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    requires room_s: \valid(s + (0 .. size - 1));
+    ensures result_null_or_same: \result ≡ \null ∨ \result ≡ \old(s);
+    ensures
+      initialization: at_least_one:
+        \result ≢ \null ⇒ \initialized(\old(s) + 0);
+    ensures
+      terminated_string_on_success:
+        \result ≢ \null ⇒ valid_string(\old(s));
+    assigns *(s + (0 .. size - 1)), \result;
+    assigns *(s + (0 .. size - 1))
+      \from (indirect: size), (indirect: *stream);
+    assigns \result \from s, (indirect: size), (indirect: *stream);
+ */
+extern char *fgets(char * __restrict s, int size, FILE * __restrict stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns *stream, \result;
+    assigns *stream \from c, *stream;
+    assigns \result \from (indirect: *stream);
+ */
+extern int fputc(int c, FILE *stream);
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns *stream, \result;
+    assigns *stream \from *(s + (0 .. strlen{Old}(s))), *stream;
+    assigns \result
+      \from (indirect: *(s + (0 .. strlen{Old}(s)))), (indirect: *stream);
+ */
+extern int fputs(char const * __restrict s, FILE * __restrict stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result, *stream;
+    assigns \result \from *stream;
+    assigns *stream \from *stream;
+ */
+extern int getc(FILE *stream);
+
+/*@ assigns \result, *__fc_stdin;
+    assigns \result \from *__fc_stdin;
+    assigns *__fc_stdin \from *__fc_stdin;
+ */
+extern int getchar(void);
+
+/*@ axiomatic GetsLength {
+      logic size_t gets_length{L}
+        reads *__fc_stdin;
+      
+      }
+
+*/
+/*@ requires room_s: \valid(s + (0 .. gets_length));
+    ensures result_null_or_same: \result ≡ \old(s) ∨ \result ≡ \null;
+    assigns *(s + (0 .. gets_length{Old})), \result, *__fc_stdin;
+    assigns *(s + (0 .. gets_length{Old})) \from *__fc_stdin;
+    assigns \result \from s, *__fc_stdin;
+    assigns *__fc_stdin \from *__fc_stdin;
+ */
+extern char *gets(char *s);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns *stream, \result;
+    assigns *stream \from c, *stream;
+    assigns \result \from (indirect: *stream);
+ */
+extern int putc(int c, FILE *stream);
+
+/*@ assigns *__fc_stdout, \result;
+    assigns *__fc_stdout \from c, *__fc_stdout;
+    assigns \result \from (indirect: *__fc_stdout);
+ */
+extern int putchar(int c);
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns *__fc_stdout, \result;
+    assigns *__fc_stdout \from *(s + (0 .. strlen{Old}(s))), *__fc_stdout;
+    assigns \result
+      \from (indirect: *(s + (0 .. strlen{Old}(s)))),
+            (indirect: *__fc_stdout);
+ */
+extern int puts(char const *s);
+
+/*@ requires valid_stream: \valid(stream);
+    ensures result_ok_or_error: \result ≡ \old(c) ∨ \result ≡ -1;
+    assigns *stream, \result;
+    assigns *stream \from (indirect: c);
+    assigns \result \from (indirect: c), (indirect: *stream);
+ */
+extern int ungetc(int c, FILE *stream);
+
+/*@ requires valid_ptr_block: \valid((char *)ptr + (0 .. nmemb * size - 1));
+    requires valid_stream: \valid(stream);
+    ensures size_read: \result ≤ \old(nmemb);
+    ensures
+      initialization:
+        \initialized((char *)\old(ptr) + (0 .. \result * \old(size) - 1));
+    assigns *((char *)ptr + (0 .. nmemb * size - 1)), *stream, \result;
+    assigns *((char *)ptr + (0 .. nmemb * size - 1))
+      \from (indirect: size), (indirect: nmemb), (indirect: *stream);
+    assigns *stream
+      \from (indirect: size), (indirect: nmemb), (indirect: *stream);
+    assigns \result \from size, (indirect: *stream);
+ */
+extern size_t fread(void * __restrict ptr, size_t size, size_t nmemb,
+                    FILE * __restrict stream);
+
+/*@ requires
+      valid_ptr_block: \valid_read((char *)ptr + (0 .. nmemb * size - 1));
+    requires valid_stream: \valid(stream);
+    ensures size_written: \result ≤ \old(nmemb);
+    assigns *stream, \result;
+    assigns *stream
+      \from (indirect: *((char *)ptr + (0 .. nmemb * size - 1)));
+    assigns \result
+      \from (indirect: *((char *)ptr + (0 .. nmemb * size - 1)));
+ */
+extern size_t fwrite(void const * __restrict ptr, size_t size, size_t nmemb,
+                     FILE * __restrict stream);
+
+/*@ requires valid_stream: \valid(stream);
+    requires valid_pos: \valid(pos);
+    requires initialization: pos: \initialized(pos);
+    assigns *pos, \result;
+    assigns *pos \from (indirect: *stream);
+    assigns \result \from (indirect: *stream);
+ */
+extern int fgetpos(FILE * __restrict stream, fpos_t * __restrict pos);
+
+/*@ requires valid_stream: \valid(stream);
+    requires whence_enum: whence ≡ 0 ∨ whence ≡ 1 ∨ whence ≡ 2;
+    assigns *stream, \result, __fc_errno;
+    assigns *stream \from *stream, (indirect: offset), (indirect: whence);
+    assigns \result
+      \from (indirect: *stream), (indirect: offset), (indirect: whence);
+    assigns __fc_errno
+      \from (indirect: *stream), (indirect: offset), (indirect: whence);
+ */
+extern int fseek(FILE *stream, long offset, int whence);
+
+/*@ requires valid_stream: \valid(stream);
+    requires whence_enum: whence ≡ 0 ∨ whence ≡ 1 ∨ whence ≡ 2;
+    assigns *stream, \result, __fc_errno;
+    assigns *stream \from *stream, (indirect: offset), (indirect: whence);
+    assigns \result
+      \from (indirect: *stream), (indirect: offset), (indirect: whence);
+    assigns __fc_errno
+      \from (indirect: *stream), (indirect: offset), (indirect: whence);
+ */
+extern int fseeko(FILE *stream, off_t offset, int whence);
+
+/*@ requires valid_stream: \valid(stream);
+    requires valid_pos: \valid_read(pos);
+    requires initialization: pos: \initialized(pos);
+    assigns *stream;
+    assigns *stream \from *pos;
+ */
+extern int fsetpos(FILE *stream, fpos_t const *pos);
+
+/*@ requires valid_stream: \valid(stream);
+    ensures
+      success_or_error:
+        \result ≡ -1 ∨
+        (\result ≥ 0 ∧ __fc_errno ≡ \old(__fc_errno));
+    assigns \result, __fc_errno;
+    assigns \result \from (indirect: *stream);
+    assigns __fc_errno \from (indirect: *stream);
+ */
+extern long ftell(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    ensures
+      success_or_error:
+        \result ≡ -1 ∨
+        (\result ≥ 0 ∧ __fc_errno ≡ \old(__fc_errno));
+    assigns \result, __fc_errno;
+    assigns \result \from (indirect: *stream);
+    assigns __fc_errno \from (indirect: *stream);
+ */
+extern off_t ftello(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns *stream;
+    assigns *stream \from \nothing;
+ */
+extern void rewind(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns *stream;
+    assigns *stream \from \nothing;
+ */
+extern void clearerr(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result;
+    assigns \result \from (indirect: *stream);
+ */
+extern int feof(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result;
+    assigns \result \from (indirect: *stream);
+ */
+extern int fileno(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns *stream;
+    assigns *stream \from \nothing;
+ */
+extern void flockfile(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns *stream;
+    assigns *stream \from \nothing;
+ */
+extern void funlockfile(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result, *stream;
+    assigns \result \from \nothing;
+    assigns *stream \from \nothing;
+ */
+extern int ftrylockfile(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result;
+    assigns \result \from (indirect: *stream);
+ */
+extern int ferror(FILE *stream);
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns __fc_stdout;
+    assigns __fc_stdout \from __fc_errno, *(s + (0 .. strlen{Old}(s)));
+ */
+extern void perror(char const *s);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result, *stream;
+    assigns \result \from *stream;
+    assigns *stream \from *stream;
+ */
+extern int getc_unlocked(FILE *stream);
+
+/*@ assigns \result;
+    assigns \result \from *__fc_stdin; */
+extern int getchar_unlocked(void);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns *stream, \result;
+    assigns *stream \from c;
+    assigns \result \from (indirect: *stream);
+ */
+extern int putc_unlocked(int c, FILE *stream);
+
+/*@ assigns *__fc_stdout, \result;
+    assigns *__fc_stdout \from c;
+    assigns \result \from (indirect: *__fc_stdout);
+ */
+extern int putchar_unlocked(int c);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns *stream;
+    assigns *stream \from \nothing;
+ */
+extern void clearerr_unlocked(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result;
+    assigns \result \from (indirect: *stream);
+ */
+extern int feof_unlocked(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result;
+    assigns \result \from (indirect: *stream);
+ */
+extern int ferror_unlocked(FILE *stream);
+
+/*@ requires valid_stream: \valid(stream);
+    assigns \result;
+    assigns \result \from (indirect: *stream);
+ */
+extern int fileno_unlocked(FILE *stream);
+
+/*@ axiomatic pipe_streams {
+      predicate is_open_pipe{L}(FILE *stream) ;
+      
+      }
+
+*/
+/*@ requires valid_command: valid_read_string(command);
+    requires valid_type: valid_read_string(type);
+    ensures
+      result_error_or_valid_open_pipe:
+        \result ≡ \null ∨
+        (\subset(\result, &__fc_fopen[0 .. 16 - 1]) ∧ is_open_pipe(\result));
+    assigns \result, __fc_fopen[0 ..];
+    assigns \result
+      \from (indirect: *command), (indirect: *type), __fc_p_fopen;
+    assigns __fc_fopen[0 ..]
+      \from (indirect: *command), (indirect: *type), __fc_fopen[0 ..];
+ */
+extern FILE *popen(char const *command, char const *type);
+
+/*@ requires valid_stream: \valid(stream);
+    requires open_pipe: is_open_pipe(stream);
+    ensures closed_stream: ¬is_open_pipe(\old(stream));
+    assigns \result;
+    assigns \result \from (indirect: *stream);
+ */
+extern int pclose(FILE *stream);
+
+ssize_t getline(char **lineptr, size_t *n, FILE *stream);
+
+/*@ assigns \result;
+    assigns \result \from maj, min; */
+extern dev_t makedev(int maj, int min);
+
+FILE __fc_initial_stdout =
+  {.__fc_FILE_id = (unsigned int)1, .__fc_FILE_data = 0U};
+FILE *__fc_stdout = & __fc_initial_stdout;
+FILE __fc_initial_stderr =
+  {.__fc_FILE_id = (unsigned int)2, .__fc_FILE_data = 0U};
+FILE *__fc_stderr = & __fc_initial_stderr;
+FILE __fc_initial_stdin =
+  {.__fc_FILE_id = (unsigned int)0, .__fc_FILE_data = 0U};
+FILE *__fc_stdin = & __fc_initial_stdin;
+ssize_t getline(char **lineptr, size_t *n, FILE *stream)
+{
+  ssize_t __retres;
+  int tmp;
+  if (! lineptr) goto _LOR;
+  else 
+    if (! n) goto _LOR;
+    else 
+      if (! stream) {
+        _LOR: {
+                __fc_errno = 22;
+                __retres = -1;
+                goto return_label;
+              }
+      }
+  tmp = ferror(stream);
+  if (tmp) goto _LOR_0;
+  else {
+    int tmp_0;
+    tmp_0 = feof(stream);
+    if (tmp_0) {
+      _LOR_0: {
+                __retres = -1;
+                goto return_label;
+              }
+    }
+  }
+  if (! *lineptr) goto _LOR_1;
+  else 
+    if (*n == (size_t)0) {
+      _LOR_1:
+      {
+        *lineptr = (char *)malloc((unsigned int)2);
+        if (! lineptr) {
+          __fc_errno = 12;
+          __retres = -1;
+          goto return_label;
+        }
+        *n = (unsigned int)2;
+      }
+    }
+  size_t cur = (unsigned int)0;
+  while (1) {
+    int tmp_3;
+    tmp_3 = ferror(stream);
+    if (tmp_3) break;
+    else {
+      int tmp_4;
+      tmp_4 = feof(stream);
+      if (tmp_4) break;
+    }
+    {
+      while (cur < *n - (size_t)1) {
+        int tmp_1;
+        tmp_1 = fgetc(stream);
+        char c = (char)tmp_1;
+        if ((int)c == -1) 
+          if (cur == (size_t)0) {
+            __retres = -1;
+            goto return_label;
+          }
+        if ((int)c != -1) {
+          size_t tmp_2;
+          tmp_2 = cur;
+          cur += (size_t)1;
+          *(*lineptr + tmp_2) = c;
+        }
+        if ((int)c == '\n') goto _LOR_2;
+        else 
+          if ((int)c == -1) {
+            _LOR_2:
+            {
+              *(*lineptr + cur) = (char)'\000';
+              __retres = (int)cur;
+              goto return_label;
+            }
+          }
+      }
+      if (*n == (size_t)2147483647) {
+        __fc_errno = 75;
+        __retres = -1;
+        goto return_label;
+      }
+      size_t new_size = *n + (size_t)1;
+      *lineptr = (char *)realloc((void *)*lineptr,new_size);
+      if (! *lineptr) {
+        __fc_errno = 12;
+        __retres = -1;
+        goto return_label;
+      }
+      *n = new_size;
+    }
+  }
+  __retres = -1;
+  return_label: return __retres;
+}
+
+/*@ requires abs_representable: i > -2147483647 - 1;
+    assigns \result;
+    assigns \result \from i;
+    
+    behavior negative:
+      assumes negative: i < 0;
+      ensures opposite_result: \result ≡ -\old(i);
+    
+    behavior nonnegative:
+      assumes nonnegative: i ≥ 0;
+      ensures same_result: \result ≡ \old(i);
+    
+    complete behaviors nonnegative, negative;
+    disjoint behaviors nonnegative, negative;
+ */
+int abs(int i)
+{
+  int __retres;
+  if (i < 0) {
+    __retres = - i;
+    goto return_label;
+  }
+  __retres = i;
+  return_label: return __retres;
+}
+
+/*@ requires valid_nptr: \valid_read(p);
+    assigns \result;
+    assigns \result \from (indirect: p), (indirect: *(p + (0 ..)));
+ */
+int atoi(char const *p)
+{
+  int __retres;
+  int n;
+  int c;
+  int tmp_1;
+  int tmp_3;
+  int neg = 0;
+  unsigned char *up = (unsigned char *)p;
+  c = (int)*up;
+  tmp_1 = isdigit(c);
+  if (! tmp_1) {
+    int tmp_0;
+    while (1) {
+      int tmp;
+      tmp = isspace(c);
+      if (! tmp) break;
+      up ++;
+      c = (int)*up;
+    }
+    switch (c) {
+      case '-': neg ++;
+      case '+': { /* sequence */
+                  up ++;
+                  c = (int)*up;
+                }
+    }
+    tmp_0 = isdigit(c);
+    if (! tmp_0) {
+      __retres = 0;
+      goto return_label;
+    }
+  }
+  n = '0' - c;
+  while (1) {
+    int tmp_2;
+    up ++;
+    c = (int)*up;
+    tmp_2 = isdigit(c);
+    if (! tmp_2) break;
+    n *= 10;
+    n += '0' - c;
+  }
+  if (neg) tmp_3 = n; else tmp_3 = - n;
+  __retres = tmp_3;
+  return_label: return __retres;
+}
+
+/*@ assigns __fc_heap_status, \result;
+    assigns __fc_heap_status
+      \from (indirect: nmemb), (indirect: size), __fc_heap_status;
+    assigns \result
+      \from (indirect: nmemb), (indirect: size), (indirect: __fc_heap_status);
+    allocates \result;
+    
+    behavior allocation:
+      assumes can_allocate: is_allocable(nmemb * size);
+      ensures
+        allocation: \fresh{Old, Here}(\result,\old(nmemb) * \old(size));
+      ensures
+        initialization:
+          \initialized((char *)\result + (0 .. \old(nmemb) * \old(size) - 1));
+      ensures
+        zero_initialization:
+          \subset(*((char *)\result + (0 .. \old(nmemb) * \old(size) - 1)),
+                 {0});
+    
+    behavior no_allocation:
+      assumes cannot_allocate: ¬is_allocable(nmemb * size);
+      ensures null_result: \result ≡ \null;
+      assigns \result;
+      assigns \result \from \nothing;
+      allocates \nothing;
+    
+    complete behaviors no_allocation, allocation;
+    disjoint behaviors no_allocation, allocation;
+ */
+void *calloc(size_t nmemb, size_t size)
+{
+  void *__retres;
+  size_t l = nmemb * size;
+  if (size != (size_t)0) 
+    if (l / size != nmemb) {
+      __retres = (void *)0;
+      goto return_label;
+    }
+  char *p = malloc(l);
+  if (p) memset((void *)p,0,l);
+  __retres = (void *)p;
+  return_label: return __retres;
+}
+
+static char __fc_env_strings[64];
+static char __fc_initenv_init;
+static void __fc_initenv(void)
+{
+  if (! __fc_initenv_init) {
+    Frama_C_make_unknown(__fc_env_strings,(unsigned int)(64 - 1));
+    {
+      int i = 0;
+      while (i < 4096) {
+        {
+          int tmp;
+          tmp = Frama_C_interval(0,64 - 1);
+          __fc_env[i] = & __fc_env_strings[tmp];
+        }
+        i ++;
+      }
+    }
+    __fc_initenv_init = (char)1;
+  }
+  return;
+}
+
+/*@ requires valid_name: valid_read_string(name);
+    ensures null_or_valid_result: \result ≡ \null ∨ \valid(\result);
+    assigns \result;
+    assigns \result \from __fc_env[0 ..], (indirect: name), *(name + (0 ..));
+ */
+char *getenv(char const *name)
+{
+  char *__retres;
+  int tmp_0;
+  /*@ assert ¬(strchr(name, '=') ≡ \true); */ ;
+  __fc_initenv();
+  tmp_0 = Frama_C_nondet(0,1);
+  if (tmp_0) {
+    int tmp;
+    tmp = Frama_C_interval(0,4096 - 1);
+    ;
+    __retres = __fc_env[tmp];
+    goto return_label;
+  }
+  else {
+    __retres = (char *)0;
+    goto return_label;
+  }
+  return_label: return __retres;
+}
+
+/*@ requires valid_string: valid_read_string(string);
+    assigns __fc_env[0 ..], \result;
+    assigns __fc_env[0 ..] \from __fc_env[0 ..], string;
+    assigns \result \from (indirect: __fc_env[0 ..]), (indirect: string);
+ */
+int putenv(char *string)
+{
+  int __retres;
+  int tmp_3;
+  char *separator = strchr((char const *)string,'=');
+  /*@ assert string_contains_separator: separator ≢ \null; */ ;
+  /*@ assert name_is_not_empty: separator ≢ string; */ ;
+  __fc_initenv();
+  tmp_3 = Frama_C_nondet(0,1);
+  if (tmp_3) {
+    int tmp_1;
+    int tmp_2;
+    tmp_1 = Frama_C_nondet(0,1);
+    if (tmp_1) {
+      int tmp_0;
+      tmp_0 = Frama_C_interval(-2147483647 - 1,2147483647);
+      __retres = tmp_0;
+      goto return_label;
+    }
+    tmp_2 = Frama_C_interval(0,4096 - 1);
+    __fc_env[tmp_2] = string;
+  }
+  __retres = 0;
+  return_label: return __retres;
+}
+
+/*@ requires valid_name: valid_read_string(name);
+    requires valid_value: valid_read_string(value);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, __fc_env[0 ..];
+    assigns \result
+      \from __fc_env[0 ..], (indirect: name), (indirect: *(name + (0 ..))),
+            (indirect: value), (indirect: *(value + (0 ..))),
+            (indirect: overwrite);
+    assigns __fc_env[0 ..]
+      \from __fc_env[0 ..], (indirect: name), (indirect: *(name + (0 ..))),
+            (indirect: value), (indirect: *(value + (0 ..))),
+            (indirect: overwrite);
+ */
+int setenv(char const *name, char const *value, int overwrite)
+{
+  int __retres;
+  char *tmp;
+  int tmp_4;
+  tmp = strchr(name,'=');
+  if (tmp) {
+    __retres = -1;
+    goto return_label;
+  }
+  size_t namelen = strlen(name);
+  if (namelen == (size_t)0) {
+    __retres = -1;
+    goto return_label;
+  }
+  __fc_initenv();
+  tmp_4 = Frama_C_nondet(0,1);
+  if (tmp_4) {
+    __retres = -1;
+    goto return_label;
+  }
+  else {
+    int tmp_1;
+    int tmp_2;
+    int tmp_3;
+    tmp_1 = Frama_C_nondet(0,1);
+    if (tmp_1) Frama_C_make_unknown(__fc_env_strings,(unsigned int)(64 - 1));
+    tmp_2 = Frama_C_interval(0,4096 - 1);
+    tmp_3 = Frama_C_interval(0,64 - 1);
+    __fc_env[tmp_2] = & __fc_env_strings[tmp_3];
+    __retres = 0;
+    goto return_label;
+  }
+  return_label: return __retres;
+}
+
+/*@ requires valid_name: valid_read_string(name);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, __fc_env[0 ..];
+    assigns \result
+      \from __fc_env[0 ..], (indirect: name), (indirect: *(name + (0 ..)));
+    assigns __fc_env[0 ..]
+      \from __fc_env[0 ..], (indirect: name), (indirect: *(name + (0 ..)));
+ */
+int unsetenv(char const *name)
+{
+  int __retres;
+  char *tmp;
+  int tmp_2;
+  tmp = strchr(name,'=');
+  if (tmp) {
+    __retres = -1;
+    goto return_label;
+  }
+  size_t namelen = strlen(name);
+  if (namelen == (size_t)0) {
+    __retres = -1;
+    goto return_label;
+  }
+  __fc_initenv();
+  tmp_2 = Frama_C_nondet(0,1);
+  if (tmp_2) {
+    int tmp_1;
+    tmp_1 = Frama_C_interval(0,4096 - 1);
+    __fc_env[tmp_1] = (char *)0;
+  }
+  __retres = 0;
+  return_label: return __retres;
+}
+
+/*@ requires valid_memptr: \valid(memptr);
+    requires
+      alignment_is_a_suitable_power_of_two:
+        alignment ≥ sizeof(void *) ∧
+        ((size_t)alignment & ((size_t)alignment - 1)) ≡ 0;
+    assigns __fc_heap_status, \result;
+    assigns __fc_heap_status
+      \from (indirect: alignment), size, __fc_heap_status;
+    assigns \result
+      \from (indirect: alignment), (indirect: size),
+            (indirect: __fc_heap_status);
+    allocates *\old(memptr);
+    
+    behavior allocation:
+      assumes can_allocate: is_allocable(size);
+      ensures allocation: \fresh{Old, Here}(*\old(memptr),\old(size));
+      ensures result_zero: \result ≡ 0;
+      assigns __fc_heap_status, \result;
+      assigns __fc_heap_status
+        \from (indirect: alignment), size, __fc_heap_status;
+      assigns \result
+        \from (indirect: alignment), (indirect: size),
+              (indirect: __fc_heap_status);
+    
+    behavior no_allocation:
+      assumes cannot_allocate: ¬is_allocable(size);
+      ensures result_non_zero: \result < 0 ∨ \result > 0;
+      assigns \result;
+      assigns \result \from (indirect: alignment);
+      allocates \nothing;
+    
+    complete behaviors no_allocation, allocation;
+    disjoint behaviors no_allocation, allocation;
+ */
+int posix_memalign(void **memptr, size_t alignment, size_t size)
+{
+  int __retres;
+  /*@
+  assert
+  alignment_is_a_suitable_power_of_two:
+    alignment ≥ sizeof(void *) ∧
+    ((size_t)alignment & ((size_t)alignment - 1)) ≡ 0;
+   */
+  ;
+  *memptr = malloc(size);
+  if (! *memptr) {
+    __retres = 12;
+    goto return_label;
+  }
+  __retres = 0;
+  return_label: return __retres;
+}
+
+char *realpath(char const * __restrict file_name,
+               char * __restrict resolved_name)
+{
+  char *__retres;
+  int tmp;
+  if (! file_name) {
+    __fc_errno = 22;
+    __retres = (char *)0;
+    goto return_label;
+  }
+  tmp = Frama_C_interval(0,6);
+  switch (tmp) {
+    case 0: __fc_errno = 13;
+    __retres = (char *)0;
+    goto return_label;
+    case 1: __fc_errno = 5;
+    __retres = (char *)0;
+    goto return_label;
+    case 2: __fc_errno = 40;
+    __retres = (char *)0;
+    goto return_label;
+    case 3: __fc_errno = 36;
+    __retres = (char *)0;
+    goto return_label;
+    case 4: __fc_errno = 2;
+    __retres = (char *)0;
+    goto return_label;
+    case 5: __fc_errno = 20;
+    __retres = (char *)0;
+    goto return_label;
+    default: break;
+  }
+  int realpath_len = Frama_C_interval(1,256);
+  if (! resolved_name) {
+    resolved_name = (char *)malloc((unsigned int)256);
+    if (! resolved_name) {
+      __fc_errno = 12;
+      __retres = (char *)0;
+      goto return_label;
+    }
+  }
+  Frama_C_make_unknown(resolved_name,(unsigned int)realpath_len);
+  *(resolved_name + (realpath_len - 1)) = (char)'\000';
+  __retres = resolved_name;
+  return_label: return __retres;
+}
+
+/*@ requires valid_dest: valid_or_empty(dest, n);
+    requires valid_src: valid_read_or_empty(src, n);
+    requires
+      separation:
+        \separated((char *)dest + (0 .. n - 1), (char *)src + (0 .. n - 1));
+    ensures
+      copied_contents:
+        memcmp{Post, Pre}((char *)\old(dest), (char *)\old(src), \old(n)) ≡
+        0;
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *((char *)dest + (0 .. n - 1)), \result;
+    assigns *((char *)dest + (0 .. n - 1))
+      \from *((char *)src + (0 .. n - 1));
+    assigns \result \from dest;
+ */
+void *memcpy(void * __restrict dest, void const * __restrict src, size_t n)
+{
+  {
+    size_t i = (unsigned int)0;
+    /*@ loop invariant no_eva: 0 ≤ i ≤ n;
+        loop invariant
+          no_eva:
+            ∀ ℤ k;
+              0 ≤ k < i ⇒ *((char *)dest + k) ≡ *((char *)src + k);
+        loop assigns i, *((char *)dest + (0 .. n - 1));
+        loop variant n - i;
+    */
+    while (i < n) {
+      *((char *)dest + i) = *((char *)src + i);
+      i += (size_t)1;
+    }
+  }
+  return dest;
+}
+
+/*@ assigns \result;
+    assigns \result \from (indirect: p), (indirect: q), (indirect: n);
+    
+    behavior separated:
+      assumes
+        separation: no_overlap:
+          \separated(p + (0 .. n - 1), q + (0 .. n - 1));
+      ensures result_no_overlap: \result ≡ 0;
+    
+    behavior not_separated_lt:
+      assumes
+        separation: overlap: ¬\separated(p + (0 .. n - 1), q + (0 .. n - 1));
+      assumes p_before_q: p ≤ q < p + n;
+      ensures result_p_before_q: \result ≡ -1;
+    
+    behavior not_separated_gt:
+      assumes
+        separation: overlap: ¬\separated(p + (0 .. n - 1), q + (0 .. n - 1));
+      assumes p_after_q: q < p ≤ q + n;
+      ensures result_p_after_q: \result ≡ 1;
+    
+    complete behaviors not_separated_gt, not_separated_lt, separated;
+    disjoint behaviors not_separated_gt, not_separated_lt, separated;
+ */
+static int memoverlap(char const *p, char const *q, size_t n)
+{
+  int __retres;
+  uintptr_t p1 = (unsigned int)p;
+  uintptr_t p2 = (unsigned int)(p + n);
+  uintptr_t q1 = (unsigned int)q;
+  uintptr_t q2 = (unsigned int)(q + n);
+  if (p1 <= q1) {
+    if (p2 > q1) {
+      __retres = -1;
+      goto return_label;
+    }
+    else goto _LAND;
+  }
+  else {
+    _LAND: ;
+    if (q1 <= p1) 
+      if (q2 > p1) {
+        __retres = 1;
+        goto return_label;
+      }
+      else {
+        __retres = 0;
+        goto return_label;
+      }
+    else {
+      __retres = 0;
+      goto return_label;
+    }
+  }
+  return_label: return __retres;
+}
+
+/*@ requires valid_dest: valid_or_empty(dest, n);
+    requires valid_src: valid_read_or_empty(src, n);
+    ensures
+      copied_contents:
+        memcmp{Post, Pre}((char *)\old(dest), (char *)\old(src), \old(n)) ≡
+        0;
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *((char *)dest + (0 .. n - 1)), \result;
+    assigns *((char *)dest + (0 .. n - 1))
+      \from *((char *)src + (0 .. n - 1));
+    assigns \result \from dest;
+ */
+void *memmove(void *dest, void const *src, size_t n)
+{
+  void *__retres;
+  int tmp;
+  if (n == (size_t)0) {
+    __retres = dest;
+    goto return_label;
+  }
+  char *s = (char *)src;
+  char *d = (char *)dest;
+  tmp = memoverlap((char const *)dest,(char const *)src,n);
+  if (tmp <= 0) {
+    size_t i = (unsigned int)0;
+    /*@ loop invariant no_eva: 0 ≤ i ≤ n;
+        loop invariant
+          no_eva:
+            ∀ ℤ k;
+              0 ≤ k < i ⇒
+              *((char *)dest + k) ≡ \at(*((char *)src + k),LoopEntry);
+        loop invariant
+          no_eva:
+            ∀ ℤ k;
+              i ≤ k < n ⇒
+              *((char *)src + k) ≡ \at(*((char *)src + k),LoopEntry);
+        loop assigns i, *((char *)dest + (0 .. n - 1));
+        loop variant n - i;
+    */
+    while (i < n) {
+      *(d + i) = *(s + i);
+      i += (size_t)1;
+    }
+  }
+  else {
+    {
+      size_t i_0 = n - (size_t)1;
+      /*@ loop invariant no_eva: 0 ≤ i_0 < n;
+          loop invariant
+            no_eva:
+              ∀ ℤ k;
+                i_0 < k < n ⇒
+                *((char *)dest + k) ≡ \at(*((char *)src + k),LoopEntry);
+          loop invariant
+            no_eva:
+              ∀ ℤ k;
+                0 ≤ k ≤ i_0 ⇒
+                *((char *)src + k) ≡ \at(*((char *)src + k),LoopEntry);
+          loop assigns i_0, *((char *)dest + (0 .. n - 1));
+          loop variant i_0;
+      */
+      while (i_0 > (size_t)0) {
+        *(d + i_0) = *(s + i_0);
+        i_0 -= (size_t)1;
+      }
+    }
+    *(d + 0) = *(s + 0);
+  }
+  __retres = dest;
+  return_label: return __retres;
+}
+
+/*@ requires valid_string_s: valid_read_string(s);
+    ensures acsl_c_equiv: \result ≡ strlen(\old(s));
+    assigns \result;
+    assigns \result \from (indirect: *(s + (0 ..)));
+ */
+size_t strlen(char const *s)
+{
+  size_t i;
+  i = (unsigned int)0;
+  while ((int)*(s + i) != 0) i += (size_t)1;
+  return i;
+}
+
+/*@ requires valid_string_s: valid_read_nstring(s, maxlen);
+    ensures
+      result_bounded:
+        \result ≡ strlen(\old(s)) ∨ \result ≡ \old(maxlen);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s + (0 .. maxlen - 1))), (indirect: maxlen);
+ */
+size_t strnlen(char const *s, size_t maxlen)
+{
+  size_t i;
+  i = (unsigned int)0;
+  while (1) {
+    if (i < maxlen) {
+      if (! ((int)*(s + i) != 0)) break;
+    }
+    else break;
+    i += (size_t)1;
+  }
+  return i;
+}
+
+/*@ requires valid_s: valid_or_empty(s, n);
+    ensures
+      acsl_c_equiv: memset((char *)\old(s), \old(c), \old(n)) ≡ \true;
+    ensures result_ptr: \result ≡ \old(s);
+    assigns *((char *)s + (0 .. n - 1)), \result;
+    assigns *((char *)s + (0 .. n - 1)) \from c;
+    assigns \result \from s;
+ */
+void *memset(void *s, int c, size_t n)
+{
+  unsigned char *p = (unsigned char *)s;
+  {
+    size_t i = (unsigned int)0;
+    while (i < n) {
+      *(p + i) = (unsigned char)c;
+      i += (size_t)1;
+    }
+  }
+  return s;
+}
+
+/*@ requires valid_string_s1: valid_read_string(s1);
+    requires valid_string_s2: valid_read_string(s2);
+    ensures acsl_c_equiv: \result ≡ strcmp(\old(s1), \old(s2));
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s1 + (0 ..))), (indirect: *(s2 + (0 ..)));
+ */
+int strcmp(char const *s1, char const *s2)
+{
+  int __retres;
+  size_t i;
+  i = (unsigned int)0;
+  while ((int)*(s1 + i) == (int)*(s2 + i)) {
+    if ((int)*(s1 + i) == 0) {
+      __retres = 0;
+      goto return_label;
+    }
+    i += (size_t)1;
+  }
+  __retres = (int)*((unsigned char *)s1 + i) - (int)*((unsigned char *)s2 + i);
+  return_label: return __retres;
+}
+
+/*@ requires valid_string_s1: valid_read_nstring(s1, n);
+    requires valid_string_s2: valid_read_nstring(s2, n);
+    ensures acsl_c_equiv: \result ≡ strncmp(\old(s1), \old(s2), \old(n));
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s1 + (0 .. n - 1))),
+            (indirect: *(s2 + (0 .. n - 1))), (indirect: n);
+ */
+int strncmp(char const *s1, char const *s2, size_t n)
+{
+  int __retres;
+  {
+    size_t i = (unsigned int)0;
+    while (i < n) {
+      if ((int)*(s1 + i) != (int)*(s2 + i)) {
+        __retres = (int)*((unsigned char *)s1 + i) - (int)*((unsigned char *)s2 + i);
+        goto return_label;
+      }
+      if ((int)*(s1 + i) == 0) {
+        __retres = 0;
+        goto return_label;
+      }
+      i += (size_t)1;
+    }
+  }
+  __retres = 0;
+  return_label: return __retres;
+}
+
+/*@ requires valid_s1: valid_read_or_empty(s1, n);
+    requires valid_s2: valid_read_or_empty(s2, n);
+    requires initialization: s1: \initialized((char *)s1 + (0 .. n - 1));
+    requires initialization: s2: \initialized((char *)s2 + (0 .. n - 1));
+    requires danglingness: s1: non_escaping(s1, n);
+    requires danglingness: s2: non_escaping(s2, n);
+    ensures
+      logic_spec:
+        \result ≡
+        memcmp{Pre, Pre}((char *)\old(s1), (char *)\old(s2), \old(n));
+    assigns \result;
+    assigns \result
+      \from (indirect: *((char *)s1 + (0 .. n - 1))),
+            (indirect: *((char *)s2 + (0 .. n - 1)));
+ */
+int memcmp(void const *s1, void const *s2, size_t n)
+{
+  int __retres;
+  unsigned char const *p1;
+  unsigned char const *p2;
+  p1 = (unsigned char const *)s1;
+  p2 = (unsigned char const *)s2;
+  {
+    size_t i = (unsigned int)0;
+    while (i < n) {
+      if ((int)*(p1 + i) != (int)*(p2 + i)) {
+        __retres = (int)*(p1 + i) - (int)*(p2 + i);
+        goto return_label;
+      }
+      i += (size_t)1;
+    }
+  }
+  __retres = 0;
+  return_label: return __retres;
+}
+
+static int char_equal_ignore_case(char c1, char c2)
+{
+  int __retres;
+  if ((int)c1 >= 'A') 
+    if ((int)c1 <= 'Z') c1 = (char)((int)c1 - ('A' - 'a'));
+  if ((int)c2 >= 'A') 
+    if ((int)c2 <= 'Z') c2 = (char)((int)c2 - ('A' - 'a'));
+  if ((int)c1 == (int)c2) {
+    __retres = 0;
+    goto return_label;
+  }
+  else {
+    __retres = (int)((unsigned char)c2) - (int)((unsigned char)c1);
+    goto return_label;
+  }
+  return_label: return __retres;
+}
+
+/*@ requires valid_string_s1: valid_read_string(s1);
+    requires valid_string_s2: valid_read_string(s2);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s1 + (0 ..))), (indirect: *(s2 + (0 ..)));
+ */
+int strcasecmp(char const *s1, char const *s2)
+{
+  int __retres;
+  size_t i;
+  i = (unsigned int)0;
+  while (1) {
+    if ((int)*(s1 + i) != 0) {
+      if (! ((int)*(s2 + i) != 0)) break;
+    }
+    else break;
+    {
+      int res = char_equal_ignore_case(*(s1 + i),*(s2 + i));
+      if (res != 0) {
+        __retres = res;
+        goto return_label;
+      }
+    }
+    i += (size_t)1;
+  }
+  if ((int)*(s1 + i) == 0) {
+    if ((int)*(s2 + i) == 0) {
+      __retres = 0;
+      goto return_label;
+    }
+    else goto _LAND;
+  }
+  else {
+    _LAND: ;
+    if ((int)*(s1 + i) == 0) {
+      __retres = -1;
+      goto return_label;
+    }
+    else {
+      __retres = 1;
+      goto return_label;
+    }
+  }
+  return_label: return __retres;
+}
+
+/*@ requires valid_string_src: valid_read_string(src);
+    requires valid_string_dest: valid_string(dest);
+    requires room_string: \valid(dest + (0 .. strlen(dest) + strlen(src)));
+    ensures
+      sum_of_lengths: strlen(\old(dest)) ≡ \old(strlen(dest) + strlen(src));
+    ensures
+      initialization: dest:
+        \initialized(\old(dest) + (0 .. \old(strlen(dest) + strlen(src))));
+    ensures
+      dest_null_terminated:
+        *(\old(dest) + \old(strlen(dest) + strlen(src))) ≡ 0;
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *(dest +
+              (strlen{Old}(dest) .. strlen{Old}(dest) + strlen{Old}(src))),
+            \result;
+    assigns
+    *(dest + (strlen{Old}(dest) .. strlen{Old}(dest) + strlen{Old}(src)))
+      \from *(src + (0 .. strlen{Old}(src)));
+    assigns \result \from dest;
+ */
+char *strcat(char *dest, char const *src)
+{
+  size_t i;
+  size_t n = strlen((char const *)dest);
+  i = (unsigned int)0;
+  while ((int)*(src + i) != 0) {
+    *(dest + (n + i)) = *(src + i);
+    i += (size_t)1;
+  }
+  *(dest + (n + i)) = (char)0;
+  return dest;
+}
+
+/*@ requires valid_nstring_src: valid_read_nstring(src, n);
+    requires valid_string_dest: valid_string(dest);
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *(dest + (strlen{Old}(dest) .. strlen{Old}(dest) + n)), \result;
+    assigns *(dest + (strlen{Old}(dest) .. strlen{Old}(dest) + n))
+      \from *(src + (0 .. n));
+    assigns \result \from dest;
+    
+    behavior complete:
+      assumes
+        valid_string_src_fits: valid_read_string(src) ∧ strlen(src) ≤ n;
+      requires
+        room_string: \valid((dest + strlen(dest)) + (0 .. strlen(src)));
+      ensures
+        sum_of_lengths:
+          strlen(\old(dest)) ≡ \old(strlen(dest) + strlen(src));
+      assigns *(dest +
+                (strlen{Old}(dest) .. strlen{Old}(dest) + strlen{Old}(src))),
+              \result;
+      assigns
+      *(dest + (strlen{Old}(dest) .. strlen{Old}(dest) + strlen{Old}(src)))
+        \from *(src + (0 .. strlen{Old}(src)));
+      assigns \result \from dest;
+    
+    behavior partial:
+      assumes
+        valid_string_src_too_large:
+          ¬(valid_read_string(src) ∧ strlen(src) ≤ n);
+      requires room_string: \valid((dest + strlen(dest)) + (0 .. n));
+      ensures
+        sum_of_bounded_lengths:
+          strlen(\old(dest)) ≡ \old(strlen(dest)) + \old(n);
+      assigns *(dest + (strlen{Old}(dest) .. strlen{Old}(dest) + n)),
+              \result;
+      assigns *(dest + (strlen{Old}(dest) .. strlen{Old}(dest) + n))
+        \from *(src + (0 .. strlen{Old}(src)));
+      assigns \result \from dest;
+ */
+char *strncat(char *dest, char const *src, size_t n)
+{
+  size_t i;
+  size_t dest_len = strlen((char const *)dest);
+  i = (unsigned int)0;
+  while (i < n) {
+    if ((int)*(src + i) == 0) break;
+    *(dest + (dest_len + i)) = *(src + i);
+    i += (size_t)1;
+  }
+  *(dest + (dest_len + i)) = (char)0;
+  return dest;
+}
+
+/*@ requires valid_string_src: valid_read_string(src);
+    requires room_string: \valid(dest + (0 .. strlen(src)));
+    requires
+      separation:
+        \separated(dest + (0 .. strlen(src)), src + (0 .. strlen(src)));
+    ensures equal_contents: strcmp(\old(dest), \old(src)) ≡ 0;
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *(dest + (0 .. strlen{Old}(src))), \result;
+    assigns *(dest + (0 .. strlen{Old}(src)))
+      \from *(src + (0 .. strlen{Old}(src)));
+    assigns \result \from dest;
+ */
+char *strcpy(char *dest, char const *src)
+{
+  size_t i;
+  i = (unsigned int)0;
+  while ((int)*(src + i) != 0) {
+    *(dest + i) = *(src + i);
+    i += (size_t)1;
+  }
+  *(dest + i) = (char)0;
+  return dest;
+}
+
+/*@ requires valid_nstring_src: valid_read_nstring(src, n);
+    requires room_nstring: \valid(dest + (0 .. n - 1));
+    requires separation: \separated(dest + (0 .. n - 1), src + (0 .. n - 1));
+    ensures result_ptr: \result ≡ \old(dest);
+    ensures initialization: \initialized(\old(dest) + (0 .. \old(n) - 1));
+    assigns *(dest + (0 .. n - 1)), \result;
+    assigns *(dest + (0 .. n - 1)) \from *(src + (0 .. n - 1));
+    assigns \result \from dest;
+    
+    behavior complete:
+      assumes src_fits: strlen(src) < n;
+      ensures equal_after_copy: strcmp(\old(dest), \old(src)) ≡ 0;
+    
+    behavior partial:
+      assumes src_too_long: n ≤ strlen(src);
+      ensures
+        equal_prefix:
+          memcmp{Post, Post}(\old(dest), \old(src), \old(n)) ≡ 0;
+ */
+char *strncpy(char *dest, char const *src, size_t n)
+{
+  size_t i;
+  i = (unsigned int)0;
+  while (i < n) {
+    *(dest + i) = *(src + i);
+    if ((int)*(src + i) == 0) break;
+    i += (size_t)1;
+  }
+  while (i < n) {
+    *(dest + i) = (char)0;
+    i += (size_t)1;
+  }
+  return dest;
+}
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns \result;
+    assigns \result
+      \from s, (indirect: *(s + (0 .. strlen{Old}(s)))), (indirect: c);
+    
+    behavior found:
+      assumes char_found: strchr(s, c) ≡ \true;
+      ensures result_char: *\result ≡ (char)\old(c);
+      ensures result_same_base: \base_addr(\result) ≡ \base_addr(\old(s));
+      ensures
+        result_in_length: \old(s) ≤ \result ≤ \old(s) + strlen(\old(s));
+      ensures result_valid_string: valid_read_string(\result);
+      ensures
+        result_first_occur:
+          ∀ char *p; \old(s) ≤ p < \result ⇒ *p ≢ (char)\old(c);
+    
+    behavior not_found:
+      assumes char_not_found: ¬(strchr(s, c) ≡ \true);
+      ensures result_null: \result ≡ \null;
+    
+    behavior default:
+      ensures
+        result_null_or_same_base:
+          \result ≡ \null ∨ \base_addr(\result) ≡ \base_addr(\old(s));
+ */
+char *strchr(char const *s, int c)
+{
+  char *__retres;
+  size_t i;
+  char const ch = (char)c;
+  i = (unsigned int)0;
+  while ((int)*(s + i) != (int)ch) {
+    if ((int)*(s + i) == 0) {
+      __retres = (char *)0;
+      goto return_label;
+    }
+    i += (size_t)1;
+  }
+  __retres = (char *)(s + i);
+  return_label: return __retres;
+}
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns \result;
+    assigns \result \from s, *(s + (0 ..)), c;
+    
+    behavior found:
+      assumes char_found: strchr(s, c) ≡ \true;
+      ensures result_char: (int)*\result ≡ \old(c);
+      ensures result_same_base: \base_addr(\result) ≡ \base_addr(\old(s));
+      ensures result_valid_string: valid_read_string(\result);
+    
+    behavior not_found:
+      assumes char_not_found: ¬(strchr(s, c) ≡ \true);
+      ensures result_null: \result ≡ \null;
+    
+    behavior default:
+      ensures
+        result_null_or_same_base:
+          \result ≡ \null ∨ \base_addr(\result) ≡ \base_addr(\old(s));
+ */
+char *strrchr(char const *s, int c)
+{
+  char *__retres;
+  char const ch = (char)c;
+  {
+    size_t tmp;
+    tmp = strlen(s);
+    size_t i = tmp + (size_t)1;
+    while (i > (size_t)0) {
+      if ((int)*(s + (i - (size_t)1)) == (int)ch) {
+        __retres = (char *)(s + (i - (size_t)1));
+        goto return_label;
+      }
+      i -= (size_t)1;
+    }
+  }
+  __retres = (char *)0;
+  return_label: return __retres;
+}
+
+/*@ requires
+      valid:
+        valid_read_or_empty(s, n) ∨
+        \valid_read((unsigned char *)s + (0 .. memchr_off((char *)s, c, n)));
+    requires
+      initialization:
+        \initialized((unsigned char *)s + (0 .. n - 1)) ∨
+        \initialized((unsigned char *)s + (0 .. memchr_off((char *)s, c, n)));
+    requires
+      danglingness:
+        non_escaping(s, n) ∨
+        non_escaping(s, (unsigned int)(memchr_off((char *)s, c, n) + 1));
+    assigns \result;
+    assigns \result \from s, c, *((unsigned char *)s + (0 .. n - 1));
+    
+    behavior found:
+      assumes char_found: memchr((char *)s, c, n) ≡ \true;
+      ensures result_same_base: \base_addr(\result) ≡ \base_addr(\old(s));
+      ensures result_char: (int)*((char *)\result) ≡ \old(c);
+      ensures
+        result_in_str:
+          ∀ ℤ i;
+            0 ≤ i < \old(n) ⇒
+            *((unsigned char *)\old(s) + i) ≡ \old(c) ⇒
+            (unsigned char *)\result ≤ (unsigned char *)\old(s) + i;
+    
+    behavior not_found:
+      assumes char_not_found: ¬(memchr((char *)s, c, n) ≡ \true);
+      ensures result_null: \result ≡ \null;
+ */
+void *memchr(void const *s, int c, size_t n)
+{
+  void *__retres;
+  unsigned char const ch = (unsigned char)c;
+  unsigned char const *ss = (unsigned char const *)s;
+  {
+    size_t i = (unsigned int)0;
+    while (i < n) {
+      if ((int)*(ss + i) == (int)ch) {
+        __retres = (void *)(ss + i);
+        goto return_label;
+      }
+      i += (size_t)1;
+    }
+  }
+  __retres = (void *)0;
+  return_label: return __retres;
+}
+
+void *memrchr(void const *s, int c, size_t n)
+{
+  void *__retres;
+  unsigned char const ch = (unsigned char)c;
+  unsigned char const *ss = (unsigned char const *)s;
+  {
+    size_t i = n;
+    while (i > (size_t)0) {
+      if ((int)*(ss + (i - (size_t)1)) == (int)ch) {
+        __retres = (void *)(ss + (i - (size_t)1));
+        goto return_label;
+      }
+      i -= (size_t)1;
+    }
+  }
+  __retres = (void *)0;
+  return_label: return __retres;
+}
+
+/*@ requires valid_string_haystack: valid_read_string(haystack);
+    requires valid_string_needle: valid_read_string(needle);
+    ensures
+      result_null_or_in_haystack:
+        \result ≡ \null ∨
+        (\subset(\result, \old(haystack) + (0 ..)) ∧
+         \valid_read(\result) ∧
+         memcmp{Pre, Pre}(\result, \old(needle), strlen(\old(needle))) ≡ 0);
+    assigns \result;
+    assigns \result
+      \from haystack, (indirect: *(haystack + (0 ..))),
+            (indirect: *(needle + (0 ..)));
+ */
+char *strstr(char const *haystack, char const *needle)
+{
+  char *__retres;
+  if ((int)*(needle + 0) == 0) {
+    __retres = (char *)haystack;
+    goto return_label;
+  }
+  {
+    size_t i = (unsigned int)0;
+    while ((int)*(haystack + i) != 0) {
+      {
+        size_t j;
+        j = (unsigned int)0;
+        while ((int)*(haystack + (i + j)) != 0) {
+          if ((int)*(haystack + (i + j)) != (int)*(needle + j)) break;
+          j += (size_t)1;
+        }
+        if ((int)*(needle + j) == 0) {
+          __retres = (char *)(haystack + i);
+          goto return_label;
+        }
+      }
+      i += (size_t)1;
+    }
+  }
+  __retres = (char *)0;
+  return_label: return __retres;
+}
+
+static int __fc_strerror_init;
+/*@ ensures result_internal_str: \result ≡ __fc_p_strerror;
+    ensures result_nul_terminated: *(\result + 63) ≡ 0;
+    ensures result_valid_string: valid_read_string(\result);
+    assigns \result;
+    assigns \result \from __fc_p_strerror, (indirect: errnum);
+ */
+char *strerror(int errnum)
+{
+  char *__retres;
+  if (! __fc_strerror_init) {
+    Frama_C_make_unknown(__fc_strerror,(unsigned int)63);
+    __fc_strerror[63] = (char)0;
+    __fc_strerror_init = 1;
+  }
+  __retres = __fc_strerror;
+  return __retres;
+}
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s + (0 .. strlen{Old}(s)))),
+            (indirect: __fc_heap_status);
+    allocates \result;
+    
+    behavior allocation:
+      assumes can_allocate: is_allocable(strlen(s));
+      ensures allocation: \fresh{Old, Here}(\result,strlen(\old(s)));
+      ensures
+        result_valid_string_and_same_contents:
+          valid_string(\result) ∧ strcmp(\result, \old(s)) ≡ 0;
+      assigns __fc_heap_status, \result;
+      assigns __fc_heap_status \from (indirect: s), __fc_heap_status;
+      assigns \result
+        \from (indirect: *(s + (0 .. strlen{Old}(s)))),
+              (indirect: __fc_heap_status);
+    
+    behavior no_allocation:
+      assumes cannot_allocate: ¬is_allocable(strlen(s));
+      ensures result_null: \result ≡ \null;
+      assigns \result;
+      assigns \result \from \nothing;
+      allocates \nothing;
+ */
+char *strdup(char const *s)
+{
+  char *__retres;
+  size_t tmp;
+  tmp = strlen(s);
+  size_t l = tmp + (size_t)1;
+  char *p = malloc(l);
+  if (! p) {
+    __fc_errno = 12;
+    __retres = (char *)0;
+    goto return_label;
+  }
+  memcpy((void *)p,(void const *)s,l);
+  __retres = p;
+  return_label: return __retres;
+}
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s + (0 .. strlen{Old}(s)))), (indirect: n),
+            (indirect: __fc_heap_status);
+    allocates \result;
+    
+    behavior allocation:
+      assumes can_allocate: is_allocable(\min(strlen(s), n + 1));
+      ensures
+        allocation:
+          \fresh{Old, Here}(\result,\min(strlen(\old(s)), \old(n) + 1));
+      ensures
+        result_valid_string_bounded_and_same_prefix:
+          \valid(\result + (0 .. \min(strlen(\old(s)), \old(n)))) ∧
+          valid_string(\result) ∧ strlen(\result) ≤ \old(n) ∧
+          strncmp(\result, \old(s), \old(n)) ≡ 0;
+      assigns __fc_heap_status, \result;
+      assigns __fc_heap_status
+        \from (indirect: s), (indirect: n), __fc_heap_status;
+      assigns \result
+        \from (indirect: *(s + (0 .. strlen{Old}(s)))), (indirect: n),
+              (indirect: __fc_heap_status);
+    
+    behavior no_allocation:
+      assumes cannot_allocate: ¬is_allocable(\min(strlen(s), n + 1));
+      ensures result_null: \result ≡ \null;
+      assigns \result;
+      assigns \result \from \nothing;
+      allocates \nothing;
+ */
+char *strndup(char const *s, size_t n)
+{
+  char *__retres;
+  size_t l;
+  l = (unsigned int)0;
+  while (l < n) {
+    if ((int)*(s + l) == 0) break;
+    l += (size_t)1;
+  }
+  char *p = malloc(l + (size_t)1);
+  if (! p) {
+    __fc_errno = 12;
+    __retres = (char *)0;
+    goto return_label;
+  }
+  memcpy((void *)p,(void const *)s,l);
+  *(p + l) = (char)0;
+  __retres = p;
+  return_label: return __retres;
+}
+
+static int __fc_strsignal_init;
+/*@ ensures result_internal_str: \result ≡ __fc_p_strsignal;
+    ensures result_nul_terminated: *(\result + 63) ≡ 0;
+    ensures result_valid_string: valid_read_string(\result);
+    assigns \result;
+    assigns \result \from __fc_p_strsignal, (indirect: signum);
+ */
+char *strsignal(int signum)
+{
+  char *__retres;
+  if (! __fc_strsignal_init) {
+    Frama_C_make_unknown(__fc_strsignal,(unsigned int)63);
+    __fc_strsignal[63] = (char)0;
+    __fc_strsignal_init = 1;
+  }
+  __retres = __fc_strsignal;
+  return __retres;
+}
+
+/*@ ghost unsigned int volatile __fc_time __attribute__((__FRAMA_C_MODEL__));
+  */
+/*@ assigns \result;
+    assigns \result \from __fc_time; */
+extern clock_t clock(void);
+
+/*@ assigns \result;
+    assigns \result \from time1, time0; */
+extern double difftime(time_t time1, time_t time0);
+
+/*@ requires valid_timeptr: \valid(timeptr);
+    assigns *timeptr, \result;
+    assigns *timeptr \from *timeptr;
+    assigns \result \from (indirect: *timeptr);
+ */
+extern time_t mktime(struct tm *timeptr);
+
+/*@ assigns *timer, \result;
+    assigns *timer \from __fc_time;
+    assigns \result \from __fc_time;
+    
+    behavior null:
+      assumes timer_null: timer ≡ \null;
+      assigns \result;
+      assigns \result \from __fc_time;
+    
+    behavior not_null:
+      assumes timer_non_null: timer ≢ \null;
+      requires valid_timer: \valid(timer);
+      ensures initialization: timer: \initialized(\old(timer));
+      assigns *timer, \result;
+      assigns *timer \from __fc_time;
+      assigns \result \from __fc_time;
+    
+    complete behaviors not_null, null;
+    disjoint behaviors not_null, null;
+ */
+extern time_t time(time_t *timer);
+
+char __fc_ctime[26];
+char * const __fc_p_ctime = __fc_ctime;
+/*@ requires valid_timeptr: \valid_read(timeptr);
+    requires initialization: init_timeptr: \initialized(timeptr);
+    ensures result_points_to_ctime: \result ≡ __fc_p_ctime;
+    ensures result_valid_string: valid_read_string(__fc_p_ctime);
+    assigns __fc_ctime[0 .. 25], \result;
+    assigns __fc_ctime[0 .. 25]
+      \from (indirect: *timeptr), (indirect: __fc_time);
+    assigns \result
+      \from (indirect: *timeptr), (indirect: __fc_time), __fc_p_ctime;
+ */
+extern char *asctime(struct tm const *timeptr);
+
+/*@ requires valid_timer: \valid_read(timer);
+    requires initialization: init_timer: \initialized(timer);
+    ensures result_points_to_ctime: \result ≡ __fc_p_ctime;
+    ensures result_valid_string: valid_read_string(__fc_p_ctime);
+    assigns __fc_ctime[0 .. 25], \result;
+    assigns __fc_ctime[0 .. 25]
+      \from (indirect: *timer), (indirect: __fc_time);
+    assigns \result
+      \from (indirect: *timer), (indirect: __fc_time), __fc_p_ctime;
+ */
+extern char *ctime(time_t const *timer);
+
+struct tm __fc_time_tm;
+struct tm * const __fc_p_time_tm = & __fc_time_tm;
+/*@ requires valid_timer: \valid_read(timer);
+    ensures
+      result_null_or_internal_tm:
+        \result ≡ &__fc_time_tm ∨ \result ≡ \null;
+    assigns \result, __fc_time_tm;
+    assigns \result \from __fc_p_time_tm;
+    assigns __fc_time_tm \from *timer;
+ */
+extern struct tm *gmtime(time_t const *timer);
+
+/*@ requires valid_timer: \valid_read(timer);
+    ensures
+      result_null_or_internal_tm:
+        \result ≡ &__fc_time_tm ∨ \result ≡ \null;
+    assigns \result, __fc_time_tm;
+    assigns \result \from __fc_p_time_tm;
+    assigns __fc_time_tm \from *timer;
+ */
+extern struct tm *localtime(time_t const *timer);
+
+/*@ requires dst_has_room: \valid(s + (0 .. max - 1));
+    requires valid_format: valid_read_string(format);
+    requires valid_tm: \valid_read(tm);
+    ensures result_bounded: \result ≤ \old(max);
+    assigns *(s + (0 .. max - 1)), \result;
+    assigns *(s + (0 .. max - 1))
+      \from (indirect: max), (indirect: *(format + (0 ..))), (indirect: *tm);
+    assigns \result
+      \from (indirect: max), (indirect: *(format + (0 ..))), (indirect: *tm);
+ */
+extern size_t strftime(char * __restrict s, size_t max,
+                       char const * __restrict format,
+                       struct tm const * __restrict tm);
+
+/*@ requires tp: \valid(tp);
+    assigns \result, *tp, __fc_time;
+    assigns \result \from __fc_time;
+    assigns *tp \from __fc_time;
+    assigns __fc_time \from __fc_time;
+    
+    behavior realtime_clock:
+      assumes realtime: clk_id ≡ 666;
+      ensures success: \result ≡ 0;
+      ensures initialization: \initialized(\old(tp));
+    
+    behavior monotonic_clock:
+      assumes monotonic: clk_id ≡ 1;
+      ensures success: \result ≡ 0;
+      ensures initialization: \initialized(\old(tp));
+    
+    behavior bad_clock_id:
+      assumes bad_id: clk_id ≢ 666 ∧ clk_id ≢ 1;
+      ensures error: \result ≡ 22;
+      assigns \result;
+      assigns \result \from clk_id;
+    
+    complete behaviors bad_clock_id, monotonic_clock, realtime_clock;
+    disjoint behaviors bad_clock_id, monotonic_clock, realtime_clock;
+ */
+extern int clock_gettime(clockid_t clk_id, struct timespec *tp);
+
+/*@
+axiomatic nanosleep_predicates {
+  predicate abs_clock_in_range{L}(clockid_t id, struct timespec *tm) 
+    reads __fc_time;
+  
+  predicate valid_clock_id{L}(clockid_t id) 
+    reads __fc_time;
+  
+  }
+
+*/
+/*@ ghost int volatile __fc_interrupted __attribute__((__FRAMA_C_MODEL__));
+  */
+/*@ requires valid_request: \valid_read(rqtp);
+    requires
+      initialization: initialized_request:
+        \initialized(&rqtp->tv_sec) ∧ \initialized(&rqtp->tv_nsec);
+    requires valid_nanosecs: 0 ≤ rqtp->tv_nsec < 1000000000;
+    requires valid_remaining_or_null: rmtp ≡ \null ∨ \valid(rmtp);
+    assigns \result;
+    assigns \result
+      \from (indirect: __fc_time), (indirect: __fc_interrupted),
+            (indirect: clock_id), (indirect: flags), (indirect: rqtp),
+            (indirect: *rqtp);
+    
+    behavior absolute:
+      assumes absolute_time: (flags & 1) ≢ 0;
+      assumes
+        no_einval:
+          abs_clock_in_range(clock_id, rqtp) ∧ valid_clock_id(clock_id);
+      ensures
+        result_ok_or_error:
+          \result ≡ 0 ∨ \result ≡ 4 ∨ \result ≡ 22 ∨
+          \result ≡ 95;
+      assigns \result;
+      assigns \result
+        \from (indirect: __fc_time), (indirect: __fc_interrupted),
+              (indirect: clock_id), (indirect: rqtp), (indirect: *rqtp);
+    
+    behavior relative_interrupted:
+      assumes relative_time: (flags & 1) ≡ 0;
+      assumes interrupted: __fc_interrupted ≢ 0;
+      assumes no_einval: valid_clock_id(clock_id);
+      ensures result_interrupted: \result ≡ 4;
+      ensures
+        initialization: interrupted_remaining:
+          \old(rmtp) ≢ \null ⇒
+          \initialized(&\old(rmtp)->tv_sec) ∧
+          \initialized(&\old(rmtp)->tv_nsec);
+      ensures
+        interrupted_remaining_decreases:
+          \old(rmtp) ≢ \null ⇒
+          \old(rqtp)->tv_sec * 1000000000 + \old(rqtp)->tv_nsec ≥
+          \old(rmtp)->tv_sec * 1000000000 + \old(rmtp)->tv_nsec;
+      ensures
+        remaining_valid:
+          \old(rmtp) ≢ \null ⇒ 0 ≤ \old(rmtp)->tv_nsec < 1000000000;
+      assigns \result, *rmtp;
+      assigns \result
+        \from (indirect: __fc_time), (indirect: clock_id), (indirect: rqtp),
+              (indirect: *rqtp);
+      assigns *rmtp
+        \from __fc_time, (indirect: clock_id), (indirect: rqtp),
+              (indirect: *rqtp), (indirect: rmtp);
+    
+    behavior relative_no_error:
+      assumes relative_time: (flags & 1) ≡ 0;
+      assumes not_interrupted: __fc_interrupted ≡ 0;
+      assumes no_einval: valid_clock_id(clock_id);
+      ensures result_ok: \result ≡ 0;
+      assigns \result;
+      assigns \result
+        \from (indirect: __fc_time), (indirect: clock_id), (indirect: rqtp),
+              (indirect: *rqtp);
+    
+    behavior relative_invalid_clock_id:
+      assumes relative_time: (flags & 1) ≡ 0;
+      assumes not_interrupted: __fc_interrupted ≡ 0;
+      assumes einval: ¬valid_clock_id(clock_id);
+      ensures result_einval: \result ≡ 22;
+      assigns \result;
+      assigns \result
+        \from (indirect: __fc_time), (indirect: clock_id), (indirect: rqtp),
+              (indirect: *rqtp);
+    
+    complete behaviors relative_invalid_clock_id,
+                       relative_no_error,
+                       relative_interrupted,
+                       absolute;
+    disjoint behaviors relative_invalid_clock_id,
+                       relative_no_error,
+                       relative_interrupted,
+                       absolute;
+ */
+extern int clock_nanosleep(clockid_t clock_id, int flags,
+                           struct timespec const *rqtp, struct timespec *rmtp);
+
+/*@ requires valid_timer: \valid_read(timer);
+    requires valid_result: \valid(result);
+    ensures
+      result_null_or_result: \result ≡ \old(result) ∨ \result ≡ \null;
+    assigns \result, *result;
+    assigns \result \from (indirect: *timer), result;
+    assigns *result \from (indirect: *timer);
+ */
+extern struct tm *gmtime_r(time_t const * __restrict timer,
+                           struct tm * __restrict result);
+
+/*@ requires valid_request: \valid_read(rqtp);
+    requires
+      initialization: initialized_request:
+        \initialized(&rqtp->tv_sec) ∧ \initialized(&rqtp->tv_nsec);
+    requires valid_nanosecs: 0 ≤ rqtp->tv_nsec < 1000000000;
+    requires valid_remaining_or_null: rmtp ≡ \null ∨ \valid(rmtp);
+    ensures result_elapsed_or_interrupted: \result ≡ 0 ∨ \result ≡ -1;
+    ensures
+      initialization: interrupted_remaining:
+        \old(rmtp) ≢ \null ∧ \result ≡ -1 ⇒
+        \initialized(&\old(rmtp)->tv_sec) ∧
+        \initialized(&\old(rmtp)->tv_nsec);
+    ensures
+      interrupted_remaining_decreases:
+        \old(rmtp) ≢ \null ∧ \result ≡ -1 ⇒
+        \old(rqtp)->tv_sec * 1000000000 + \old(rqtp)->tv_nsec ≥
+        \old(rmtp)->tv_sec * 1000000000 + \old(rmtp)->tv_nsec;
+    ensures
+      interrupted_remaining_valid:
+        \old(rmtp) ≢ \null ∧ \result ≡ -1 ⇒
+        0 ≤ \old(rmtp)->tv_nsec < 1000000000;
+    assigns \result, *rmtp;
+    assigns \result
+      \from (indirect: __fc_time), (indirect: rqtp), (indirect: *rqtp);
+    assigns *rmtp
+      \from (indirect: __fc_time), (indirect: rqtp), (indirect: *rqtp),
+            (indirect: rmtp);
+ */
+extern int nanosleep(struct timespec const *rqtp, struct timespec *rmtp);
+
+extern char *tzname[2];
+
+/*@ assigns *(tzname[0 .. 1] + (0 ..));
+    assigns *(tzname[0 .. 1] + (0 ..)) \from \nothing;
+ */
+extern void tzset(void);
+
+/*@ requires
+      valid:
+        valid_read_or_empty((void *)s, (unsigned int)(sizeof(wchar_t) * n)) ∨
+        \valid_read((unsigned char *)s + (0 .. wmemchr_off(s, c, n)));
+    requires
+      initialization:
+        \initialized(s + (0 .. n - 1)) ∨
+        \initialized(s + (0 .. wmemchr_off(s, c, n)));
+    requires
+      danglingness:
+        non_escaping((void *)s, (unsigned int)(sizeof(wchar_t) * n)) ∨
+        non_escaping((void *)s,
+                    (unsigned int)(sizeof(wchar_t) *
+                                   (wmemchr_off(s, c, n) + 1)));
+    ensures
+      result_null_or_inside_s:
+        \result ≡ \null ∨ \subset(\result, \old(s) + (0 .. \old(n) - 1));
+    assigns \result;
+    assigns \result
+      \from s, (indirect: *(s + (0 .. n - 1))), (indirect: c), (indirect: n);
+ */
+extern wchar_t *wmemchr(wchar_t const *s, wchar_t c, size_t n);
+
+/*@ requires
+      valid_s1:
+        valid_read_or_empty((void *)s1, (unsigned int)(sizeof(wchar_t) * n));
+    requires
+      valid_s2:
+        valid_read_or_empty((void *)s2, (unsigned int)(sizeof(wchar_t) * n));
+    requires initialization: s1: \initialized(s1 + (0 .. n - 1));
+    requires initialization: s2: \initialized(s2 + (0 .. n - 1));
+    requires
+      danglingness: s1:
+        non_escaping((void *)s1, (unsigned int)(sizeof(wchar_t) * n));
+    requires
+      danglingness: s2:
+        non_escaping((void *)s2, (unsigned int)(sizeof(wchar_t) * n));
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s1 + (0 .. n - 1))),
+            (indirect: *(s2 + (0 .. n - 1))), (indirect: n);
+ */
+extern int wmemcmp(wchar_t const *s1, wchar_t const *s2, size_t n);
+
+wchar_t *wmemcpy(wchar_t *dest, wchar_t const *src, size_t n);
+
+/*@ requires valid_src: \valid_read(src + (0 .. n - 1));
+    requires valid_dest: \valid(dest + (0 .. n - 1));
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *(dest + (0 .. n - 1)), \result;
+    assigns *(dest + (0 .. n - 1))
+      \from *(src + (0 .. n - 1)), (indirect: src), (indirect: n);
+    assigns \result \from dest;
+ */
+extern wchar_t *wmemmove(wchar_t *dest, wchar_t const *src, size_t n);
+
+wchar_t *wmemset(wchar_t *dest, wchar_t val, size_t len);
+
+wchar_t *wcscat(wchar_t *dest, wchar_t const *src);
+
+/*@ requires valid_wstring_src: valid_read_wstring(wcs);
+    ensures
+      result_null_or_inside_wcs:
+        \result ≡ \null ∨ \subset(\result, \old(wcs) + (0 ..));
+    assigns \result;
+    assigns \result \from wcs, (indirect: *(wcs + (0 ..))), (indirect: wc);
+ */
+extern wchar_t *wcschr(wchar_t const *wcs, wchar_t wc);
+
+/*@ requires valid_wstring_s1: valid_read_wstring(s1);
+    requires valid_wstring_s2: valid_read_wstring(s2);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s1 + (0 ..))), (indirect: *(s2 + (0 ..)));
+ */
+extern int wcscmp(wchar_t const *s1, wchar_t const *s2);
+
+wchar_t *wcscpy(wchar_t *dest, wchar_t const *src);
+
+/*@ requires valid_wstring_wcs: valid_read_wstring(wcs);
+    requires valid_wstring_accept: valid_read_wstring(accept);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(wcs + (0 ..))), (indirect: *(accept + (0 ..)));
+ */
+extern size_t wcscspn(wchar_t const *wcs, wchar_t const *accept);
+
+/*@ requires valid_nwstring_src: valid_read_nwstring(src, n);
+    requires valid_wstring_dest: valid_wstring(dest);
+    requires
+      room_for_concatenation:
+        \valid(dest + (wcslen(dest) .. wcslen(dest) + \min(wcslen(src), n)));
+    requires
+      separation:
+        \separated(
+          dest + (0 .. wcslen(dest) + wcslen(src)), src + (0 .. wcslen(src))
+          );
+    assigns *(dest + (0 ..)), \result;
+    assigns *(dest + (0 ..))
+      \from *(dest + (0 ..)), (indirect: dest), *(src + (0 .. n - 1)),
+            (indirect: src), (indirect: n);
+    assigns \result
+      \from (indirect: *(dest + (0 ..))), (indirect: *(src + (0 .. n - 1))),
+            (indirect: n);
+ */
+extern size_t wcslcat(wchar_t * __restrict dest,
+                      wchar_t const * __restrict src, size_t n);
+
+/*@ requires valid_wstring_src: valid_read_wstring(src);
+    requires room_nwstring: \valid(dest + (0 .. n));
+    requires
+      separation: dest: src:
+        \separated(dest + (0 .. n - 1), src + (0 .. n - 1));
+    assigns *(dest + (0 .. n - 1)), \result;
+    assigns *(dest + (0 .. n - 1))
+      \from *(src + (0 .. n - 1)), (indirect: src), (indirect: n);
+    assigns \result
+      \from (indirect: *(dest + (0 .. n - 1))), (indirect: dest),
+            (indirect: *(src + (0 .. n - 1))), (indirect: src), (indirect: n);
+ */
+extern size_t wcslcpy(wchar_t *dest, wchar_t const *src, size_t n);
+
+size_t wcslen(wchar_t const *str);
+
+wchar_t *wcsncat(wchar_t *dest, wchar_t const *src, size_t n);
+
+/*@ requires valid_wstring_s1: valid_read_wstring(s1);
+    requires valid_wstring_s2: valid_read_wstring(s2);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s1 + (0 .. n - 1))),
+            (indirect: *(s2 + (0 .. n - 1))), (indirect: n);
+ */
+extern int wcsncmp(wchar_t const *s1, wchar_t const *s2, size_t n);
+
+wchar_t *wcsncpy(wchar_t *dest, wchar_t const *src, size_t n);
+
+/*@ requires valid_wstring_wcs: valid_read_wstring(wcs);
+    requires valid_wstring_accept: valid_read_wstring(accept);
+    ensures
+      result_null_or_inside_wcs:
+        \result ≡ \null ∨ \subset(\result, \old(wcs) + (0 ..));
+    assigns \result;
+    assigns \result
+      \from wcs, (indirect: *(wcs + (0 ..))), (indirect: *(accept + (0 ..)));
+ */
+extern wchar_t *wcspbrk(wchar_t const *wcs, wchar_t const *accept);
+
+/*@ requires valid_wstring_wcs: valid_read_wstring(wcs);
+    ensures
+      result_null_or_inside_wcs:
+        \result ≡ \null ∨ \subset(\result, \old(wcs) + (0 ..));
+    assigns \result;
+    assigns \result
+      \from wcs, (indirect: *(wcs + (0 .. wcslen{Old}(wcs)))), (indirect: wc);
+ */
+extern wchar_t *wcsrchr(wchar_t const *wcs, wchar_t wc);
+
+/*@ requires valid_wstring_wcs: valid_read_wstring(wcs);
+    requires valid_wstring_accept: valid_read_wstring(accept);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(wcs + (0 .. wcslen{Old}(wcs)))),
+            (indirect: *(accept + (0 .. wcslen{Old}(accept))));
+ */
+extern size_t wcsspn(wchar_t const *wcs, wchar_t const *accept);
+
+/*@ requires valid_wstring_haystack: valid_read_wstring(haystack);
+    requires valid_wstring_needle: valid_read_wstring(needle);
+    ensures
+      result_null_or_inside_haystack:
+        \result ≡ \null ∨ \subset(\result, \old(haystack) + (0 ..));
+    assigns \result;
+    assigns \result
+      \from haystack, (indirect: *(haystack + (0 ..))),
+            (indirect: *(needle + (0 ..)));
+ */
+extern wchar_t *wcsstr(wchar_t const *haystack, wchar_t const *needle);
+
+/*@ requires room_nwstring: \valid(ws + (0 .. n - 1));
+    requires valid_stream: \valid(stream);
+    ensures result_null_or_same: \result ≡ \null ∨ \result ≡ \old(ws);
+    ensures
+      terminated_string_on_success:
+        \result ≢ \null ⇒ valid_wstring(\old(ws));
+    assigns *(ws + (0 .. n - 1)), \result;
+    assigns *(ws + (0 .. n - 1)) \from (indirect: n), (indirect: *stream);
+    assigns \result \from ws, (indirect: n), (indirect: *stream);
+ */
+extern wchar_t *fgetws(wchar_t * __restrict ws, int n,
+                       FILE * __restrict stream);
+
+/*@ axiomatic wformat_length {
+      logic ℤ wformat_length{L}(wchar_t *format) ;
+      
+      }
+
+*/
+/*@ requires
+      valid_dest:
+        valid_or_empty((void *)dest, (unsigned int)(sizeof(wchar_t) * n));
+    requires
+      valid_src:
+        valid_read_or_empty((void *)src, (unsigned int)(sizeof(wchar_t) * n));
+    requires
+      separation: dest: src:
+        \separated(dest + (0 .. n - 1), src + (0 .. n - 1));
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *(dest + (0 .. n - 1)), \result;
+    assigns *(dest + (0 .. n - 1))
+      \from *(src + (0 .. n - 1)), (indirect: src), (indirect: n);
+    assigns \result \from dest;
+ */
+wchar_t *wmemcpy(wchar_t *dest, wchar_t const *src, size_t n)
+{
+  {
+    size_t i = (unsigned int)0;
+    while (i < n) {
+      *(dest + i) = *(src + i);
+      i += (size_t)1;
+    }
+  }
+  return dest;
+}
+
+/*@ requires valid_wcs: \valid(dest + (0 .. len - 1));
+    ensures result_ptr: \result ≡ \old(dest);
+    ensures
+      initialization: wcs: \initialized(\old(dest) + (0 .. \old(len) - 1));
+    ensures
+      contents_equal_wc:
+        \subset(*(\old(dest) + (0 .. \old(len) - 1)), \old(val));
+    assigns *(dest + (0 .. len - 1)), \result;
+    assigns *(dest + (0 .. len - 1)) \from val, (indirect: len);
+    assigns \result \from dest;
+ */
+wchar_t *wmemset(wchar_t *dest, wchar_t val, size_t len)
+{
+  {
+    size_t i = (unsigned int)0;
+    while (i < len) {
+      *(dest + i) = val;
+      i += (size_t)1;
+    }
+  }
+  return dest;
+}
+
+/*@ requires valid_wstring_src: valid_read_wstring(src);
+    requires room_wstring: \valid(dest + (0 .. wcslen(src)));
+    requires
+      separation:
+        \separated(dest + (0 .. wcslen(src)), src + (0 .. wcslen(src)));
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *(dest + (0 .. wcslen{Old}(src))), \result;
+    assigns *(dest + (0 .. wcslen{Old}(src)))
+      \from *(src + (0 .. wcslen{Old}(src))), (indirect: src);
+    assigns \result \from dest;
+ */
+wchar_t *wcscpy(wchar_t *dest, wchar_t const *src)
+{
+  size_t i;
+  i = (unsigned int)0;
+  while (*(src + i) != 0) {
+    *(dest + i) = *(src + i);
+    i += (size_t)1;
+  }
+  *(dest + i) = 0;
+  return dest;
+}
+
+/*@ requires valid_string_s: valid_read_wstring(str);
+    ensures result_is_length: \result ≡ wcslen(\old(str));
+    assigns \result;
+    assigns \result \from (indirect: *(str + (0 .. wcslen{Old}(str))));
+ */
+size_t wcslen(wchar_t const *str)
+{
+  size_t i;
+  i = (unsigned int)0;
+  while (*(str + i) != 0) i += (size_t)1;
+  return i;
+}
+
+/*@ requires valid_wstring_src: valid_read_wstring(src);
+    requires room_nwstring: \valid(dest + (0 .. n - 1));
+    requires
+      separation: dest: src:
+        \separated(dest + (0 .. n - 1), src + (0 .. n - 1));
+    ensures result_ptr: \result ≡ \old(dest);
+    ensures initialization: \initialized(\old(dest) + (0 .. \old(n) - 1));
+    assigns *(dest + (0 .. n - 1)), \result;
+    assigns *(dest + (0 .. n - 1))
+      \from *(src + (0 .. n - 1)), (indirect: src), (indirect: n);
+    assigns \result \from dest;
+ */
+wchar_t *wcsncpy(wchar_t *dest, wchar_t const *src, size_t n)
+{
+  size_t i;
+  i = (unsigned int)0;
+  while (i < n) {
+    *(dest + i) = *(src + i);
+    if (*(src + i) == 0) break;
+    i += (size_t)1;
+  }
+  while (i < n) {
+    *(dest + i) = 0;
+    i += (size_t)1;
+  }
+  return dest;
+}
+
+/*@ requires valid_wstring_src: valid_read_wstring(src);
+    requires valid_wstring_dest: valid_wstring(dest);
+    requires
+      room_for_concatenation:
+        \valid(dest + (wcslen(dest) .. wcslen(dest) + wcslen(src)));
+    requires
+      separation:
+        \separated(
+          dest + (0 .. wcslen(dest) + wcslen(src)), src + (0 .. wcslen(src))
+          );
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *(dest + (0 ..)), \result;
+    assigns *(dest + (0 ..))
+      \from *(dest + (0 ..)), (indirect: dest), *(src + (0 ..)),
+            (indirect: src);
+    assigns \result \from dest;
+ */
+wchar_t *wcscat(wchar_t *dest, wchar_t const *src)
+{
+  size_t i;
+  size_t n = wcslen((wchar_t const *)dest);
+  i = (unsigned int)0;
+  while (*(src + i) != 0) {
+    *(dest + (n + i)) = *(src + i);
+    i += (size_t)1;
+  }
+  *(dest + (n + i)) = 0;
+  return dest;
+}
+
+/*@ requires valid_nwstring_src: valid_read_nwstring(src, n);
+    requires valid_wstring_dest: valid_wstring(dest);
+    requires
+      room_for_concatenation:
+        \valid(dest + (wcslen(dest) .. wcslen(dest) + \min(wcslen(src), n)));
+    requires
+      separation:
+        \separated(
+          dest + (0 .. wcslen(dest) + wcslen(src)), src + (0 .. wcslen(src))
+          );
+    ensures result_ptr: \result ≡ \old(dest);
+    assigns *(dest + (0 ..)), \result;
+    assigns *(dest + (0 ..))
+      \from *(dest + (0 ..)), (indirect: dest), *(src + (0 .. n - 1)),
+            (indirect: src), (indirect: n);
+    assigns \result \from dest;
+ */
+wchar_t *wcsncat(wchar_t *dest, wchar_t const *src, size_t n)
+{
+  size_t i;
+  size_t dest_len = wcslen((wchar_t const *)dest);
+  i = (unsigned int)0;
+  while (1) {
+    if (i < n) {
+      if (! (*(src + i) != 0)) break;
+    }
+    else break;
+    *(dest + (dest_len + i)) = *(src + i);
+    i += (size_t)1;
+  }
+  *(dest + (dest_len + i)) = 0;
+  return dest;
+}
+
+/*@ ghost extern int __fc_stack_status __attribute__((__FRAMA_C_MODEL__)); */
+
+/*@ ensures allocation: \fresh{Old, Here}(\result,\old(size));
+    assigns __fc_stack_status, \result;
+    assigns __fc_stack_status \from size, __fc_stack_status;
+    assigns \result \from (indirect: size), (indirect: __fc_stack_status);
+    allocates \result;
+ */
+extern void *alloca(size_t size);
+
+DIR __fc_opendir[16];
+DIR * const __fc_p_opendir = __fc_opendir;
+/*@ requires
+      dirp_valid_dir_stream: \subset(dirp, &__fc_opendir[0 .. 16 - 1]);
+    ensures
+      err_or_closed_on_success:
+        (\result ≡ 0 ∧ \old(dirp)->__fc_dir_inode ≡ \null) ∨
+        \result ≡ -1;
+    assigns \result, __fc_errno, *dirp;
+    assigns \result \from dirp, *dirp, __fc_p_opendir;
+    assigns __fc_errno \from dirp, *dirp, __fc_p_opendir;
+    assigns *dirp \from dirp, *dirp, __fc_p_opendir;
+ */
+extern int closedir(DIR *dirp);
+
+/*@ ensures result_null_or_valid: \result ≡ \null ∨ \valid(\result);
+    ensures
+      valid_dir_stream_on_success:
+        \result ≢ \null ⇒ \result ≡ &__fc_opendir[\result->__fc_dir_id];
+    ensures
+      stream_positioned_on_success:
+        \result ≢ \null ⇒ \result->__fc_dir_inode ≢ \null;
+    assigns \result, __fc_errno;
+    assigns \result \from *(path + (0 ..)), __fc_p_opendir;
+    assigns __fc_errno \from *(path + (0 ..)), __fc_p_opendir;
+ */
+extern DIR *opendir(char const *path);
+
+/*@ requires
+      dirp_valid_dir_stream: \subset(dirp, &__fc_opendir[0 .. 16 - 1]);
+    ensures result_null_or_valid: \result ≡ \null ∨ \valid(\result);
+    assigns \result, dirp->__fc_dir_position, __fc_errno;
+    assigns \result \from *dirp, __fc_p_opendir;
+    assigns dirp->__fc_dir_position \from dirp->__fc_dir_position;
+    assigns __fc_errno \from dirp, *dirp, __fc_p_opendir;
+ */
+extern struct dirent *readdir(DIR *dirp);
+
+/*@ requires valid_fdset: \valid(fdset);
+    requires initialization: \initialized(fdset);
+    assigns *fdset;
+    assigns *fdset \from *fdset, (indirect: fd);
+ */
+extern void FD_CLR(int fd, fd_set *fdset);
+
+/*@ requires valid_fdset: \valid_read(fdset);
+    requires initialization: \initialized(fdset);
+    assigns \result;
+    assigns \result \from (indirect: *fdset), (indirect: fd);
+ */
+extern int FD_ISSET(int fd, fd_set const *fdset);
+
+/*@ requires valid_fdset: \valid(fdset);
+    requires initialization: \initialized(fdset);
+    assigns *fdset;
+    assigns *fdset \from *fdset, (indirect: fd);
+ */
+extern void FD_SET(int fd, fd_set *fdset);
+
+/*@ requires valid_fdset: \valid(fdset);
+    ensures initialization: \initialized(\old(fdset));
+    assigns *fdset;
+    assigns *fdset \from \nothing;
+ */
+extern void FD_ZERO(fd_set *fdset);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (int)(\old(a) + \old(b));
+    ensures
+      result_overflow:
+        \old(a) + \old(b) ≡ (int)(\old(a) + \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_sadd_overflow(int a, int b, int *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (long)(\old(a) + \old(b));
+    ensures
+      result_overflow:
+        \old(a) + \old(b) ≡ (long)(\old(a) + \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_saddl_overflow(long a, long b, long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (long long)(\old(a) + \old(b));
+    ensures
+      result_overflow:
+        \old(a) + \old(b) ≡ (long long)(\old(a) + \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_saddll_overflow(long long a, long long b, long long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (unsigned int)(\old(a) + \old(b));
+    ensures
+      result_overflow:
+        \old(a) + \old(b) ≡ (unsigned int)(\old(a) + \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_uadd_overflow(unsigned int a, unsigned int b,
+                              unsigned int *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (unsigned long)(\old(a) + \old(b));
+    ensures
+      result_overflow:
+        \old(a) + \old(b) ≡ (unsigned long)(\old(a) + \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_uaddl_overflow(unsigned long a, unsigned long b,
+                               unsigned long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures
+      res_wrapped: *\old(res) ≡ (unsigned long long)(\old(a) + \old(b));
+    ensures
+      result_overflow:
+        \old(a) + \old(b) ≡ (unsigned long long)(\old(a) + \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_uaddll_overflow(unsigned long long a, unsigned long long b,
+                                unsigned long long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (int)(\old(a) - \old(b));
+    ensures
+      result_overflow:
+        \old(a) - \old(b) ≡ (int)(\old(a) - \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_ssub_overflow(int a, int b, int *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (long)(\old(a) - \old(b));
+    ensures
+      result_overflow:
+        \old(a) - \old(b) ≡ (long)(\old(a) - \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_ssubl_overflow(long a, long b, long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (long long)(\old(a) - \old(b));
+    ensures
+      result_overflow:
+        \old(a) - \old(b) ≡ (long long)(\old(a) - \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_ssubll_overflow(long long a, long long b, long long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (unsigned int)(\old(a) - \old(b));
+    ensures
+      result_overflow:
+        \old(a) - \old(b) ≡ (unsigned int)(\old(a) - \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_usub_overflow(unsigned int a, unsigned int b,
+                              unsigned int *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (unsigned long)(\old(a) - \old(b));
+    ensures
+      result_overflow:
+        \old(a) - \old(b) ≡ (unsigned long)(\old(a) - \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_usubl_overflow(unsigned long a, unsigned long b,
+                               unsigned long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures
+      res_wrapped: *\old(res) ≡ (unsigned long long)(\old(a) - \old(b));
+    ensures
+      result_overflow:
+        \old(a) - \old(b) ≡ (unsigned long long)(\old(a) - \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_usubll_overflow(unsigned long long a, unsigned long long b,
+                                unsigned long long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (int)(\old(a) * \old(b));
+    ensures
+      result_overflow:
+        \old(a) * \old(b) ≡ (int)(\old(a) * \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_smul_overflow(int a, int b, int *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (long)(\old(a) * \old(b));
+    ensures
+      result_overflow:
+        \old(a) * \old(b) ≡ (long)(\old(a) * \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_smull_overflow(long a, long b, long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (long long)(\old(a) * \old(b));
+    ensures
+      result_overflow:
+        \old(a) * \old(b) ≡ (long long)(\old(a) * \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_smulll_overflow(long long a, long long b, long long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (unsigned int)(\old(a) * \old(b));
+    ensures
+      result_overflow:
+        \old(a) * \old(b) ≡ (unsigned int)(\old(a) * \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_umul_overflow(unsigned int a, unsigned int b,
+                              unsigned int *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures res_wrapped: *\old(res) ≡ (unsigned long)(\old(a) * \old(b));
+    ensures
+      result_overflow:
+        \old(a) * \old(b) ≡ (unsigned long)(\old(a) * \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_umull_overflow(unsigned long a, unsigned long b,
+                               unsigned long *res);
+
+/*@ requires valid_res: \valid(res);
+    ensures initialization: res: \initialized(\old(res));
+    ensures
+      res_wrapped: *\old(res) ≡ (unsigned long long)(\old(a) * \old(b));
+    ensures
+      result_overflow:
+        \old(a) * \old(b) ≡ (unsigned long long)(\old(a) * \old(b))?
+          \result ≡ 0:
+          \result ≡ 1;
+    assigns \result, *res;
+    assigns \result \from a, b;
+    assigns *res \from a, b;
+ */
+_Bool __builtin_umulll_overflow(unsigned long long a, unsigned long long b,
+                                unsigned long long *res);
+
+/*@ requires x_nonzero: x ≢ 0;
+    ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_clz(unsigned int x);
+
+/*@ requires x_nonzero: x ≢ 0;
+    ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_clzl(unsigned long x);
+
+/*@ requires x_nonzero: x ≢ 0;
+    ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_clzll(unsigned long long x);
+
+/*@ requires x_nonzero: x ≢ 0;
+    ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_ctz(unsigned int x);
+
+/*@ requires x_nonzero: x ≢ 0;
+    ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_ctzl(unsigned long x);
+
+/*@ requires x_nonzero: x ≢ 0;
+    ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_ctzll(unsigned long long x);
+
+/*@ ensures result_is_bit_count: 0 ≤ \result ≤ 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_popcount(unsigned int x);
+
+/*@ ensures result_is_bit_count: 0 ≤ \result ≤ 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_popcountl(unsigned long x);
+
+/*@ ensures result_is_bit_count: 0 ≤ \result ≤ 8 * sizeof(\old(x));
+    assigns \result;
+    assigns \result \from (indirect: x);
+ */
+int __builtin_popcountll(unsigned long long x);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    assigns \result;
+    assigns \result \from (indirect: *(filename + (0 ..))), (indirect: mode);
+ */
+extern int creat(char const *filename, mode_t mode);
+
+/*@ assigns \result;
+    assigns \result \from fd, cmd; */
+extern int fcntl(int fd, int cmd, void * const *__va_params);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(filename + (0 ..))), (indirect: flags);
+ */
+extern int open(char const *filename, int flags, void * const *__va_params);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    assigns \result;
+    assigns \result
+      \from (indirect: dirfd), (indirect: *(filename + (0 ..))),
+            (indirect: flags);
+ */
+extern int openat(int dirfd, char const *filename, int flags,
+                  void * const *__va_params);
+
+/*@ requires cmd_has_void_arg: cmd ≡ 1 ∨ cmd ≡ 3 ∨ cmd ≡ 9;
+    assigns \result;
+    assigns \result \from fd, cmd;
+ */
+extern int __va_fcntl_void(int fd, int cmd);
+
+/*@ requires
+      cmd_has_int_arg:
+        cmd ≡ 0 ∨ cmd ≡ 0x406 ∨ cmd ≡ 4 ∨ cmd ≡ 8 ∨ cmd ≡ 2;
+    assigns \result;
+    assigns \result \from fd, cmd, arg;
+ */
+extern int __va_fcntl_int(int fd, int cmd, int arg);
+
+/*@ requires cmd_as_flock_arg: cmd ≡ 5 ∨ cmd ≡ 6 ∨ cmd ≡ 7;
+    requires valid_arg: \valid(arg);
+    assigns \result, *arg;
+    assigns \result \from fd, cmd, *arg;
+    assigns *arg \from fd, cmd, *arg;
+ */
+extern int __va_fcntl_flock(int fd, int cmd, struct flock *arg);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    requires flag_not_CREAT: (flags & 0x40) ≡ 0;
+    assigns \result;
+    assigns \result
+      \from (indirect: *(filename + (0 ..))), (indirect: flags);
+ */
+extern int __va_open_void(char const *filename, int flags);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    assigns \result;
+    assigns \result
+      \from (indirect: *(filename + (0 ..))), (indirect: flags),
+            (indirect: mode);
+ */
+extern int __va_open_mode_t(char const *filename, int flags, mode_t mode);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    requires flag_not_CREAT: (flags & 0x40) ≡ 0;
+    assigns \result;
+    assigns \result
+      \from (indirect: dirfd), (indirect: *(filename + (0 ..))),
+            (indirect: flags);
+ */
+extern int __va_openat_void(int dirfd, char const *filename, int flags);
+
+/*@ requires valid_filename: valid_read_string(filename);
+    assigns \result;
+    assigns \result
+      \from (indirect: dirfd), (indirect: *(filename + (0 ..))),
+            (indirect: flags), (indirect: mode);
+ */
+extern int __va_openat_mode_t(int dirfd, char const *filename, int flags,
+                              mode_t mode);
+
+/*@ ghost extern int __fc_tz __attribute__((__FRAMA_C_MODEL__)); */
+
+/*@ requires valid_path: valid_read_string(path);
+    requires
+      valid_times_or_null: \valid_read(times + (0 .. 1)) ∨ times ≡ \null;
+    assigns \result;
+    assigns \result
+      \from (indirect: *(path + (0 .. strlen{Old}(path)))),
+            (indirect: times), (indirect: *(times + (0 .. 1)));
+ */
+extern int utimes(char const *path, struct timeval const * /*[2]*/ times);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns tv->tv_sec, tv->tv_usec, *((struct timezone *)tz), \result;
+    assigns tv->tv_sec \from __fc_time;
+    assigns tv->tv_usec \from __fc_time;
+    assigns *((struct timezone *)tz) \from __fc_tz;
+    assigns \result
+      \from (indirect: tv), (indirect: tz), *tv, *((struct timezone *)tz),
+            __fc_tz;
+    
+    behavior tv_and_tz_null:
+      assumes null_tv_tz: tv ≡ \null ∧ tz ≡ \null;
+      assigns \result;
+      assigns \result \from (indirect: __fc_tz);
+    
+    behavior tv_not_null:
+      assumes non_null_tv_null_tz: tv ≢ \null ∧ tz ≡ \null;
+      ensures
+        initialization: tv_sec: tv_usec:
+          \initialized(&\old(tv)->tv_sec) ∧
+          \initialized(&\old(tv)->tv_usec);
+      ensures tv_usec_bounded: 0 ≤ \old(tv)->tv_usec ≤ 999999;
+      assigns tv->tv_sec, tv->tv_usec, \result;
+      assigns tv->tv_sec \from (indirect: __fc_time);
+      assigns tv->tv_usec \from (indirect: __fc_time);
+      assigns \result \from (indirect: *tv), (indirect: __fc_tz);
+    
+    behavior tz_not_null:
+      assumes null_tv_non_null_tz: tv ≡ \null ∧ tz ≢ \null;
+      ensures initialization: tz: \initialized((struct timezone *)\old(tz));
+      assigns *((struct timezone *)tz), \result;
+      assigns *((struct timezone *)tz) \from __fc_tz;
+      assigns \result
+        \from (indirect: *((struct timezone *)tz)), (indirect: __fc_tz);
+    
+    behavior tv_and_tz_not_null:
+      assumes non_null_tv_tz: tv ≢ \null ∧ tz ≢ \null;
+      ensures
+        initialization: tv_sec: tv_usec:
+          \initialized(&\old(tv)->tv_sec) ∧
+          \initialized(&\old(tv)->tv_usec);
+      ensures initialization: tz: \initialized((struct timezone *)\old(tz));
+      assigns tv->tv_sec, tv->tv_usec, *((struct timezone *)tz), \result;
+      assigns tv->tv_sec \from (indirect: __fc_time);
+      assigns tv->tv_usec \from (indirect: __fc_time);
+      assigns *((struct timezone *)tz) \from __fc_tz;
+      assigns \result
+        \from (indirect: *tv), (indirect: *((struct timezone *)tz)),
+              (indirect: __fc_tz);
+    
+    complete behaviors tv_and_tz_not_null,
+                       tz_not_null,
+                       tv_not_null,
+                       tv_and_tz_null;
+    disjoint behaviors tv_and_tz_not_null,
+                       tz_not_null,
+                       tv_not_null,
+                       tv_and_tz_null;
+ */
+extern int gettimeofday(struct timeval * __restrict tv, void * __restrict tz);
+
+/*@ requires valid_tv_or_null: \valid_read(tv) ∨ tv ≡ \null;
+    requires valid_tz_or_null: \valid_read(tz) ∨ tz ≡ \null;
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns __fc_time, __fc_tz, \result;
+    assigns __fc_time
+      \from tv->tv_sec, tv->tv_usec, tz->tz_dsttime, tz->tz_minuteswest;
+    assigns __fc_tz
+      \from tv->tv_sec, tv->tv_usec, tz->tz_dsttime, tz->tz_minuteswest;
+    assigns \result \from (indirect: *tv), (indirect: *tz);
+ */
+extern int settimeofday(struct timeval const *tv, struct timezone const *tz);
+
+/*@ ghost
+  struct itimerval volatile __fc_itimer_real __attribute__((__FRAMA_C_MODEL__));
+  */
+/*@ ghost
+  struct itimerval volatile __fc_itimer_virtual __attribute__((__FRAMA_C_MODEL__));
+  */
+/*@ ghost
+  struct itimerval volatile __fc_itimer_prof __attribute__((__FRAMA_C_MODEL__));
+  */
+/*@ requires valid_curr_value: \valid(curr_value);
+    ensures initialization: curr_value: \initialized(\old(curr_value));
+    assigns \result, *curr_value;
+    assigns \result \from (indirect: which);
+    assigns *curr_value
+      \from __fc_itimer_real, __fc_itimer_virtual, __fc_itimer_prof;
+    
+    behavior real:
+      assumes itimer_real: which ≡ 0;
+      ensures result_ok: \result ≡ 0;
+      assigns \result, *curr_value;
+      assigns \result \from \nothing;
+      assigns *curr_value \from __fc_itimer_real;
+    
+    behavior virtual:
+      assumes itimer_virtual: which ≡ 1;
+      ensures result_ok: \result ≡ 0;
+      assigns \result, *curr_value;
+      assigns \result \from \nothing;
+      assigns *curr_value \from __fc_itimer_virtual;
+    
+    behavior prof:
+      assumes itimer_prof: which ≡ 2;
+      ensures result_ok: \result ≡ 0;
+      assigns \result, *curr_value;
+      assigns \result \from \nothing;
+      assigns *curr_value \from __fc_itimer_prof;
+    
+    behavior invalid:
+      assumes invalid_which: which ≢ 0 ∧ which ≢ 1 ∧ which ≢ 2;
+      ensures result_error: \result ≡ -1;
+      assigns \result;
+      assigns \result \from \nothing;
+    
+    complete behaviors invalid, prof, virtual, real;
+    disjoint behaviors invalid, prof, virtual, real;
+ */
+extern int getitimer(int which, struct itimerval *curr_value);
+
+/*@ requires valid_new_value: \valid_read(new_value);
+    requires
+      old_value_null_or_valid: old_value ≡ \null ∨ \valid(old_value);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *old_value, \result;
+    assigns *old_value
+      \from (indirect: which), (indirect: old_value), (indirect: new_value),
+            __fc_itimer_real, __fc_itimer_virtual, __fc_itimer_prof;
+    assigns \result
+      \from (indirect: which), (indirect: new_value), (indirect: *new_value);
+    
+    behavior real:
+      assumes
+        itimer_real_and_valid:
+          which ≡ 0 ≤ new_value->it_value.tv_usec ≤ 999999 ∧
+          0 ≤ new_value->it_interval.tv_usec ≤ 999999;
+      ensures result_ok: \result ≡ 0;
+      ensures initialization: old_value: \initialized(\old(old_value));
+      assigns \result, *old_value, __fc_itimer_real;
+      assigns \result \from \nothing;
+      assigns *old_value \from __fc_itimer_real;
+      assigns __fc_itimer_real \from *new_value;
+    
+    behavior virtual:
+      assumes
+        itimer_virtual_and_valid:
+          which ≡ 1 ∧ 0 ≤ new_value->it_value.tv_usec ≤ 999999 ∧
+          0 ≤ new_value->it_interval.tv_usec ≤ 999999;
+      ensures result_ok: \result ≡ 0;
+      ensures initialization: old_value: \initialized(\old(old_value));
+      assigns \result, *old_value;
+      assigns \result \from \nothing;
+      assigns *old_value \from __fc_itimer_virtual;
+    
+    behavior prof:
+      assumes
+        itimer_prof_and_valid:
+          which ≡ 2 ∧ 0 ≤ new_value->it_value.tv_usec ≤ 999999 ∧
+          0 ≤ new_value->it_interval.tv_usec ≤ 999999;
+      ensures result_ok: \result ≡ 0;
+      ensures initialization: old_value: \initialized(\old(old_value));
+      assigns \result, *old_value;
+      assigns \result \from \nothing;
+      assigns *old_value \from __fc_itimer_prof;
+    
+    behavior invalid:
+      assumes
+        invalid_itimer_or_new_value:
+          (which ≢ 0 ∧ which ≢ 1 ∧ which ≢ 2) ∨
+          ¬(0 ≤ new_value->it_value.tv_usec ≤ 999999 ∧
+             0 ≤ new_value->it_interval.tv_usec ≤ 999999);
+      ensures result_error: \result ≡ -1;
+      assigns \result;
+      assigns \result \from \nothing;
+    
+    disjoint behaviors invalid, prof, virtual, real;
+ */
+extern int setitimer(int which,
+                     struct itimerval const * __restrict new_value,
+                     struct itimerval * __restrict old_value);
+
+/*@ ghost int volatile __fc_fds_state; */
+/*@ requires nfds: nfds ≥ 0;
+    requires readfs: readfds ≡ \null ∨ \valid(readfds);
+    requires writefds: writefds ≡ \null ∨ \valid(writefds);
+    requires errorfds: errorfds ≡ \null ∨ \valid(errorfds);
+    requires timeout: timeout ≡ \null ∨ \valid(timeout);
+    assigns __fc_fds_state, *readfds, *writefds, *errorfds, *timeout,
+            \result;
+    assigns __fc_fds_state \from __fc_fds_state;
+    assigns *readfds
+      \from (indirect: nfds), (indirect: readfds), (indirect: *readfds),
+            (indirect: writefds), (indirect: *writefds),
+            (indirect: errorfds), (indirect: *errorfds), (indirect: timeout),
+            (indirect: *timeout), __fc_fds_state;
+    assigns *writefds
+      \from (indirect: nfds), (indirect: readfds), (indirect: *readfds),
+            (indirect: writefds), (indirect: *writefds),
+            (indirect: errorfds), (indirect: *errorfds), (indirect: timeout),
+            (indirect: *timeout), __fc_fds_state;
+    assigns *errorfds
+      \from (indirect: nfds), (indirect: readfds), (indirect: *readfds),
+            (indirect: writefds), (indirect: *writefds),
+            (indirect: errorfds), (indirect: *errorfds), (indirect: timeout),
+            (indirect: *timeout), __fc_fds_state;
+    assigns *timeout
+      \from (indirect: nfds), (indirect: readfds), (indirect: *readfds),
+            (indirect: writefds), (indirect: *writefds),
+            (indirect: errorfds), (indirect: *errorfds), (indirect: timeout),
+            (indirect: *timeout), __fc_fds_state;
+    assigns \result
+      \from (indirect: nfds), (indirect: readfds), (indirect: *readfds),
+            (indirect: writefds), (indirect: *writefds),
+            (indirect: errorfds), (indirect: *errorfds), (indirect: timeout),
+            (indirect: *timeout), __fc_fds_state;
+    
+    behavior read_notnull:
+      assumes readfds_is_not_null: readfds ≢ \null;
+      ensures initialization: readfds: \initialized(\old(readfds));
+    
+    behavior write_notnull:
+      assumes writefds_is_not_null: writefds ≢ \null;
+      ensures initialization: writefds: \initialized(\old(writefds));
+    
+    behavior error_notnull:
+      assumes errorfds_is_not_null: errorfds ≢ \null;
+      ensures initialization: errorfds: \initialized(\old(errorfds));
+    
+    behavior timeout_notnull:
+      assumes timeout_is_not_null: timeout ≢ \null;
+      ensures initialization: timeout: \initialized(\old(timeout));
+ */
+extern int select(int nfds, fd_set *readfds, fd_set *writefds,
+                  fd_set *errorfds, struct timeval *timeout);
+
+/*@ requires valid_path: valid_read_string(path);
+    requires valid_buf: \valid(buf);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, *buf;
+    assigns \result
+      \from (indirect: path), (indirect: *(path + (0 .. strlen{Old}(path))));
+    assigns *buf
+      \from (indirect: path), (indirect: *(path + (0 .. strlen{Old}(path))));
+ */
+extern int lstat(char const *path, struct stat *buf);
+
+/*@ requires valid_path: valid_read_string(path);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: path), (indirect: *(path + (0 .. strlen{Old}(path)))),
+            (indirect: mode);
+ */
+extern int mkdir(char const *path, mode_t mode);
+
+/*@ requires valid_path: valid_read_string(path);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: path), (indirect: *(path + (0 .. strlen{Old}(path)))),
+            (indirect: mode);
+ */
+extern int mkfifo(char const *path, mode_t mode);
+
+/*@ requires valid_path: valid_read_string(path);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result
+      \from (indirect: path), (indirect: *(path + (0 .. strlen{Old}(path)))),
+            (indirect: mode), (indirect: dev);
+ */
+extern int mknod(char const *path, mode_t mode, dev_t dev);
+
+/*@ requires valid_pathname: valid_read_string(pathname);
+    requires valid_buf: \valid(buf);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    ensures
+      init_on_success: initialization: buf:
+        \result ≡ 0 ⇒ \initialized(\old(buf));
+    assigns \result, *buf;
+    assigns \result \from *(pathname + (0 .. strlen{Old}(pathname)));
+    assigns *buf \from *(pathname + (0 .. strlen{Old}(pathname)));
+ */
+extern int stat(char const *pathname, struct stat *buf);
+
+/*@ assigns \result;
+    assigns \result \from (indirect: cmask); */
+extern mode_t umask(mode_t cmask);
+
+/*@ assigns *(*(outbuf + (0 .. *outbytesleft - 1))), __fc_errno;
+    assigns *(*(outbuf + (0 .. *outbytesleft - 1)))
+      \from *(*(inbuf + (0 .. *inbytesleft - 1)));
+ */
+extern size_t iconv(iconv_t cd, char ** __restrict inbuf,
+                    size_t * __restrict inbytesleft,
+                    char ** __restrict outbuf,
+                    size_t * __restrict outbytesleft);
+
+/*@ ensures result_zero_or_neg: \result ≡ 0 ∨ \result ≡ -1;
+    assigns __fc_errno;
+ */
+extern int iconv_close(iconv_t);
+
+/*@ assigns \result, __fc_errno;
+    assigns \result \from *(tocode + (..)), *(fromcode + (..));
+ */
+extern iconv_t iconv_open(char const *tocode, char const *fromcode);
+
+extern char __fc_basename[256];
+
+char *__fc_p_basename = __fc_basename;
+/*@ requires
+      null_or_valid_string_path: path ≡ \null ∨ valid_read_string(path);
+    ensures
+      result_points_to_internal_storage_or_path:
+        \subset(\result, {__fc_p_basename, \old(path)});
+    assigns *(path + (0 ..)), __fc_basename[0 ..], \result;
+    assigns *(path + (0 ..)) \from *(path + (0 ..)), __fc_basename[0 ..];
+    assigns __fc_basename[0 ..] \from *(path + (0 ..)), __fc_basename[0 ..];
+    assigns \result \from __fc_p_basename, path;
+ */
+extern char *basename(char *path);
+
+extern char __fc_dirname[256];
+
+char *__fc_p_dirname = __fc_dirname;
+/*@ requires
+      null_or_valid_string_path: path ≡ \null ∨ valid_read_string(path);
+    ensures
+      result_points_to_internal_storage_or_path:
+        \subset(\result, {__fc_p_dirname, \old(path)});
+    assigns *(path + (0 ..)), __fc_dirname[0 ..], \result;
+    assigns *(path + (0 ..)) \from *(path + (0 ..)), __fc_dirname[0 ..];
+    assigns __fc_dirname[0 ..] \from *(path + (0 ..)), __fc_dirname[0 ..];
+    assigns \result \from __fc_p_dirname, path;
+ */
+extern char *dirname(char *path);
+
+/*@ requires valid_file_descriptors: \valid(fds + (0 .. nfds - 1));
+    ensures
+      error_timeout_or_bounded:
+        \result ≡ -1 ∨ \result ≡ 0 ∨ (1 ≤ \result ≤ \old(nfds));
+    ensures
+      initialization: revents:
+        \initialized(&(\old(fds) + (0 .. \old(nfds) - 1))->revents);
+    assigns (fds + (0 .. nfds - 1))->revents, \result;
+    assigns (fds + (0 .. nfds - 1))->revents
+      \from (indirect: (fds + (0 .. nfds - 1))->fd),
+            (fds + (0 .. nfds - 1))->events, (indirect: nfds),
+            (indirect: timeout), (indirect: Frama_C_entropy_source);
+    assigns \result
+      \from (indirect: (fds + (0 .. nfds - 1))->fd),
+            (indirect: (fds + (0 .. nfds - 1))->events), (indirect: nfds),
+            (indirect: timeout), (indirect: Frama_C_entropy_source);
+ */
+extern int poll(struct pollfd *fds, nfds_t nfds, int timeout);
+
+/*@ requires valid_cond: \valid(cond);
+    ensures sucess: \result ≡ 0;
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+extern int pthread_cond_broadcast(pthread_cond_t *cond);
+
+/*@ requires valid_cond: \valid(cond);
+    ensures success_or_error: \result ≡ 0 ∨ \result ≡ 16;
+    assigns \result;
+    assigns \result \from (indirect: *cond);
+ */
+extern int pthread_cond_destroy(pthread_cond_t *cond);
+
+/*@ requires valid_cond: \valid(cond);
+    requires valid_null_attr: attr ≡ \null ∨ \valid_read(attr);
+    ensures initialization: cond: \initialized(\old(cond));
+    ensures success: \result ≡ 0;
+    assigns *cond, \result;
+    assigns *cond \from *attr;
+    assigns \result \from \nothing;
+ */
+extern int pthread_cond_init(pthread_cond_t * __restrict cond,
+                             pthread_condattr_t const * __restrict attr);
+
+/*@ requires valid_cond: \valid(cond);
+    requires valid_mutex: \valid(mutex);
+    ensures success: \result ≡ 0;
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+extern int pthread_cond_wait(pthread_cond_t * __restrict cond,
+                             pthread_mutex_t * __restrict mutex);
+
+/*@ requires valid_thread: \valid(thread);
+    requires valid_null_attr: attr ≡ \null ∨ \valid_read(attr);
+    requires valid_routine: \valid_function(start_routine);
+    requires valid_null_arg: arg ≡ \null ∨ \valid((char *)arg);
+    ensures
+      success_or_error:
+        \result ≡ 0 ∨ \result ≡ 11 ∨ \result ≡ 22 ∨ \result ≡ 1;
+    assigns *thread, \result;
+    assigns *thread \from *attr;
+    assigns \result \from (indirect: *attr);
+ */
+extern int pthread_create(pthread_t * __restrict thread,
+                          pthread_attr_t const * __restrict attr,
+                          void *(*start_routine)(void *),
+                          void * __restrict arg);
+
+/*@ requires valid_or_null_retval: retval ≡ \null ∨ \valid(retval);
+    ensures
+      success_or_error:
+        \result ≡ 0 ∨ \result ≡ 35 ∨ \result ≡ 22 ∨ \result ≡ 3;
+    assigns *retval, \result;
+    assigns *retval \from thread;
+    assigns \result \from (indirect: thread);
+    
+    behavior ignore_retval:
+      assumes null_retval: retval ≡ \null;
+      assigns \result;
+      assigns \result \from (indirect: thread);
+    
+    behavior use_retval:
+      assumes valid_retval: \valid(retval);
+      assigns *retval, \result;
+      assigns *retval \from thread;
+      assigns \result \from (indirect: thread);
+ */
+extern int pthread_join(pthread_t thread, void **retval);
+
+/*@ requires mutex_valid: \valid(mutex);
+    ensures init_or_busy: \result ≡ 0 ∨ \result ≡ 16;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex;
+    assigns \result \from (indirect: *mutex);
+ */
+extern int pthread_mutex_destroy(pthread_mutex_t *mutex);
+
+/*@ requires mutex_valid: \valid(mutex);
+    requires attrs_valid_or_null: attrs ≡ \null ∨ \valid_read(attrs);
+    ensures
+      initialization: success_or_error:
+        (\result ≡ 0 ∧ \initialized(\old(mutex))) ∨ \result ≡ 11 ∨
+        \result ≡ 12 ∨ \result ≡ 1 ∨ \result ≡ 22;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex, *attrs;
+    assigns \result \from (indirect: *mutex), (indirect: *attrs);
+ */
+extern int pthread_mutex_init(pthread_mutex_t * __restrict mutex,
+                              pthread_mutexattr_t const * __restrict attrs);
+
+/*@ requires mutex_valid: \valid(mutex);
+    ensures
+      success_or_error:
+        \result ≡ 0 ∨ \result ≡ 11 ∨ \result ≡ 22 ∨
+        \result ≡ 35;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex;
+    assigns \result \from (indirect: *mutex);
+ */
+extern int pthread_mutex_lock(pthread_mutex_t *mutex);
+
+/*@ requires mutex_valid: \valid(mutex);
+    ensures success_or_error: \result ≡ 0 ∨ \result ≡ 1;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex;
+    assigns \result \from (indirect: *mutex);
+ */
+extern int pthread_mutex_unlock(pthread_mutex_t *mutex);
+
+/*@ requires valid_attr: \valid(attr);
+    ensures success_or_error: \result ≡ 0 ∨ \result ≡ 22;
+    assigns *attr, \result;
+    assigns *attr \from *attr;
+    assigns \result \from (indirect: *attr);
+ */
+extern int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
+
+/*@ requires valid_attr: \valid(attr);
+    ensures success_or_error: \result ≡ 0 ∨ \result ≡ 12;
+    assigns \result, *attr;
+    assigns \result \from \nothing;
+    assigns *attr \from \nothing;
+ */
+extern int pthread_mutexattr_init(pthread_mutexattr_t *attr);
+
+/*@ requires valid_attr: \valid(attr);
+    ensures success_or_error: \result ≡ 0 ∨ \result ≡ 22;
+    assigns \result, *attr;
+    assigns \result \from (indirect: type);
+    assigns *attr \from (indirect: type);
+ */
+extern int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);
+
+extern char __fc_getpwuid_pw_name[64];
+
+extern char __fc_getpwuid_pw_passwd[64];
+
+extern char __fc_getpwuid_pw_dir[64];
+
+extern char __fc_getpwuid_pw_shell[64];
+
+struct passwd __fc_pwd =
+  {.pw_name = __fc_getpwuid_pw_name,
+   .pw_passwd = __fc_getpwuid_pw_passwd,
+   .pw_uid = 0U,
+   .pw_gid = 0U,
+   .pw_gecos = (char *)0,
+   .pw_dir = __fc_getpwuid_pw_dir,
+   .pw_shell = __fc_getpwuid_pw_shell};
+struct passwd *__fc_p_pwd = & __fc_pwd;
+/*@ requires valid_name: valid_read_string(name);
+    ensures
+      result_null_or_internal_struct:
+        \result ≡ \null ∨ \result ≡ __fc_p_pwd;
+    assigns \result, __fc_pwd;
+    assigns \result \from __fc_p_pwd, (indirect: *(name + (0 ..)));
+    assigns __fc_pwd \from (indirect: *(name + (0 ..)));
+ */
+extern struct passwd *getpwnam(char const *name);
+
+/*@ ensures
+      result_null_or_internal_struct:
+        \result ≡ \null ∨ \result ≡ __fc_p_pwd;
+    assigns \result, __fc_pwd;
+    assigns \result \from __fc_p_pwd, (indirect: uid);
+    assigns __fc_pwd \from (indirect: uid);
+ */
+extern struct passwd *getpwuid(uid_t uid);
+
+/*@ assigns *(env + (0 .. 4)); */
+extern int setjmp(int * /*[5]*/ env);
+
+/*@ ensures never_terminates: \false;
+    assigns \nothing; */
+extern void longjmp(int * /*[5]*/ env, int val);
+
+/*@ ensures never_terminates: \false;
+    assigns \nothing; */
+extern void siglongjmp(sigjmp_buf env, int val);
+
+/*@ assigns \result;
+    assigns \result \from (indirect: fd), (indirect: request);
+ */
+extern int __va_ioctl_void(int fd, int request);
+
+/*@ assigns \result;
+    assigns \result
+      \from (indirect: fd), (indirect: request), (indirect: arg);
+ */
+extern int __va_ioctl_int(int fd, int request, int arg);
+
+/*@ assigns \result, *((char *)argp + (0 ..));
+    assigns \result
+      \from (indirect: fd), (indirect: request),
+            (indirect: *((char *)argp + (0 ..)));
+    assigns *((char *)argp + (0 ..))
+      \from (indirect: fd), (indirect: request), *((char *)argp + (0 ..));
+ */
+extern int __va_ioctl_ptr(int fd, int request, void *argp);
+
+/*@ ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result;
+    assigns \result \from (indirect: fd), (indirect: operation);
+ */
+extern int flock(int fd, int operation);
+
+CODE facilitynames[23] =
+  {{.c_name = "auth", .c_val = 4 << 3},
+   {.c_name = "authpriv", .c_val = 10 << 3},
+   {.c_name = "cron", .c_val = 9 << 3},
+   {.c_name = "daemon", .c_val = 3 << 3},
+   {.c_name = "ftp", .c_val = 11 << 3},
+   {.c_name = "kern", .c_val = 0 << 3},
+   {.c_name = "lpr", .c_val = 6 << 3},
+   {.c_name = "mail", .c_val = 2 << 3},
+   {.c_name = "mark", .c_val = 24 | 0},
+   {.c_name = "news", .c_val = 7 << 3},
+   {.c_name = "security", .c_val = 4 << 3},
+   {.c_name = "syslog", .c_val = 5 << 3},
+   {.c_name = "user", .c_val = 1 << 3},
+   {.c_name = "uucp", .c_val = 8 << 3},
+   {.c_name = "local0", .c_val = 16 << 3},
+   {.c_name = "local1", .c_val = 17 << 3},
+   {.c_name = "local2", .c_val = 18 << 3},
+   {.c_name = "local3", .c_val = 19 << 3},
+   {.c_name = "local4", .c_val = 20 << 3},
+   {.c_name = "local5", .c_val = 21 << 3},
+   {.c_name = "local6", .c_val = 22 << 3},
+   {.c_name = "local7", .c_val = 23 << 3},
+   {.c_name = (char const *)0, .c_val = -1}};
+CODE prioritynames[13] =
+  {{.c_name = "alert", .c_val = 1},
+   {.c_name = "crit", .c_val = 2},
+   {.c_name = "debug", .c_val = 7},
+   {.c_name = "emerg", .c_val = 0},
+   {.c_name = "err", .c_val = 3},
+   {.c_name = "error", .c_val = 3},
+   {.c_name = "info", .c_val = 6},
+   {.c_name = "none", .c_val = 0x10},
+   {.c_name = "notice", .c_val = 5},
+   {.c_name = "panic", .c_val = 0},
+   {.c_name = "warn", .c_val = 4},
+   {.c_name = "warning", .c_val = 4},
+   {.c_name = (char const *)0, .c_val = -1}};
+/*@ assigns \nothing; */
+extern void closelog(void);
+
+/*@ assigns \nothing; */
+extern void openlog(char const *, int, int);
+
+/*@ assigns \nothing; */
+extern int setlogmask(int);
+
+/*@ assigns \nothing; */
+extern void syslog(int, char const *, void * const *__va_params);
+
+/*@ assigns \nothing; */
+extern void vsyslog(int, char const *, va_list);
+
+/*@ assigns \result;
+    assigns \result \from which, who; */
+extern int getpriority(int which, id_t who);
+
+/*@ assigns \result;
+    assigns \result \from which, who, prio; */
+extern int setpriority(int which, id_t who, int prio);
+
+/*@ requires valid_rlp: \valid(rlp);
+    assigns \result, *rlp;
+    assigns \result \from resource;
+    assigns *rlp \from resource;
+ */
+extern int getrlimit(int resource, struct rlimit *rlp);
+
+/*@ requires valid_r_usage: \valid(r_usage);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *r_usage, \result;
+    assigns *r_usage \from who;
+    assigns \result \from (indirect: who);
+ */
+extern int getrusage(int who, struct rusage *r_usage);
+
+/*@ requires valid_rlp: \valid_read(rlp);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *rlp, \result;
+    assigns *rlp \from resource;
+    assigns \result \from (indirect: resource), (indirect: *rlp);
+ */
+extern int setrlimit(int resource, struct rlimit const *rlp);
+
+/*@ requires valid_buffer: \valid(buffer);
+    assigns \result, *buffer;
+    assigns \result \from __fc_time;
+    assigns *buffer \from __fc_time;
+ */
+extern clock_t times(struct tms *buffer);
+
+/*@ requires valid_name: \valid(name);
+    ensures result_ok_or_error: -1 ≤ \result;
+    ensures initialization: name: \initialized(\old(name));
+    assigns *name, \result;
+    assigns *name \from \nothing;
+    assigns \result \from \nothing;
+ */
+extern int uname(struct utsname *name);
+
+/*@ ensures result_ok_or_error: \result ≡ -1 ∨ \result ≥ 0;
+    ensures
+      initialization: stat_loc_init_on_success:
+        \result ≥ 0 ∧ \old(stat_loc) ≢ \null ⇒
+        \initialized(\old(stat_loc));
+    assigns \result, *stat_loc;
+    assigns \result \from \nothing;
+    assigns *stat_loc \from \nothing;
+    
+    behavior stat_loc_null:
+      assumes stat_loc_null: stat_loc ≡ \null;
+      assigns \result;
+      assigns \result \from \nothing;
+    
+    behavior stat_loc_non_null:
+      assumes stat_loc_non_null: stat_loc ≢ \null;
+      requires valid_stat_loc: \valid(stat_loc);
+ */
+extern pid_t wait(int *stat_loc);
+
+/*@ ensures result_ok_or_error: \result ≡ -1 ∨ \result ≥ 0;
+    ensures
+      initialization: stat_loc_init_on_success:
+        \result ≥ 0 ∧ \old(stat_loc) ≢ \null ⇒
+        \initialized(\old(stat_loc));
+    assigns \result, *stat_loc;
+    assigns \result \from (indirect: options);
+    assigns *stat_loc \from (indirect: options);
+    
+    behavior stat_loc_null:
+      assumes stat_loc_null: stat_loc ≡ \null;
+      assigns \result;
+      assigns \result \from \nothing;
+    
+    behavior stat_loc_non_null:
+      assumes stat_loc_non_null: stat_loc ≢ \null;
+      requires valid_stat_loc: \valid(stat_loc);
+ */
+extern pid_t waitpid(pid_t pid, int *stat_loc, int options);
+
+/*@ requires valid_termios_p: \valid_read(termios_p);
+    assigns \result;
+    assigns \result \from (indirect: termios_p), *termios_p;
+ */
+extern speed_t cfgetispeed(struct termios const *termios_p);
+
+/*@ requires valid_termios_p: \valid_read(termios_p);
+    assigns \result;
+    assigns \result \from (indirect: termios_p), *termios_p;
+ */
+extern speed_t cfgetospeed(struct termios const *termios_p);
+
+/*@ requires valid_termios_p: \valid(termios_p);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, *termios_p;
+    assigns \result \from (indirect: termios_p), speed;
+    assigns *termios_p \from (indirect: termios_p), speed;
+ */
+extern int cfsetispeed(struct termios *termios_p, speed_t speed);
+
+/*@ requires valid_termios_p: \valid(termios_p);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, *termios_p;
+    assigns \result \from (indirect: termios_p), speed;
+    assigns *termios_p \from (indirect: termios_p), speed;
+ */
+extern int cfsetospeed(struct termios *termios_p, speed_t speed);
+
+/*@ requires
+      valid_queue_selector:
+        queue_selector ≡ 0 ∨ queue_selector ≡ 1 ∨
+        queue_selector ≡ 2;
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns \result, Frama_C_entropy_source;
+    assigns \result
+      \from (indirect: fd), (indirect: queue_selector),
+            (indirect: Frama_C_entropy_source);
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+extern int tcflush(int fd, int queue_selector);
+
+/*@ requires valid_termios_p: \valid(termios_p);
+    assigns \result, *termios_p, Frama_C_entropy_source;
+    assigns \result \from (indirect: fd), (indirect: Frama_C_entropy_source);
+    assigns *termios_p
+      \from (indirect: fd), (indirect: Frama_C_entropy_source);
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+    
+    behavior ok:
+      assumes nondet: Frama_C_entropy_source ≡ 0;
+      ensures initialization: termios_p: \initialized(\old(termios_p));
+      ensures result_ok: \result ≡ 0;
+    
+    behavior error:
+      assumes nondet: Frama_C_entropy_source ≢ 0;
+      ensures result_error: \result ≡ -1;
+    
+    complete behaviors error, ok;
+    disjoint behaviors error, ok;
+ */
+extern int tcgetattr(int fd, struct termios *termios_p);
+
+/*@ requires valid_termios_p: \valid(termios_p);
+    ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1;
+    assigns *termios_p, Frama_C_entropy_source, \result;
+    assigns *termios_p
+      \from (indirect: fd), (indirect: optional_actions),
+            (indirect: Frama_C_entropy_source), *termios_p;
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+    assigns \result
+      \from (indirect: fd), (indirect: optional_actions),
+            (indirect: Frama_C_entropy_source), (indirect: *termios_p);
+ */
+extern int tcsetattr(int fd, int optional_actions, struct termios *termios_p);
+
+void main(void)
+{
+  /*@ assert __fc_p_fopen ≡ (FILE *)(&__fc_fopen); */ ;
+  /*@ assert __fc_p_opendir ≡ (DIR *)(&__fc_opendir); */ ;
+  /*@ assert __fc_p_time_tm ≡ &__fc_time_tm; */ ;
+  /*@ assert __fc_p_strerror ≡ (char *)__fc_strerror; */ ;
+  return;
+}
+
+
+>>>>>>> origin/master
diff --git a/tests/libc/oracle/time_h.res.oracle b/tests/libc/oracle/time_h.res.oracle
index fae21f26c47637b2be749f1d6179e68454cdb895..ac64d0de8c02f6f8048bb27eb519f11f7c01c61b 100644
--- a/tests/libc/oracle/time_h.res.oracle
+++ b/tests/libc/oracle/time_h.res.oracle
@@ -224,6 +224,15 @@
 [eva] computing for function gmtime_r <- main.
   Called from time_h.c:62.
 [eva] Done for function gmtime_r
+[eva] computing for function asctime <- main.
+  Called from tests/libc/time_h.c:64.
+[eva] using specification for function asctime
+[eva] tests/libc/time_h.c:64: 
+  function asctime: precondition 'valid_timeptr' got status valid.
+[eva] tests/libc/time_h.c:64: 
+  function asctime: precondition 'initialization,init_timeptr' got status valid.
+[eva] Done for function asctime
+[eva:alarm] tests/libc/time_h.c:65: Warning: assertion got status unknown.
 [eva] Recording results for main
 [eva] done for function main
 [eva] ====== VALUES COMPUTED ======
diff --git a/tests/libc/signal_h.c b/tests/libc/signal_h.c
index f8aa063de2edf99c21e12b0d14a974e35ab24b0c..c0d539f925a32964ca7764d56389e9467bf68d3d 100644
--- a/tests/libc/signal_h.c
+++ b/tests/libc/signal_h.c
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: #"-slevel 2"
+   STDOPT: #"-eva-slevel 2"
 */
 #include <signal.h>
 
diff --git a/tests/libc/stdlib_c.c b/tests/libc/stdlib_c.c
index d1dbd85a5a3e9ed1ac0f06f6f455c15bd8006039..33dc8110214a11851008f465801601bf39f23e1b 100644
--- a/tests/libc/stdlib_c.c
+++ b/tests/libc/stdlib_c.c
@@ -1,6 +1,6 @@
 /* run.config
-   STDOPT: #"-eva-no-builtins-auto -slevel 10 -eva-builtin calloc:Frama_C_calloc -eva-alloc-builtin by_stack -eva-msg-key malloc"
-   STDOPT: #"-eva-no-builtins-auto -slevel 10 -eva-builtin calloc:Frama_C_calloc -eva-alloc-builtin by_stack -eva-no-alloc-returns-null -eva-msg-key malloc"
+   STDOPT: #"-eva-no-builtins-auto -eva-slevel 10 -eva-builtin calloc:Frama_C_calloc -eva-alloc-builtin by_stack -eva-msg-key malloc"
+   STDOPT: #"-eva-no-builtins-auto -eva-slevel 10 -eva-builtin calloc:Frama_C_calloc -eva-alloc-builtin by_stack -eva-no-alloc-returns-null -eva-msg-key malloc"
    STDOPT: #"-eva-no-builtins-auto"
 */ // slevel is used to unroll loops
 
diff --git a/tests/libc/string_c.c b/tests/libc/string_c.c
index 05e5dc7c140cd844555e21f6bfb9dbbdd56a3635..e5bff29eaf38398b3cf99d6cddebd238e1d08fc0 100644
--- a/tests/libc/string_c.c
+++ b/tests/libc/string_c.c
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: #"-eva-no-builtins-auto -slevel 1000 -eva-no-skip-stdlib-specs"
+   STDOPT: #"-eva-no-builtins-auto -eva-slevel 1000 -eva-no-skip-stdlib-specs"
 */ // slevel is used to unroll loops
 
 #include "string.c"
diff --git a/tests/libc/string_c_generic.c b/tests/libc/string_c_generic.c
index 57c5461faa5bca844da0593d31bd537eb5025100..0939e6721a7b4b1df9e339ce7ea5b83e2d33dd2d 100644
--- a/tests/libc/string_c_generic.c
+++ b/tests/libc/string_c_generic.c
@@ -1,6 +1,6 @@
 /* run.config
    DEPS: ../../../share/libc/string.c
-   STDOPT: #"-eva-no-builtins-auto -cpp-extra-args=-include../../share/libc/string.c -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../../share/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 79ee7bebacedd761eb4ed6e8cdd472a2e136154a..a94bf5f192f22d7d0c40b3c557e5d4fbd98e7929 100644
--- a/tests/libc/string_c_strchr.c
+++ b/tests/libc/string_c_strchr.c
@@ -1,6 +1,6 @@
 /* run.config
    DEPS: ../../../share/libc/string.c
-   STDOPT: #"-cpp-extra-args=-include../../share/libc/string.c -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../../share/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 e7f30e82d08091877fdbbed27640f17582651892..9f4e89d682b66ce5d186405e2bcd91ad75f6a0e1 100644
--- a/tests/libc/string_c_strstr.c
+++ b/tests/libc/string_c_strstr.c
@@ -1,6 +1,6 @@
 /* run.config
    DEPS: ../../../share/libc/string.c
-   STDOPT: #"-cpp-extra-args=-include../../share/libc/string.c -slevel-function strstr:30 -eva-no-skip-stdlib-specs"
+   STDOPT: #"-cpp-extra-args=-include../../share/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/sys_stat_h.c b/tests/libc/sys_stat_h.c
index 65ddbfc889097a4af94054d53d6bdac3dc8a428c..24a4b3335118005af0fc3e28cfd303f9d32a1b7e 100644
--- a/tests/libc/sys_stat_h.c
+++ b/tests/libc/sys_stat_h.c
@@ -1,5 +1,5 @@
 /*run.config
-  STDOPT: #"-slevel 2"
+  STDOPT: #"-eva-slevel 2"
 */
 #include <sys/stat.h>
 #include <fcntl.h>
diff --git a/tests/libc/sys_wait_h.c b/tests/libc/sys_wait_h.c
index 9eec66c206b1cf766f568412161746f6c6576255..0fe9b221ce15d3d053c1dcccfbe1bbf98007212e 100644
--- a/tests/libc/sys_wait_h.c
+++ b/tests/libc/sys_wait_h.c
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: #"-slevel 4"
+   STDOPT: #"-eva-slevel 4"
  */
 #include <sys/wait.h>
 
diff --git a/tests/libc/termios.c b/tests/libc/termios.c
index 6ba105607a2194a45ec1f905eadd6c9dfa0727a8..78100d57f84a221223fb79f5d0bbf1f2558699c1 100644
--- a/tests/libc/termios.c
+++ b/tests/libc/termios.c
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: +"-slevel 2"
+   STDOPT: +"-eva-slevel 2"
 */
 #include <termios.h>
 #include <fcntl.h>
diff --git a/tests/libc/time_h.c b/tests/libc/time_h.c
index c56c8ef3b96cdefead7c20068c10df481f78ba28..52a142905351a7d2c0f9fb5313707862b4125ee0 100644
--- a/tests/libc/time_h.c
+++ b/tests/libc/time_h.c
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: #"-slevel 4"
+   STDOPT: #"-eva-slevel 4"
  */
 
 #include <time.h>
@@ -61,5 +61,8 @@ int main() {
   struct tm mytime2;
   res_time = gmtime_r(&t, &mytime2);
 
+  time_str = asctime(&mytime);
+  //@ assert valid_string(time_str);
+
   return 0;
 }
diff --git a/tests/libc/unistd_h.c b/tests/libc/unistd_h.c
index 8c3104215bf71005b84e6d834a103ebe75056110..8f0f40681fda9b3925c1fc47c67b7fc35893b381 100644
--- a/tests/libc/unistd_h.c
+++ b/tests/libc/unistd_h.c
@@ -1,6 +1,6 @@
 /*run.config
-  STDOPT: #"-slevel 12" #"-val-split-return auto"
-  STDOPT: #"-variadic-no-translation" #"-slevel 12" #"-val-split-return auto"
+  STDOPT: #"-eva-slevel 12" #"-eva-split-return auto"
+  STDOPT: #"-variadic-no-translation" #"-eva-slevel 12" #"-eva-split-return auto"
 */
 #define _GNU_SOURCE
 #define _XOPEN_SOURCE 600
diff --git a/tests/libc/wchar_c_h.c b/tests/libc/wchar_c_h.c
index ff2b3f2a7d1855818d0732ce7f70aa47fd13be19..8dadb46e2f8bf6ed9d7b3339bb0b193e6a4a08b8 100644
--- a/tests/libc/wchar_c_h.c
+++ b/tests/libc/wchar_c_h.c
@@ -1,6 +1,6 @@
 /* run.config
-   STDOPT: +"-cpp-extra-args=-DTEST_IMPLEMENTATION=1" +"-slevel 1000"
-   STDOPT: +"-slevel 1000"
+   STDOPT: +"-cpp-extra-args=-DTEST_IMPLEMENTATION=1" +"-eva-slevel 1000"
+   STDOPT: +"-eva-slevel 1000"
    COMMENT: slevel is used to ensure all loops are unrolled (including in the
    COMMENT: implementation). 'goto exit' avoids recomputing split branches.
 */
diff --git a/tests/misc/issue109.i b/tests/misc/issue109.i
index 9c1d45bdde57ca67d4c7d18042aaf35ef4d6af98..5f1c470e65412f3cc9466b6fda731bdd5ca41b29 100644
--- a/tests/misc/issue109.i
+++ b/tests/misc/issue109.i
@@ -1,6 +1,6 @@
 /* run.config
    CMXS: @PTEST_NAME@
-   OPT: -eva @EVA_CONFIG@ -slevel-function main:10 -load-module %{dep:@PTEST_NAME@.cmxs}
+   OPT: -eva @EVA_CONFIG@ -eva-slevel-function main:10 -load-module %{dep:@PTEST_NAME@.cmxs}
 */
 void main() {
   int i, j = 0;
diff --git a/tests/misc/log_selfrec.i b/tests/misc/log_selfrec.i
new file mode 100644
index 0000000000000000000000000000000000000000..f65505058bbf38d898556e25d04c0ff4d7b3ee35
--- /dev/null
+++ b/tests/misc/log_selfrec.i
@@ -0,0 +1,3 @@
+/* run.config
+   OPT: -foobar -report-unclassified-error jazz
+*/
diff --git a/tests/misc/oracle/debug_category.16.res.oracle b/tests/misc/oracle/debug_category.16.res.oracle
index 9a7c06e0c61a3109cfa44e99c03e1833ed4e5a85..4b66aa5a7e938bc7d126d01323afab997facaa69 100644
--- a/tests/misc/oracle/debug_category.16.res.oracle
+++ b/tests/misc/oracle/debug_category.16.res.oracle
@@ -8,8 +8,8 @@
   The full backtrace is:
   
   Plug-in test aborted: internal error.
-  Please report as 'crash' at http://bts.frama-c.com/.
+  Please report as 'crash' at https://git.frama-c.com/pub/frama-c/issues
   Your Frama-C version is VERSION
   Note that a version and a backtrace alone often do not contain enough
   information to understand the bug. Guidelines for reporting bugs are at:
-  http://bts.frama-c.com/dokuwiki/doku.php?id=mantis:frama-c:bug_reporting_guidelines
+  https://git.frama-c.com/pub/frama-c/-/wikis/Guidelines-for-reporting-bugs
diff --git a/tests/misc/oracle/log_selfrec.res.oracle b/tests/misc/oracle/log_selfrec.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..a6950e931a0ec56f8a87657fbc4d32fd71e54c8d
--- /dev/null
+++ b/tests/misc/oracle/log_selfrec.res.oracle
@@ -0,0 +1,5 @@
+[report] Monitoring events
+[kernel] User Error: option `-foobar' is unknown.
+  use `bin/toplevel.opt -help' for more information.
+[report] User Error: Invalid action ("JAZZ")
+[kernel] Plug-in report aborted: invalid user input.
diff --git a/tests/misc/oracle/permissive.res.oracle b/tests/misc/oracle/permissive.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..0ab1f5d114cf413d47315f6682d95541022204dc
--- /dev/null
+++ b/tests/misc/oracle/permissive.res.oracle
@@ -0,0 +1,3 @@
+[kernel] Warning: option `-non-existing-option' is unknown, ignoring. [-permissive]
+[kernel] Parsing tests/misc/permissive.i (no preprocessing)
+[kernel] Warning: ignoring non-existing function 'non_existing_function'.
diff --git a/tests/misc/oracle/save_comments.res.oracle b/tests/misc/oracle/save_comments.res.oracle
index 8edc9c8bf2ec8439805ac330f8fcd9670a248e44..c6f404b4504fe8034ef8cc546ed856de53a67fdb 100644
--- a/tests/misc/oracle/save_comments.res.oracle
+++ b/tests/misc/oracle/save_comments.res.oracle
@@ -1,28 +1,52 @@
 [kernel] Parsing save_comments.i (no preprocessing)
 Printing default project first time:
 /* Generated by Frama-C */
+<<<<<<< HEAD
 /*  run.config
    CMXS: @PTEST_NAME@
    OPT: -load-module %{dep:@PTEST_NAME@.cmxs} -keep-comments
  */
+||||||| 362083a770
+/*  run.config
+   EXECNOW: make -s @PTEST_DIR@/@PTEST_NAME@.cmxs
+   OPT: -load-module @PTEST_DIR@/@PTEST_NAME@.cmxs -keep-comments
+ */
+=======
+/* run.config
+   EXECNOW: make -s @PTEST_DIR@/@PTEST_NAME@.cmxs
+   OPT: -load-module @PTEST_DIR@/@PTEST_NAME@.cmxs -keep-comments
+*/
+>>>>>>> origin/master
 int f(void)
 {
   int x = 0;
-  /*  Hello, I'm the f function  */
+  // Hello, I'm the f function 
   return x;
 }
 
 
 Printing default project second time:
 /* Generated by Frama-C */
+<<<<<<< HEAD
 /*  run.config
    CMXS: @PTEST_NAME@
    OPT: -load-module %{dep:@PTEST_NAME@.cmxs} -keep-comments
  */
+||||||| 362083a770
+/*  run.config
+   EXECNOW: make -s @PTEST_DIR@/@PTEST_NAME@.cmxs
+   OPT: -load-module @PTEST_DIR@/@PTEST_NAME@.cmxs -keep-comments
+ */
+=======
+/* run.config
+   EXECNOW: make -s @PTEST_DIR@/@PTEST_NAME@.cmxs
+   OPT: -load-module @PTEST_DIR@/@PTEST_NAME@.cmxs -keep-comments
+*/
+>>>>>>> origin/master
 int f(void)
 {
   int x = 0;
-  /*  Hello, I'm the f function  */
+  // Hello, I'm the f function 
   return x;
 }
 
@@ -35,14 +59,26 @@ In project saved_project, searching for comments between save_comments.i:6 and s
 End of comments
 Printing saved project:
 /* Generated by Frama-C */
+<<<<<<< HEAD
 /*  run.config
    CMXS: @PTEST_NAME@
    OPT: -load-module %{dep:@PTEST_NAME@.cmxs} -keep-comments
  */
+||||||| 362083a770
+/*  run.config
+   EXECNOW: make -s @PTEST_DIR@/@PTEST_NAME@.cmxs
+   OPT: -load-module @PTEST_DIR@/@PTEST_NAME@.cmxs -keep-comments
+ */
+=======
+/* run.config
+   EXECNOW: make -s @PTEST_DIR@/@PTEST_NAME@.cmxs
+   OPT: -load-module @PTEST_DIR@/@PTEST_NAME@.cmxs -keep-comments
+*/
+>>>>>>> origin/master
 int f(void)
 {
   int x = 0;
-  /*  Hello, I'm the f function  */
+  // Hello, I'm the f function 
   return x;
 }
 
diff --git a/tests/misc/permissive.i b/tests/misc/permissive.i
new file mode 100644
index 0000000000000000000000000000000000000000..2daf3446926c7d8e85aa48810de47946f7b7c64a
--- /dev/null
+++ b/tests/misc/permissive.i
@@ -0,0 +1,6 @@
+/*run.config
+  OPT: -permissive -non-existing-option -inline-calls non_existing_function
+*/
+
+void main() {
+}
diff --git a/tests/misc/widen_hints.c b/tests/misc/widen_hints.c
index 9791791713a0969b77c7df865881d4d485122d32..e4f063807c12972b188952fa735a10024d17c844 100644
--- a/tests/misc/widen_hints.c
+++ b/tests/misc/widen_hints.c
@@ -1,7 +1,7 @@
 /* run.config
    OPT: -eva @EVA_CONFIG@ -cpp-extra-args=-DSYNTAX_ERRORS -kernel-warn-key=annot-error=active
    OPT: -eva @EVA_CONFIG@ -cpp-extra-args=-DNONCONST
-   OPT: -eva @EVA_CONFIG@ -slevel 1 -eva-msg-key widen-hints
+   OPT: -eva @EVA_CONFIG@ -eva-slevel 1 -eva-msg-key widen-hints
    OPT: -eva @EVA_CONFIG@ -cpp-extra-args=-DALLGLOBAL -eva-msg-key widen-hints
 */
 #define N 2
diff --git a/tests/misc/widen_hints_float.c b/tests/misc/widen_hints_float.c
index db243cd089d58c8bd1eed80efc483b44fd8ec6fc..a01f0a357842a423528cc508dfc39663b307f0a8 100644
--- a/tests/misc/widen_hints_float.c
+++ b/tests/misc/widen_hints_float.c
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: #"-val-subdivide-non-linear 20"
+   STDOPT: #"-eva-subdivide-non-linear 20"
 */
 
 
diff --git a/tests/pdg/top_pdg_input.c b/tests/pdg/top_pdg_input.c
index 7a0e2f57246d1bb5247027af4152bb4142fbe4ff..1fa9bc5856422277ce593946c82f6b026885afe5 100644
--- a/tests/pdg/top_pdg_input.c
+++ b/tests/pdg/top_pdg_input.c
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: +"-eva -pdg -out -input -deps -no-results-function no_results -eva-no-builtins-auto -load-module pdg -pdg -then -main main_asm"
+   STDOPT: +"-eva -pdg -out -input -deps -eva-no-results-function no_results -eva-no-builtins-auto -load-module pdg -pdg -then -main main_asm"
 */
 volatile int nondet;
 int no_results() {return 1;}
diff --git a/tests/rte/oracle/twofunc3.res.oracle b/tests/rte/oracle/twofunc3.res.oracle
index 5ba5ff7a353b3b41a67e633aa35c0bf8d9ba1204..a98f4013bdb3f23fa96354aa96fa3b6adf89a3ce 100644
--- a/tests/rte/oracle/twofunc3.res.oracle
+++ b/tests/rte/oracle/twofunc3.res.oracle
@@ -1,125 +1 @@
 [kernel] Parsing twofunc3.c (with preprocessing)
-[rte] annotating function f
-[rte] annotating function main
-/* Generated by Frama-C */
-int f(int x, int y)
-{
-  int __retres;
-  /*@ assert rte: signed_overflow: -2147483648 ≤ x + y; */
-  /*@ assert rte: signed_overflow: x + y ≤ 2147483647; */
-  if (x + y != 0) {
-    if (x == 2147483647) 
-      if (y == 1) {
-        __retres = -1;
-        goto return_label;
-      }
-    __retres = 0;
-    goto return_label;
-  }
-  __retres = 1;
-  return_label:
-  /*@ assert rte: initialization: \initialized(&__retres); */
-  return __retres;
-}
-
-int main(void)
-{
-  int __retres;
-  int i;
-  int x = 1;
-  int y = 2;
-  /*@ assert y > x; */ ;
-  i = 0;
-  while (1) {
-    /*@ assert rte: initialization: \initialized(&i); */
-    if (! (i < 20)) break;
-    {
-      /*@ assert rte: initialization: \initialized(&x); */
-      /*@ assert rte: initialization: \initialized(&y); */
-      /*@ assert rte: signed_overflow: -2147483648 ≤ x + y; */
-      /*@ assert rte: signed_overflow: x + y ≤ 2147483647; */
-      int tmp = x + y;
-      /*@ assert rte: initialization: \initialized(&x); */
-      /*@ assert rte: initialization: \initialized(&y); */
-      /*@ assert rte: signed_overflow: -2147483648 ≤ x - y; */
-      /*@ assert rte: signed_overflow: x - y ≤ 2147483647; */
-      y = x - y;
-      /*@ assert rte: initialization: \initialized(&tmp); */
-      x = tmp;
-    }
-    /*@ assert rte: initialization: \initialized(&i); */
-    /*@ assert rte: signed_overflow: i + 1 ≤ 2147483647; */
-    i ++;
-  }
-  /*@ assert i > 0; */ ;
-  /*@ assert rte: initialization: \initialized(&x); */
-  if (x > 0) 
-    /*@ assert rte: initialization: \initialized(&y); */
-    if (y > 0) {
-      int tmp_0;
-      /*@ assert rte: initialization: \initialized(&x); */
-      /*@ assert rte: initialization: \initialized(&y); */
-      tmp_0 = f(x,y);
-      __retres = tmp_0;
-      goto return_label;
-    }
-  __retres = 0;
-  return_label:
-  /*@ assert rte: initialization: \initialized(&__retres); */
-  return __retres;
-}
-
-
-[kernel] ================================
-[kernel] Rte-generated annotations for function f
-[kernel] For Statement if (x + y != 0) {
-                  if (x == 2147483647) 
-                    if (y == 1) {
-                      __retres = -1;
-                      goto return_label;
-                    }
-                  __retres = 0;
-                  goto return_label;
-                }
-[kernel] assert rte: signed_overflow: -2147483648 ≤ x + y;
-[kernel] assert rte: signed_overflow: x + y ≤ 2147483647;
-[kernel] For Statement return_label: return __retres;
-[kernel] assert rte: initialization: \initialized(&__retres);
-[kernel] Rte-generated annotations for function main
-[kernel] For Statement if (! (i < 20)) break;
-[kernel] assert rte: initialization: \initialized(&i);
-[kernel] For Statement int tmp = x + y;
-[kernel] assert rte: initialization: \initialized(&x);
-[kernel] assert rte: initialization: \initialized(&y);
-[kernel] assert rte: signed_overflow: -2147483648 ≤ x + y;
-[kernel] assert rte: signed_overflow: x + y ≤ 2147483647;
-[kernel] For Statement y = x - y;
-[kernel] assert rte: initialization: \initialized(&x);
-[kernel] assert rte: initialization: \initialized(&y);
-[kernel] assert rte: signed_overflow: -2147483648 ≤ x - y;
-[kernel] assert rte: signed_overflow: x - y ≤ 2147483647;
-[kernel] For Statement x = tmp;
-[kernel] assert rte: initialization: \initialized(&tmp);
-[kernel] For Statement i ++;
-[kernel] assert rte: initialization: \initialized(&i);
-[kernel] assert rte: signed_overflow: i + 1 ≤ 2147483647;
-[kernel] For Statement if (x > 0) 
-                  if (y > 0) {
-                    int tmp_0;
-                    tmp_0 = f(x,y);
-                    __retres = tmp_0;
-                    goto return_label;
-                  }
-[kernel] assert rte: initialization: \initialized(&x);
-[kernel] For Statement if (y > 0) {
-                  int tmp_0;
-                  tmp_0 = f(x,y);
-                  __retres = tmp_0;
-                  goto return_label;
-                }
-[kernel] assert rte: initialization: \initialized(&y);
-[kernel] For Statement tmp_0 = f(x,y);
-[kernel] assert rte: initialization: \initialized(&x);
-[kernel] assert rte: initialization: \initialized(&y);
-[kernel] For Statement return_label: return __retres;
-[kernel] assert rte: initialization: \initialized(&__retres);
diff --git a/tests/scope/bts383.c b/tests/scope/bts383.c
index 8af71576fd4effafbbf1eecf0c384652e911d8b0..b2b410d23c770ed15c41224b60833a4bb40a57cc 100644
--- a/tests/scope/bts383.c
+++ b/tests/scope/bts383.c
@@ -1,5 +1,5 @@
 /* run.config
-   OPT: -eva @EVA_CONFIG@ -print -journal-disable -scope-verbose 1 -remove-redundant-alarms -context-width 3
+   OPT: -eva @EVA_CONFIG@ -print -journal-disable -scope-verbose 1 -eva-remove-redundant-alarms -eva-context-width 3
 */
 /* 
    echo '!Db.Scope.check_asserts();;' \
diff --git a/tests/scope/no-effect.i b/tests/scope/no-effect.i
index 47f41d8fb6b43f9b3a8da29ecc200377f28d7d1b..7b75f9e1d9f28d1b4893aa62a97fa4c8ca2eb3a7 100644
--- a/tests/scope/no-effect.i
+++ b/tests/scope/no-effect.i
@@ -1,5 +1,5 @@
 /* run.config
-   OPT: @EVA_CONFIG@ -eva -print -journal-disable -scope-verbose 1 -remove-redundant-alarms
+   OPT: @EVA_CONFIG@ -eva -print -journal-disable -scope-verbose 1 -eva-remove-redundant-alarms
 */
 
 typedef struct {
diff --git a/tests/slicing/if_many_values.i b/tests/slicing/if_many_values.i
index 80f9ae39b6cc5dcc3803c1e308ebff6f58aeaa53..236adf75f88bdac560e8226b139a73d42dc0c02a 100644
--- a/tests/slicing/if_many_values.i
+++ b/tests/slicing/if_many_values.i
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: +"-slice-value r -journal-disable -slevel 101 -then-on 'Slicing export' -set-project-as-default -print -check -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -check -no-deps"
+   STDOPT: +"-slice-value r -journal-disable -eva-slevel 101 -then-on 'Slicing export' -set-project-as-default -print -check -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -check -no-deps"
  **/
 
 int r=1;
diff --git a/tests/slicing/keep_annot.i b/tests/slicing/keep_annot.i
index 9f7ae5a7fa6d5f0ab6cabf244de498c5e5e71992..8aa4107fe55a1cb0816ec7c019edc0bf01e8ef19 100644
--- a/tests/slicing/keep_annot.i
+++ b/tests/slicing/keep_annot.i
@@ -1,11 +1,10 @@
 /* run.config
-   STDOPT: +"-context-valid-pointers -lib-entry -main f -slice-assert f  -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  -no-deps"
-   STDOPT: +"-context-valid-pointers -lib-entry -main f -slice-assert f -slicing-keep-annotations -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  -no-deps"
-   STDOPT: +"-context-valid-pointers -lib-entry -main L -slice-pragma L -slicing-keep-annotations -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  -no-deps"
-   STDOPT: +"-context-valid-pointers -lib-entry -main L -slice-pragma L -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  -no-deps"
+   STDOPT: +"-eva-context-valid-pointers -lib-entry -main f -slice-assert f  -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  -no-deps"
+   STDOPT: +"-eva-context-valid-pointers -lib-entry -main f -slice-assert f -slicing-keep-annotations -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  -no-deps"
+   STDOPT: +"-eva-context-valid-pointers -lib-entry -main L -slice-pragma L -slicing-keep-annotations -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  -no-deps"
+   STDOPT: +"-eva-context-valid-pointers -lib-entry -main L -slice-pragma L -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  -no-deps"
    STDOPT: +"-slice-return bts1110 -main bts1110 -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  -no-deps"
 
-
 */
 
 typedef struct { int a; double b; } las;
diff --git a/tests/slicing/oracle/bts336.3.res.oracle b/tests/slicing/oracle/bts336.3.res.oracle
index e5747bf075409abbc7e822901ac8b4276355f8c1..3ec5777dbbc97d199debd99753f3d97d3ca14a83 100644
--- a/tests/slicing/oracle/bts336.3.res.oracle
+++ b/tests/slicing/oracle/bts336.3.res.oracle
@@ -37,6 +37,20 @@
 [from] entry point:
   \result FROM \nothing
 [from] ====== END OF CALLWISE DEPENDENCIES ======
+[inout] InOut (internal) for function f3:
+  Operational inputs:
+    p; a; b; c
+  Operational inputs on termination:
+    p; a; b; c
+  Sure outputs:
+    \nothing
+[inout] InOut (internal) for function main3:
+  Operational inputs:
+    \nothing
+  Operational inputs on termination:
+    \nothing
+  Sure outputs:
+    a; b; c
 [slicing] slicing requests in progress...
 [slicing] initializing slicing ...
 [slicing] interpreting slicing requests from the command line...
@@ -54,20 +68,6 @@
 [slicing] applying 0 actions...
 [sparecode] remove unused global declarations from project 'Slicing export tmp'
 [sparecode] removed unused global declarations in new project 'Slicing export'
-[inout] InOut (internal) for function f3:
-  Operational inputs:
-    p; a; b; c
-  Operational inputs on termination:
-    p; a; b; c
-  Sure outputs:
-    \nothing
-[inout] InOut (internal) for function main3:
-  Operational inputs:
-    \nothing
-  Operational inputs on termination:
-    \nothing
-  Sure outputs:
-    a; b; c
 /* Generated by Frama-C */
 void f3_slice_1(int *p)
 {
diff --git a/tests/slicing/oracle/keep_annot.0.res.oracle b/tests/slicing/oracle/keep_annot.0.res.oracle
index de9f997e5bba46711a60ecb8d4ce98228984af3c..c203fe50ddc5a1936c20fe88d9746b51cf194ae3 100644
--- a/tests/slicing/oracle/keep_annot.0.res.oracle
+++ b/tests/slicing/oracle/keep_annot.0.res.oracle
@@ -6,14 +6,14 @@
 [eva:initial-state] Values of globals at initialization
   
 [eva] computing for function g <- f.
-  Called from keep_annot.i:26.
-[eva] keep_annot.i:15: starting to merge loop iterations
+  Called from keep_annot.i:25.
+[eva] keep_annot.i:14: starting to merge loop iterations
+[eva:alarm] keep_annot.i:19: Warning: assertion got status unknown.
 [eva:alarm] keep_annot.i:20: Warning: assertion got status unknown.
-[eva:alarm] keep_annot.i:21: Warning: assertion got status unknown.
 [eva] Recording results for g
 [eva] Done for function g
-[eva] keep_annot.i:27: assertion got status valid.
-[eva:alarm] keep_annot.i:28: Warning: assertion got status unknown.
+[eva] keep_annot.i:26: assertion got status valid.
+[eva:alarm] keep_annot.i:27: Warning: assertion got status unknown.
 [eva] Recording results for f
 [eva] done for function f
 [slicing] initializing slicing ...
diff --git a/tests/slicing/oracle/keep_annot.1.res.oracle b/tests/slicing/oracle/keep_annot.1.res.oracle
index eed03d301485798de5c079515fb201daa7eea5aa..a449b054d87b99999f8f444aad83d332734318d1 100644
--- a/tests/slicing/oracle/keep_annot.1.res.oracle
+++ b/tests/slicing/oracle/keep_annot.1.res.oracle
@@ -6,14 +6,14 @@
 [eva:initial-state] Values of globals at initialization
   
 [eva] computing for function g <- f.
-  Called from keep_annot.i:26.
-[eva] keep_annot.i:15: starting to merge loop iterations
+  Called from keep_annot.i:25.
+[eva] keep_annot.i:14: starting to merge loop iterations
+[eva:alarm] keep_annot.i:19: Warning: assertion got status unknown.
 [eva:alarm] keep_annot.i:20: Warning: assertion got status unknown.
-[eva:alarm] keep_annot.i:21: Warning: assertion got status unknown.
 [eva] Recording results for g
 [eva] Done for function g
-[eva] keep_annot.i:27: assertion got status valid.
-[eva:alarm] keep_annot.i:28: Warning: assertion got status unknown.
+[eva] keep_annot.i:26: assertion got status valid.
+[eva:alarm] keep_annot.i:27: Warning: assertion got status unknown.
 [eva] Recording results for f
 [eva] done for function f
 [slicing] initializing slicing ...
diff --git a/tests/slicing/oracle/keep_annot.2.res.oracle b/tests/slicing/oracle/keep_annot.2.res.oracle
index f6ef0308c56d86a7f0533f4207d56026dbab91f4..db6b895eb1ee262f69d3d82f893e43376a73f30b 100644
--- a/tests/slicing/oracle/keep_annot.2.res.oracle
+++ b/tests/slicing/oracle/keep_annot.2.res.oracle
@@ -5,18 +5,18 @@
 [eva] Initial state computed
 [eva:initial-state] Values of globals at initialization
   
-[eva:alarm] keep_annot.i:40: Warning: 
+[eva:alarm] keep_annot.i:39: Warning: 
   signed overflow. assert -2147483648 ≤ nn - 2;
-[eva:alarm] keep_annot.i:39: Warning: loop invariant got status unknown.
-[eva:alarm] keep_annot.i:41: Warning: 
+[eva:alarm] keep_annot.i:38: Warning: loop invariant got status unknown.
+[eva:alarm] keep_annot.i:40: Warning: 
   out of bounds read. assert \valid_read(dabs + (int)(ii + 1));
-[eva:alarm] keep_annot.i:41: Warning: 
+[eva:alarm] keep_annot.i:40: Warning: 
   non-finite float value.
   assert
   \is_finite((float)\sub_double((double)u,
                                \mul_double((double)*(dabs + (int)(ii + 1)),
                                           (double)2.0)));
-[eva:alarm] keep_annot.i:42: Warning: assertion got status unknown.
+[eva:alarm] keep_annot.i:41: Warning: assertion got status unknown.
 [eva] Recording results for L
 [eva] done for function L
 [slicing] initializing slicing ...
diff --git a/tests/slicing/oracle/keep_annot.3.res.oracle b/tests/slicing/oracle/keep_annot.3.res.oracle
index e371e62a6bd8e7e31a284db876383afeec975630..1d5274e1cbffbd8a2c157d6aa518249374d95d55 100644
--- a/tests/slicing/oracle/keep_annot.3.res.oracle
+++ b/tests/slicing/oracle/keep_annot.3.res.oracle
@@ -5,18 +5,18 @@
 [eva] Initial state computed
 [eva:initial-state] Values of globals at initialization
   
-[eva:alarm] keep_annot.i:40: Warning: 
+[eva:alarm] keep_annot.i:39: Warning: 
   signed overflow. assert -2147483648 ≤ nn - 2;
-[eva:alarm] keep_annot.i:39: Warning: loop invariant got status unknown.
-[eva:alarm] keep_annot.i:41: Warning: 
+[eva:alarm] keep_annot.i:38: Warning: loop invariant got status unknown.
+[eva:alarm] keep_annot.i:40: Warning: 
   out of bounds read. assert \valid_read(dabs + (int)(ii + 1));
-[eva:alarm] keep_annot.i:41: Warning: 
+[eva:alarm] keep_annot.i:40: Warning: 
   non-finite float value.
   assert
   \is_finite((float)\sub_double((double)u,
                                \mul_double((double)*(dabs + (int)(ii + 1)),
                                           (double)2.0)));
-[eva:alarm] keep_annot.i:42: Warning: assertion got status unknown.
+[eva:alarm] keep_annot.i:41: Warning: assertion got status unknown.
 [eva] Recording results for L
 [eva] done for function L
 [slicing] initializing slicing ...
diff --git a/tests/slicing/oracle/keep_annot.4.res.oracle b/tests/slicing/oracle/keep_annot.4.res.oracle
index 4e043f718d24c115ad9df51a6ebb6937dc9845bb..23e6066a90d86f25b0a90a17f0b69df440729cc9 100644
--- a/tests/slicing/oracle/keep_annot.4.res.oracle
+++ b/tests/slicing/oracle/keep_annot.4.res.oracle
@@ -5,8 +5,8 @@
 [eva] Initial state computed
 [eva:initial-state] Values of globals at initialization
   
-[eva] keep_annot.i:50: assertion got status valid.
-[eva:alarm] keep_annot.i:52: Warning: assertion got status unknown.
+[eva] keep_annot.i:49: assertion got status valid.
+[eva:alarm] keep_annot.i:51: Warning: assertion got status unknown.
 [eva] Recording results for bts1110
 [eva] done for function bts1110
 [slicing] initializing slicing ...
diff --git a/tests/slicing/unravel-variance.i b/tests/slicing/unravel-variance.i
index a892debf34a6a4665fca66af10368941eb903911..0d5a6eaca7f5382443a6e3ab80e062ecaa6fc1bc 100644
--- a/tests/slicing/unravel-variance.i
+++ b/tests/slicing/unravel-variance.i
@@ -1,9 +1,9 @@
 /* run.config
-   STDOPT: +"-slice-calls printf1 -journal-disable -float-normal -remove-redundant-alarms -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  "
-   STDOPT: +"-slice-calls printf2 -journal-disable -float-normal -remove-redundant-alarms -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  "
-   STDOPT: +"-slice-calls printf3 -journal-disable -float-normal -remove-redundant-alarms -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  "
-   STDOPT: +"-slice-calls printf4 -journal-disable -float-normal -remove-redundant-alarms -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  "
-   STDOPT: +"-slice-calls printf5 -journal-disable -float-normal -remove-redundant-alarms -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  "
+   STDOPT: +"-slice-calls printf1 -journal-disable -float-normal -eva-remove-redundant-alarms -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  "
+   STDOPT: +"-slice-calls printf2 -journal-disable -float-normal -eva-remove-redundant-alarms -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  "
+   STDOPT: +"-slice-calls printf3 -journal-disable -float-normal -eva-remove-redundant-alarms -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  "
+   STDOPT: +"-slice-calls printf4 -journal-disable -float-normal -eva-remove-redundant-alarms -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  "
+   STDOPT: +"-slice-calls printf5 -journal-disable -float-normal -eva-remove-redundant-alarms -then-on 'Slicing export' -set-project-as-default -print  -then -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.i -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.i  "
    */
 /* Small example devired from examples given for UNRAVEL tool : */
 
diff --git a/tests/spec/Extend.i b/tests/spec/Extend.i
index 5664d0c98e76211deb39e2a0ace49d326818940e..5fe1d0b3a9956eb3da2054e910e65605bbf2aea1 100644
--- a/tests/spec/Extend.i
+++ b/tests/spec/Extend.i
@@ -48,6 +48,7 @@ void loop (void) {
   //@ for ca_foo: ca_foo \true;
   //@ ns_foo \true;
   //@ baz \true;
+  //@ empty_extension;
   /*@ loop invariant \true; */
   while (0) { }
 }
diff --git a/tests/spec/Extend.ml b/tests/spec/Extend.ml
index 99c5ea7064b6b8ad3de11702dafa936b3320e5e6..71fcdbdc871433955ef45aa232fd62b5f0c3b93b 100644
--- a/tests/spec/Extend.ml
+++ b/tests/spec/Extend.ml
@@ -104,6 +104,10 @@ let type_bla typing_context _loc l =
   in
   Ext_preds l
 
+let type_empty _ loc = function
+  | [] -> Ext_terms [];
+  | _ -> Kernel.abort ~loc "empty_extension should not have arguments"
+
 let () =
   Acsl_extension.register_behavior "foo" type_foo false ;
   Acsl_extension.register_code_annot_next_loop "lfoo" type_foo false ;
@@ -113,7 +117,8 @@ let () =
   Acsl_extension.register_behavior
     "bar" type_bar ~printer:print_bar ~visitor:visit_bar false ;
   Acsl_extension.register_behavior "bla" type_bla false ;
-  Acsl_extension.register_code_annot_next_both "baz" type_baz false
+  Acsl_extension.register_code_annot_next_both "baz" type_baz false;
+  Acsl_extension.register_code_annot "empty_extension" type_empty false
 
 let run () =
   Ast.compute ();
diff --git a/tests/spec/add_global.ml b/tests/spec/add_global.ml
index 39b169539e4b0cf0ab265c7217223c93ba5b8bcd..0a8f954137c1f7f9ff583f8be0ef3e617fc3e0fc 100644
--- a/tests/spec/add_global.ml
+++ b/tests/spec/add_global.ml
@@ -15,7 +15,8 @@ object(self)
           ("MyAxiomatic",
            [ Dlemma(
                  "myaxiom", true, [], [],
-                 Logic_const.ptrue, [], Cil_datatype.Location.unknown)],
+                 Logic_const.(toplevel_predicate ptrue),
+                 [], Cil_datatype.Location.unknown)],
            [], Cil_datatype.Location.unknown)
       in
       Queue.add (fun () -> Annotations.add_global emitter ax)
diff --git a/tests/spec/bts0578.ml b/tests/spec/bts0578.ml
index df12b588dd1d7888ce952084172349671679de70..594d3b71e4b03b506173990f569c70b3ae21ddcf 100644
--- a/tests/spec/bts0578.ml
+++ b/tests/spec/bts0578.ml
@@ -16,12 +16,12 @@ let main () =
     in
     add s (AStmtSpec ([],contract))
   in
-  add s (AInvariant(["foo"], true, ptrue));
+  add s (AInvariant(["foo"], true, toplevel_predicate ptrue));
   add s (AVariant(tinteger 0, None));
-  add s (AInvariant([], true, ptrue));
-  add s (AInvariant(["foo"], true, ptrue));
+  add s (AInvariant([], true, toplevel_predicate ptrue));
+  add s (AInvariant(["foo"], true, toplevel_predicate ptrue));
   Filecheck.check_ast "after adding invariants";
-  let requires = [Logic_const.new_predicate Logic_const.ptrue] in
+  let requires = [new_predicate ptrue] in
   let bhv = [Cil.mk_behavior ~requires ()] in
   add_behavior !s1 bhv;
   Filecheck.check_ast "after adding contract";
diff --git a/tests/spec/expr_to_term.ml b/tests/spec/expr_to_term.ml
index b6ce6b3ab15e0fab3b0e5eb4f46909816c7b4d8d..450dd0d0235313762e4a527d5b891776c1db0566 100644
--- a/tests/spec/expr_to_term.ml
+++ b/tests/spec/expr_to_term.ml
@@ -11,7 +11,7 @@ let check_expr_term check fct s post =
   in
   let term =
     match post with
-      | (_, { ip_content = { pred_content = Papp(_,_,[l;_]) } }) -> l
+      | (_,{ip_content={tp_statement={pred_content = Papp(_,_,[l;_])}}}) -> l
       | _ -> Kernel.fatal "Unexpected ensures %a" Printer.pp_post_cond post
   in
   let term' = Logic_utils.expr_to_term ~coerce:false exp in
diff --git a/tests/spec/generalized_check.i b/tests/spec/generalized_check.i
new file mode 100644
index 0000000000000000000000000000000000000000..66c93e7d3a8fb3ec726efdd2efa913a36d46b1ba
--- /dev/null
+++ b/tests/spec/generalized_check.i
@@ -0,0 +1,42 @@
+/* run.config
+OPT: -wp -wp-prover qed -wp-msg-key shell
+OPT: -eva -eva-use-spec f
+OPT: -print
+*/
+/*@ check lemma easy_proof: \false; */ // should not be put in any environment
+
+/*@ check requires f_valid_x: \valid(x);
+    assigns *x;
+    check ensures f_init_x: *x == 0;
+*/
+void f(int* x) {
+  /*@ check f_valid_ko: \valid(x); */
+  *x = 0;
+}
+
+void loop(void);
+
+int main() {
+  int a = 4;
+  volatile int c;
+  int* p = (void*)0;
+  if (c) p = &a;
+  f(p);
+  /*@ check main_valid_ko: \valid(p); */
+  /*@ check main_p_content_ko: *p == 0; */
+  loop();
+}
+
+void loop () {
+  int j = 0;
+  /*@ check loop invariant false_but_preserved: j == 10;
+      loop assigns i;
+   */
+  for (int i = 0; i< 10; i++);
+  /*@ check implied_by_false_invariant: j == 10; */
+ l: /*@ check invariant \true; */ ;
+  if (j >= 10) goto l1;
+  j++;
+  goto l;
+ l1 : ;
+}
diff --git a/tests/spec/oracle/Extend.res.oracle b/tests/spec/oracle/Extend.res.oracle
index 6e4c69ee4503b8c6bdb70f603319823beb815f37..381b6284b153a703eb6f4b82425222fa1ac3be48 100644
--- a/tests/spec/oracle/Extend.res.oracle
+++ b/tests/spec/oracle/Extend.res.oracle
@@ -55,6 +55,7 @@ void loop(void)
   /*@ for ca_foo: ca_foo \true; */ ;
   /*@ ns_foo \true; */
   /*@ baz \true; */
+  /*@ empty_extension ; */
   /*@ loop invariant \true; */
   while (1) break;
   return;
diff --git a/tests/spec/oracle/annot_decl_bts1009.res.oracle b/tests/spec/oracle/annot_decl_bts1009.res.oracle
index 3d7b11fcb27713bf1ba61d7229e58074e95ce3fd..6c592eecabf7ec22b4f756d23888026f2335da8f 100644
--- a/tests/spec/oracle/annot_decl_bts1009.res.oracle
+++ b/tests/spec/oracle/annot_decl_bts1009.res.oracle
@@ -1,5 +1,13 @@
+<<<<<<< HEAD
 [kernel] Parsing annot_decl_bts1009.i (no preprocessing)
 [kernel:annot-error] Warning: 
+||||||| 362083a770
+[kernel] Parsing tests/spec/annot_decl_bts1009.i (no preprocessing)
+[kernel:annot-error] Warning: 
+=======
+[kernel] Parsing tests/spec/annot_decl_bts1009.i (no preprocessing)
+[kernel:annot-error] tests/spec/annot_decl_bts1009.i:5: Warning: 
+>>>>>>> origin/master
   Statement contract and ACSL pragmas over a local definition are not implemented. Ignoring annotation
 /* Generated by Frama-C */
 void f(void)
diff --git a/tests/spec/oracle/doxygen.res.oracle b/tests/spec/oracle/doxygen.res.oracle
index 3cec59401e6f11fd0d473190635c9fae75c1aec3..80866aac793c04a6e8611e18628806f13f1f6534 100644
--- a/tests/spec/oracle/doxygen.res.oracle
+++ b/tests/spec/oracle/doxygen.res.oracle
@@ -1,28 +1,29 @@
 [kernel] Parsing doxygen.c (with preprocessing)
 /* Generated by Frama-C */
-/*  run.config
+/* run.config
   OPT: -keep-comments -print -then -pp-annot
- */
-/* @{ */
-/* @{ Bla  */
-/* @{ */
-/* @{ Blu */
+*/
+//@{
+//@{ Bla 
+//@{
+//@{ Blu
 void doxygen_group(void)
 {
   return;
 }
 
-/* @} Bli  */
-/* @}  */
-/* @} */
-/* @} Bly */
+//@} Bli 
+//@} 
+//@}
+//@} Bly
 void main();
 
 
 [kernel] Parsing doxygen.c (with preprocessing)
 /* Generated by Frama-C */
-/*  run.config
+/* run.config
   OPT: -keep-comments -print -then -pp-annot
+<<<<<<< HEAD
  */
 /*  run.config
   OPT: -keep-comments -print -then -pp-annot
@@ -35,11 +36,25 @@ void main();
 /* @{ */
 /* @{ Blu */
 /* @{ Blu */
+||||||| 362083a770
+ */
+/* @{ */
+/* @{ Bla  */
+/* @{ */
+/* @{ Blu */
+=======
+*/
+//@{
+//@{ Bla 
+//@{
+//@{ Blu
+>>>>>>> origin/master
 void doxygen_group(void)
 {
   return;
 }
 
+<<<<<<< HEAD
 /* @} Bli  */
 /* @} Bli  */
 /* @}  */
@@ -48,6 +63,17 @@ void doxygen_group(void)
 /* @} */
 /* @} Bly */
 /* @} Bly */
+||||||| 362083a770
+/* @} Bli  */
+/* @}  */
+/* @} */
+/* @} Bly */
+=======
+//@} Bli 
+//@} 
+//@}
+//@} Bly
+>>>>>>> origin/master
 void main();
 
 
diff --git a/tests/spec/oracle/generalized_check.0.res.oracle b/tests/spec/oracle/generalized_check.0.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..391634ac903d7d727471bf1b9ed212817085093b
--- /dev/null
+++ b/tests/spec/oracle/generalized_check.0.res.oracle
@@ -0,0 +1,24 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/spec/generalized_check.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] tests/spec/generalized_check.i:30: Warning: 
+  Unsupported generalized invariant, use loop invariant instead.
+  Ignored invariant 
+  check invariant \true;
+[wp] Warning: Missing RTE guards
+[wp] tests/spec/generalized_check.i:37: Warning: 
+  Missing assigns clause (assigns 'everything' instead)
+[wp] 11 goals scheduled
+[wp] [Qed] Goal typed_f_assigns : Valid
+[wp] [Failed] Goal typed_f_check_f_valid_ko
+[wp] [Qed] Goal typed_f_check_ensures_f_init_x : Valid
+[wp] [Failed] Goal typed_check_lemma_easy_proof
+[wp] [Qed] Goal typed_loop_loop_assigns : Valid
+[wp] [Failed] Goal typed_loop_check_implied_by_false_invariant
+[wp] [Failed] Goal typed_loop_check_loop_invariant_false_but_preserved_established
+[wp] [Failed] Goal typed_loop_check_loop_invariant_false_but_preserved_preserved
+[wp] [Failed] Goal typed_main_call_f_check_requires_f_valid_x
+[wp] [Failed] Goal typed_main_check_main_p_content_ko
+[wp] [Failed] Goal typed_main_check_main_valid_ko
+[wp] Proved goals:    3 / 11
+  Qed:             3
diff --git a/tests/spec/oracle/generalized_check.1.res.oracle b/tests/spec/oracle/generalized_check.1.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..f93e7228b403b708b01b4386186ab29d200d1a5a
--- /dev/null
+++ b/tests/spec/oracle/generalized_check.1.res.oracle
@@ -0,0 +1,47 @@
+[kernel] Parsing tests/spec/generalized_check.i (no preprocessing)
+[eva] Analyzing a complete application starting at main
+[eva] Computing initial state
+[eva] Initial state computed
+[eva:initial-state] Values of globals at initialization
+  
+[eva:alarm] tests/spec/generalized_check.i:23: Warning: 
+  accessing uninitialized left-value. assert \initialized(&c);
+[eva] using specification for function f
+[eva:alarm] tests/spec/generalized_check.i:24: Warning: 
+  function f: precondition 'f_valid_x' got status unknown.
+[eva] tests/spec/generalized_check.i:9: Warning: 
+  no \from part for clause 'assigns *x;'
+[eva:alarm] tests/spec/generalized_check.i:25: Warning: 
+  check 'main_valid_ko' got status unknown.
+[eva:alarm] tests/spec/generalized_check.i:26: Warning: 
+  check 'main_p_content_ko' got status unknown.
+[eva:alarm] tests/spec/generalized_check.i:32: Warning: 
+  loop invariant 'false_but_preserved' got status invalid.
+[eva] tests/spec/generalized_check.i:35: starting to merge loop iterations
+[eva:alarm] tests/spec/generalized_check.i:36: Warning: 
+  check 'implied_by_false_invariant' got status invalid.
+[eva] done for function main
+[eva] ====== VALUES COMPUTED ======
+[eva:final-states] Values at end of function loop:
+  j ∈ {10}
+[eva:final-states] Values at end of function main:
+  a ∈ [--..--]
+  p ∈ {{ NULL ; &a }}
+  __retres ∈ {0}
+[eva:summary] ====== ANALYSIS SUMMARY ======
+  ----------------------------------------------------------------------------
+  3 functions analyzed (out of 3): 100% coverage.
+  In these functions, 25 statements reached (out of 28): 89% coverage.
+  ----------------------------------------------------------------------------
+  Some errors and warnings have been raised during the analysis:
+    by the Eva analyzer:      0 errors    1 warning
+    by the Frama-C kernel:    0 errors    0 warnings
+  ----------------------------------------------------------------------------
+  1 alarm generated by the analysis:
+       1 access to uninitialized left-values
+  ----------------------------------------------------------------------------
+  Evaluation of the logical properties reached by the analysis:
+    Assertions        0 valid     2 unknown     2 invalid      4 total
+    Preconditions     0 valid     1 unknown     0 invalid      1 total
+  0% of the logical properties reached have been proven.
+  ----------------------------------------------------------------------------
diff --git a/tests/spec/oracle/generalized_check.2.res.oracle b/tests/spec/oracle/generalized_check.2.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..dd870d5dc009e1cf2c1e19963f7f6d1bbae27bfb
--- /dev/null
+++ b/tests/spec/oracle/generalized_check.2.res.oracle
@@ -0,0 +1,51 @@
+[kernel] Parsing tests/spec/generalized_check.i (no preprocessing)
+/* Generated by Frama-C */
+/*@ check lemma easy_proof: \false;
+ */
+/*@ check requires f_valid_x: \valid(x);
+    check ensures f_init_x: *\old(x) ≡ 0;
+    assigns *x;
+ */
+void f(int *x)
+{
+  /*@ check f_valid_ko: \valid(x); */ ;
+  *x = 0;
+  return;
+}
+
+void loop(void);
+
+int main(void)
+{
+  int __retres;
+  int volatile c;
+  int a = 4;
+  int *p = (int *)0;
+  if (c) p = & a;
+  f(p);
+  /*@ check main_valid_ko: \valid(p); */ ;
+  /*@ check main_p_content_ko: *p ≡ 0; */ ;
+  loop();
+  __retres = 0;
+  return __retres;
+}
+
+void loop(void)
+{
+  int j = 0;
+  {
+    int i = 0;
+    /*@ check loop invariant false_but_preserved: j ≡ 10;
+        loop assigns i; */
+    while (i < 10) i ++;
+  }
+  /*@ check implied_by_false_invariant: j ≡ 10; */ ;
+  l: /*@ check invariant \true; */ ;
+  if (j >= 10) goto l1;
+  j ++;
+  goto l;
+  l1: ;
+  return;
+}
+
+
diff --git a/tests/spec/oracle/status_by_call_issue_890.res.oracle b/tests/spec/oracle/status_by_call_issue_890.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..33e76da4d07f848c16531e3c1fa56d9c8828261c
--- /dev/null
+++ b/tests/spec/oracle/status_by_call_issue_890.res.oracle
@@ -0,0 +1,24 @@
+[kernel] Parsing tests/spec/status_by_call_issue_890.i (no preprocessing)
+/* Generated by Frama-C */
+struct list {
+   struct list *next ;
+};
+/*@ axiomatic Ax {
+      predicate P(struct list *root) ;
+      
+      }
+ */
+/*@ requires P(l); */
+int len(struct list *l)
+{
+  int tmp_0;
+  if (l == (struct list *)0) tmp_0 = 0;
+  else {
+    int tmp;
+    tmp = len(l->next);
+    tmp_0 = 1 + tmp;
+  }
+  return tmp_0;
+}
+
+
diff --git a/tests/spec/status_by_call_issue_890.i b/tests/spec/status_by_call_issue_890.i
new file mode 100644
index 0000000000000000000000000000000000000000..d3209b6bea950aca95d9ac3a3ec582596fade641
--- /dev/null
+++ b/tests/spec/status_by_call_issue_890.i
@@ -0,0 +1,12 @@
+/* run.config
+   MODULE: @PTEST_DIR@/@PTEST_NAME@.cmxs
+*/
+
+struct list { struct list *next; };
+
+/*@ axiomatic Ax { predicate P(struct list * root) ; } */
+
+/*@ requires P(l); @*/
+int len(struct list * l){
+  return (l == (void*)0) ? 0 : 1 + len(l->next);
+}
diff --git a/tests/spec/status_by_call_issue_890.ml b/tests/spec/status_by_call_issue_890.ml
new file mode 100644
index 0000000000000000000000000000000000000000..374e927700b937885f27c029f3d1744110d9ea39
--- /dev/null
+++ b/tests/spec/status_by_call_issue_890.ml
@@ -0,0 +1,3 @@
+let () =
+  Db.Main.extend
+    (fun () -> Globals.Functions.iter Statuses_by_call.setup_all_preconditions_proxies)
diff --git a/tests/syntax/cpp-command.c b/tests/syntax/cpp-command.c
index a5302bd1287f8aba14df663b403b9f2cfb548c30..38c627a79182c61127642f45f22e84978334a3b8 100644
--- a/tests/syntax/cpp-command.c
+++ b/tests/syntax/cpp-command.c
@@ -1,7 +1,8 @@
 /* run.config*
-   FILTER: sed -e 's:/\(tmp\|var\|build\)/[^ ]*\.i:/tmp/FILE.i:g' -e 's:-I.*share/frama-c/share/libc:-I LIBC:g'
+   FILTER: sed -e 's:/\(tmp\|var\|build\)/[^ ]*\.i:/tmp/FILE.i:g; s:$PWD::g; s:-I.*share/frama-c/share/libc:-I LIBC:g'
    OPT: -no-autoload-plugins -cpp-frama-c-compliant -cpp-command "echo [\$(basename '%1') \$(basename '%1') \$(basename '%i') \$(basename '%input')] ['%2' '%2' '%o' '%output'] ['%args']"
    OPT: -no-autoload-plugins -cpp-frama-c-compliant -cpp-command "echo %%1 = \$(basename '%1') %%2 = '%2' %%args = '%args'"
    OPT: -no-autoload-plugins -cpp-frama-c-compliant -cpp-command "printf \"%s\" \"using \\% has no effect : \$(basename \"\%input\")\""
    OPT: -no-autoload-plugins -cpp-frama-c-compliant -cpp-command "echo %var is not an interpreted placeholder"
+   OPT: -no-autoload-plugins -print-cpp-commands
    */
diff --git a/tests/syntax/inline_calls.i b/tests/syntax/inline_calls.i
index 6c24ee22069c16673cbc3851d597a1df63d975c4..a71073677d14b7d1b989f2d667f54b3d2bb917ac 100644
--- a/tests/syntax/inline_calls.i
+++ b/tests/syntax/inline_calls.i
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: +"-inline-calls @all"
+   STDOPT: +"-inline-calls @all -kernel-msg-key printer:attrs"
    STDOPT: +"-inline-calls @inline"
    STDOPT: +"-inline-calls @inline -remove-inlined @inline"
  */
diff --git a/tests/syntax/loop-case-switch-for-unroll.c b/tests/syntax/loop-case-switch-for-unroll.c
index c379555af57ec055957c8c275177345fa51eb177..7785be51b6a9e2495750bee02becb6c8fd846b61 100644
--- a/tests/syntax/loop-case-switch-for-unroll.c
+++ b/tests/syntax/loop-case-switch-for-unroll.c
@@ -1,7 +1,7 @@
 /* run.config
-   STDOPT: +"-slevel 100 -eva"
-   STDOPT: +"-ulevel 1 -slevel 100 -eva"
-   STDOPT: +"-ulevel 2 -slevel 100 -eva"
+   STDOPT: +"-eva-slevel 100 -eva"
+   STDOPT: +"-ulevel 1 -eva-slevel 100 -eva"
+   STDOPT: +"-ulevel 2 -eva-slevel 100 -eva"
    COMMENT: compile and run with GCC, save output to a file, and compare it to
    the result of Frama-C piped to:
      "| grep Frama_C_show_each | sed 's/^.*Frama_C_show_each_//'"
diff --git a/tests/syntax/oracle/bts0916.res.oracle b/tests/syntax/oracle/bts0916.res.oracle
index ba192a3b000134983b12513a4d166dba745adbc7..6a3293a66e6d286757551fe928bf6aa594fcb3cd 100644
--- a/tests/syntax/oracle/bts0916.res.oracle
+++ b/tests/syntax/oracle/bts0916.res.oracle
@@ -1,27 +1,27 @@
 [kernel] Parsing bts0916.i (no preprocessing)
 /* Generated by Frama-C */
-/*  run.config
+/* run.config
    STDOPT: +"-keep-comments"
- */
-/*  Use frama-c with option -keep-comments  */
+*/
+// Use frama-c with option -keep-comments 
 void main(void)
 {
   int port = 10;
-  /*  ( port & 0x80 ) == 0 ) */
-  /*  wait for pin1 - Compliant */
-  /*  wait for pin2  */
-  /*   Not compliant/*, comment before ;  */
-  /*  wait for pin3 - Not compliant, no white-space char after ;  */
+  // ( port & 0x80 ) == 0 )
+  // wait for pin1 - Compliant
+  // wait for pin2 
+  //  Not compliant/*, comment before ; 
+  // wait for pin3 - Not compliant, no white-space char after ; 
   while (1) {
     int tmp;
     tmp = port;
     port --;
     ;
-    if (! (tmp > 0)) /*  ( port & 0x80 ) == 0 ) */
-                     /*  wait for pin1 - Compliant */
-                     /*  wait for pin2  */
-                     /*   Not compliant/*, comment before ;  */
-                     /*  wait for pin3 - Not compliant, no white-space char after ;  */
+    if (! (tmp > 0)) // ( port & 0x80 ) == 0 )
+                     // wait for pin1 - Compliant
+                     // wait for pin2 
+                     //  Not compliant/*, comment before ; 
+                     // wait for pin3 - Not compliant, no white-space char after ; 
                      break;
   }
   return;
diff --git a/tests/syntax/oracle/cert_msc_38.0.res.oracle b/tests/syntax/oracle/cert_msc_38.0.res.oracle
index c703b8c913dd4cd1ee42c4a4d7c73e79a4045d54..b3f5562a4952f6025fd692245aef0e1f0a48c01e 100644
--- a/tests/syntax/oracle/cert_msc_38.0.res.oracle
+++ b/tests/syntax/oracle/cert_msc_38.0.res.oracle
@@ -1,5 +1,5 @@
 [kernel] Parsing cert_msc_38.c (with preprocessing)
-[kernel:CERT:MSC:38] Warning: 
+[kernel:CERT:MSC:38] cert_msc_38.c:25: Warning: 
   assert is a standard macro. Its definition cannot be suppressed, see CERT C coding rules MSC38-C
 [kernel] cert_msc_38.c:25: User Error: Cannot resolve variable assert
 [kernel] User Error: stopping on file "cert_msc_38.c" that has errors. Add '-kernel-msg-key pp'
diff --git a/tests/syntax/oracle/cert_msc_38.1.res.oracle b/tests/syntax/oracle/cert_msc_38.1.res.oracle
index b51f109d12f333de4f9a4d199fe774fcfbd91232..d06289ffc89e1c32588c5a3630aff3198633761d 100644
--- a/tests/syntax/oracle/cert_msc_38.1.res.oracle
+++ b/tests/syntax/oracle/cert_msc_38.1.res.oracle
@@ -1,5 +1,5 @@
 [kernel] Parsing cert_msc_38.c (with preprocessing)
-[kernel:CERT:MSC:38] Warning: 
+[kernel:CERT:MSC:38] cert_msc_38.c:32: Warning: 
   Attempt to declare errno as external identifier outside of the stdlib. It is supposed to be a macro name and cannot be declared. See CERT C coding rule MSC38-C
 [kernel] Warning: warning CERT:MSC:38 treated as deferred error. See above messages for more information.
 [kernel] Frama-C aborted: invalid user input.
diff --git a/tests/syntax/oracle/cert_msc_38.2.res.oracle b/tests/syntax/oracle/cert_msc_38.2.res.oracle
index 1f5260d6a43390d4202e49353a2e42e000d945be..9771ce15a632ecad294c19ad9e2c998cbce39826 100644
--- a/tests/syntax/oracle/cert_msc_38.2.res.oracle
+++ b/tests/syntax/oracle/cert_msc_38.2.res.oracle
@@ -1,5 +1,5 @@
 [kernel] Parsing cert_msc_38.c (with preprocessing)
-[kernel:CERT:MSC:38] Warning: 
+[kernel:CERT:MSC:38] cert_msc_38.c:37: Warning: 
   Attempt to declare math_errhandling as external identifier outside of the stdlib. It is supposed to be a macro name and cannot be declared. See CERT C coding rule MSC38-C
 [kernel] Warning: warning CERT:MSC:38 treated as deferred error. See above messages for more information.
 [kernel] Frama-C aborted: invalid user input.
diff --git a/tests/syntax/oracle/cert_msc_38.3.res.oracle b/tests/syntax/oracle/cert_msc_38.3.res.oracle
index a378be509edcdb2e2b69fe63d6ce7025bbd3f30b..b730fcd1513c6a4c8f9bbb4f35cfe09302c6bb0d 100644
--- a/tests/syntax/oracle/cert_msc_38.3.res.oracle
+++ b/tests/syntax/oracle/cert_msc_38.3.res.oracle
@@ -1,5 +1,5 @@
 [kernel] Parsing cert_msc_38.c (with preprocessing)
-[kernel:CERT:MSC:38] Warning: 
+[kernel:CERT:MSC:38] cert_msc_38.c:42: Warning: 
   va_start is a standard macro. Its definition cannot be suppressed, see CERT C coding rules MSC38-C
 [kernel] cert_msc_38.c:42: User Error: Cannot resolve variable va_start
 [kernel] User Error: stopping on file "cert_msc_38.c" that has errors. Add '-kernel-msg-key pp'
diff --git a/tests/syntax/oracle/cert_msc_38.4.res.oracle b/tests/syntax/oracle/cert_msc_38.4.res.oracle
index 20661c79610f0f8341b29f21630dd80e273a76dc..594117a88b2a8629bd6e078c38e6e8d2a78106e5 100644
--- a/tests/syntax/oracle/cert_msc_38.4.res.oracle
+++ b/tests/syntax/oracle/cert_msc_38.4.res.oracle
@@ -1,5 +1,5 @@
 [kernel] Parsing cert_msc_38.c (with preprocessing)
-[kernel:CERT:MSC:38] Warning: 
+[kernel:CERT:MSC:38] cert_msc_38.c:46: Warning: 
   va_copy is a standard macro. Its definition cannot be suppressed, see CERT C coding rules MSC38-C
 [kernel] cert_msc_38.c:46: User Error: Cannot resolve variable va_copy
 [kernel] User Error: stopping on file "cert_msc_38.c" that has errors. Add '-kernel-msg-key pp'
diff --git a/tests/syntax/oracle/cert_msc_38.5.res.oracle b/tests/syntax/oracle/cert_msc_38.5.res.oracle
index 5f9a3d0769de3a13f2c4f2517f5a0972b0b790eb..b7eae062a21c8eeff08f3ad6b60300b590f6444f 100644
--- a/tests/syntax/oracle/cert_msc_38.5.res.oracle
+++ b/tests/syntax/oracle/cert_msc_38.5.res.oracle
@@ -1,5 +1,5 @@
 [kernel] Parsing cert_msc_38.c (with preprocessing)
-[kernel:CERT:MSC:38] Warning: 
+[kernel:CERT:MSC:38] cert_msc_38.c:50: Warning: 
   va_arg is a standard macro. Its definition cannot be suppressed, see CERT C coding rules MSC38-C
 [kernel] cert_msc_38.c:50: User Error: Cannot resolve variable va_arg
 [kernel] User Error: stopping on file "cert_msc_38.c" that has errors. Add '-kernel-msg-key pp'
diff --git a/tests/syntax/oracle/cert_msc_38.6.res.oracle b/tests/syntax/oracle/cert_msc_38.6.res.oracle
index 0e07b8a9c0de30f5099e84e3f327d34c525e73bc..0c1d98e5f32420400ab5361cb8dbc2bba1724ae7 100644
--- a/tests/syntax/oracle/cert_msc_38.6.res.oracle
+++ b/tests/syntax/oracle/cert_msc_38.6.res.oracle
@@ -1,5 +1,5 @@
 [kernel] Parsing cert_msc_38.c (with preprocessing)
-[kernel:CERT:MSC:38] Warning: 
+[kernel:CERT:MSC:38] cert_msc_38.c:54: Warning: 
   va_end is a standard macro. Its definition cannot be suppressed, see CERT C coding rules MSC38-C
 [kernel] cert_msc_38.c:54: User Error: Cannot resolve variable va_end
 [kernel] User Error: stopping on file "cert_msc_38.c" that has errors. Add '-kernel-msg-key pp'
diff --git a/tests/syntax/oracle/cert_msc_38.7.res.oracle b/tests/syntax/oracle/cert_msc_38.7.res.oracle
index d0217fbcf198b925fe4efc5b1a1d9bf996e1f638..42bc8162061a1ff6a54eebe39b99f97720b0840e 100644
--- a/tests/syntax/oracle/cert_msc_38.7.res.oracle
+++ b/tests/syntax/oracle/cert_msc_38.7.res.oracle
@@ -1,5 +1,5 @@
 [kernel] Parsing cert_msc_38.c (with preprocessing)
-[kernel:CERT:MSC:38] Warning: 
+[kernel:CERT:MSC:38] cert_msc_38.c:59: Warning: 
   setjmp is a standard macro. Its definition cannot be suppressed, see CERT C coding rules MSC38-C
 [kernel] Warning: warning CERT:MSC:38 treated as deferred error. See above messages for more information.
 [kernel] Frama-C aborted: invalid user input.
diff --git a/tests/syntax/oracle/cpp-command.4.res.oracle b/tests/syntax/oracle/cpp-command.4.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..5cd16e50ce522b8af4b2e27df59253891ce9a5dd
--- /dev/null
+++ b/tests/syntax/oracle/cpp-command.4.res.oracle
@@ -0,0 +1,2 @@
+[kernel] Preprocessing command:
+  gcc -E -C -I LIBC -D__FRAMAC__ -D__FC_MACHDEP_X86_32 -dD -nostdinc -m32 '/home/bobot/Sources/frama-c/_build/default/tests/syntax/result/cpp-command.c' -o '/tmp/FILE.i'
diff --git a/tests/syntax/oracle/ghost_else.res.oracle b/tests/syntax/oracle/ghost_else.res.oracle
index 90cd88aef53a5b2ffdb446cdd30c02a6c84706f4..3c24e1597355974ace436afd05574d7fafd04cc6 100644
--- a/tests/syntax/oracle/ghost_else.res.oracle
+++ b/tests/syntax/oracle/ghost_else.res.oracle
@@ -1,8 +1,8 @@
 [kernel] Parsing ghost_else.i (no preprocessing)
 /* Generated by Frama-C */
-/*  run.config
+/* run.config
    OPT: -no-autoload-plugins -keep-comments -print
- */
+*/
 void normal_only_if(int x, int y)
 {
   if (x) x ++;
@@ -58,8 +58,8 @@ void if_ghost_else_block_comments(int x) /*@ ghost (int y) */
 {
   if (x) x ++;
   /*@ ghost else y ++;*/
-  /* // comment 1 */
-  /* // comment 2 */
+  //// comment 1
+  //// comment 2
   return;
 }
 
@@ -67,8 +67,8 @@ void if_ghost_else_block_comments_escaped(int x) /*@ ghost (int y) */
 {
   if (x) x ++;
   /*@ ghost else y ++;*/
-  /* // comment 1\ */
-  /* continued */
+  //// comment 1\
+  //continued
   return;
 }
 
@@ -80,8 +80,8 @@ void normal_if_ghost_else_intricated(int x) /*@ ghost (int y) */
   return;
 }
 
-/*  we must take care to keep the "if" bloc when pretty-printing */
-/*  as removing the brackets changes the program. */
+// we must take care to keep the "if" bloc when pretty-printing
+// as removing the brackets changes the program.
 void ghost_else_plus_else_association(int x) /*@ ghost (int y) */
 {
   if (x) {
@@ -92,9 +92,9 @@ void ghost_else_plus_else_association(int x) /*@ ghost (int y) */
   return;
 }
 
-/*  pretty-printer must take care of keeping the braces around the */
-/*  single-(ghost)-statement blocks. Otherwise, the code is syntactically */
-/*  invalid (empty, from a non-ghost point-of-view, then clause) */
+// pretty-printer must take care of keeping the braces around the
+// single-(ghost)-statement blocks. Otherwise, the code is syntactically
+// invalid (empty, from a non-ghost point-of-view, then clause)
 void non_ghost_if_with_ghost_body(int x) /*@ ghost (int y) */
 {
   if (x) {
@@ -106,9 +106,9 @@ void non_ghost_if_with_ghost_body(int x) /*@ ghost (int y) */
   return;
 }
 
-/*  pretty-printer must take care of keeping the braces around the */
-/*  single-(ghost)-statement blocks. Even if the ghost statement is an */
-/*  empty block! */
+// pretty-printer must take care of keeping the braces around the
+// single-(ghost)-statement blocks. Even if the ghost statement is an
+// empty block!
 void non_ghost_if_with_nop_ghost_body(int x) /*@ ghost (int y) */
 {
   if (! x) {
diff --git a/tests/syntax/oracle/incomplete_struct_field.res.oracle b/tests/syntax/oracle/incomplete_struct_field.res.oracle
index 7f286ca73a534a07a07a54e0e10a0208a3ba4b2b..621f3b6620ab1ced968bc1591da215a5f9c40cbd 100644
--- a/tests/syntax/oracle/incomplete_struct_field.res.oracle
+++ b/tests/syntax/oracle/incomplete_struct_field.res.oracle
@@ -3,6 +3,6 @@
   declaration of array of incomplete type 'struct _s`
 [kernel] incomplete_struct_field.i:1: User Error: 
   field `v' is declared with incomplete type struct _s [12]
-[kernel] User Error: type struct _s is circular
+[kernel] incomplete_struct_field.i:1: User Error: type struct _s is circular
 [kernel] User Error: stopping on file "incomplete_struct_field.i" that has errors.
 [kernel] Frama-C aborted: invalid user input.
diff --git a/tests/syntax/oracle/inline_calls.0.res.oracle b/tests/syntax/oracle/inline_calls.0.res.oracle
index a79a15bb825043dccbdeeedc88a390962c23a194..819ee06a74f9918c4ae10fb66f2df0151d2d2bb6 100644
--- a/tests/syntax/oracle/inline_calls.0.res.oracle
+++ b/tests/syntax/oracle/inline_calls.0.res.oracle
@@ -23,7 +23,7 @@ int g(void)
   if (v) {
     int tmp;
     {
-      int __retres_5;
+       /* __blockattribute__(____fc_inlined__("f")) */int __retres_5;
       __retres_5 = 2;
       tmp = __retres_5;
     }
@@ -33,7 +33,7 @@ int g(void)
   else {
     int tmp_0;
     {
-      int __retres_6;
+       /* __blockattribute__(____fc_inlined__("in_f__fc_inline")) */int __retres_6;
       __retres_6 = 3;
       tmp_0 = __retres_6;
     }
@@ -47,11 +47,11 @@ int h(void)
 {
   int tmp;
   {
-    int __retres;
+     /* __blockattribute__(____fc_inlined__("g")) */int __retres;
     if (v) {
       int tmp_3;
       {
-        int __retres_5;
+         /* __blockattribute__(____fc_inlined__("f")) */int __retres_5;
         __retres_5 = 2;
         tmp_3 = __retres_5;
       }
@@ -61,6 +61,7 @@ int h(void)
     else {
       int tmp_0;
       {
+         /* __blockattribute__(____fc_inlined__("in_f__fc_inline")) */
         int __retres_6;
         __retres_6 = 3;
         tmp_0 = __retres_6;
@@ -90,8 +91,8 @@ int rec(int x_0)
     goto return_label;
   }
   {
-    int __retres_7;
-    int tmp_6;
+     /* __blockattribute__(____fc_inlined__("rec")) */int __retres_7;
+                                                      int tmp_6;
     int x_0_5 = x_0 - 1;
     if (x_0_5 < 0) {
       __retres_7 = x_0_5;
@@ -116,7 +117,7 @@ int f1(int a)
   if (nondet) {
     int __inline_tmp;
     {
-      int a_5 = 1;
+       /* __blockattribute__(____fc_inlined__("g1")) */int a_5 = 1;
       if (nondet) g1(4);
       __inline_tmp = a_5;
     }
@@ -125,12 +126,12 @@ int f1(int a)
     if (nondet) {
       int __inline_tmp_6;
       {
-        int __retres_9;
+         /* __blockattribute__(____fc_inlined__("f1")) */int __retres_9;
         int a_8 = 2;
         if (nondet) {
           int __inline_tmp_10;
           {
-            int a_5_11 = 1;
+             /* __blockattribute__(____fc_inlined__("g1")) */int a_5_11 = 1;
             if (nondet) g1(4);
             __inline_tmp_10 = a_5_11;
           }
@@ -155,7 +156,7 @@ int g1(int a)
   if (nondet) {
     int __inline_tmp;
     {
-      int a_4 = 4;
+       /* __blockattribute__(____fc_inlined__("g1")) */int a_4 = 4;
       if (nondet) {
         int __inline_tmp_5;
         g1(4);
@@ -173,23 +174,23 @@ int main(void)
   int __inline_tmp;
   int tmp_1;
   {
-    int __retres;
+     /* __blockattribute__(____fc_inlined__("i")) */int __retres;
     /*@ assert i: \true; */ ;
     __retres = 0;
     __inline_tmp = __retres;
   }
   int local_init = __inline_tmp;
   {
-    int __retres_10;
-    int tmp;
+     /* __blockattribute__(____fc_inlined__("rec")) */int __retres_10;
+                                                      int tmp;
     int x_0 = local_init;
     if (x_0 < 0) {
       __retres_10 = x_0;
       goto return_label;
     }
     {
-      int __retres_7;
-      int tmp_6;
+       /* __blockattribute__(____fc_inlined__("rec")) */int __retres_7;
+                                                        int tmp_6;
       int x_0_5 = x_0 - 1;
       if (x_0_5 < 0) {
         __retres_7 = x_0_5;
@@ -204,12 +205,12 @@ int main(void)
   }
   int t = __inline_tmp_8;
   {
-    int __retres_13;
+     /* __blockattribute__(____fc_inlined__("f1")) */int __retres_13;
     int a = 2;
     if (nondet) {
       int __inline_tmp_14;
       {
-        int a_5 = 1;
+         /* __blockattribute__(____fc_inlined__("g1")) */int a_5 = 1;
         if (nondet) g1(4);
         __inline_tmp_14 = a_5;
       }
@@ -218,12 +219,13 @@ int main(void)
       if (nondet) {
         int __inline_tmp_6;
         {
-          int __retres_9;
+           /* __blockattribute__(____fc_inlined__("f1")) */int __retres_9;
           int a_8 = 2;
           if (nondet) {
             int __inline_tmp_10;
             {
-              int a_5_11 = 1;
+               /* __blockattribute__(____fc_inlined__("g1")) */int a_5_11 =
+                                                                 1;
               if (nondet) g1(4);
               __inline_tmp_10 = a_5_11;
             }
@@ -243,13 +245,13 @@ int main(void)
     __inline_tmp_11 = __retres_13;
   }
   {
-    int tmp_15;
+     /* __blockattribute__(____fc_inlined__("h")) */int tmp_15;
     {
-      int __retres_16;
+       /* __blockattribute__(____fc_inlined__("g")) */int __retres_16;
       if (v) {
         int tmp_3;
         {
-          int __retres_5;
+           /* __blockattribute__(____fc_inlined__("f")) */int __retres_5;
           __retres_5 = 2;
           tmp_3 = __retres_5;
         }
@@ -259,6 +261,7 @@ int main(void)
       else {
         int tmp_0;
         {
+           /* __blockattribute__(____fc_inlined__("in_f__fc_inline")) */
           int __retres_6;
           __retres_6 = 3;
           tmp_0 = __retres_6;
@@ -285,8 +288,10 @@ int with_static(void)
 int call_with_static(void)
 {
   int tmp;
-  with_static_count ++;
-  tmp = with_static_count;
+  {
+     /* __blockattribute__(____fc_inlined__("with_static")) */with_static_count ++;
+    tmp = with_static_count;
+  }
   return tmp;
 }
 
@@ -300,7 +305,8 @@ void builtin_acsl(void)
 void call_builtin_acsl(void)
 {
   {
-    float g_0 = 0.f;
+     /* __blockattribute__(____fc_inlined__("builtin_acsl")) */float g_0 =
+                                                                 0.f;
     /*@ assert ¬\is_NaN(g_0); */ ;
     ;
   }
@@ -315,8 +321,10 @@ void f_slevel(void)
 
 void call_f_slevel(void)
 {
-  /*@ slevel 0; */ ;
-  ;
+  {
+     /* __blockattribute__(____fc_inlined__("f_slevel")) *//*@ slevel 0; */ ;
+    ;
+  }
   return;
 }
 
@@ -330,10 +338,12 @@ void post_decl(void);
 
 void middle_decl(void)
 {
-  x ++;
-  y ++;
-  post_decl();
-  ;
+  {
+     /* __blockattribute__(____fc_inlined__("pre_decl")) */x ++;
+    y ++;
+    post_decl();
+    ;
+  }
   return;
 }
 
diff --git a/tests/syntax/oracle/mutually_recursive_struct.res.oracle b/tests/syntax/oracle/mutually_recursive_struct.res.oracle
index 5792a404b80962f5b379c221eae9c15c68631a1b..1ebe78e7dd731f50febd537e80ac22db2f1e367f 100644
--- a/tests/syntax/oracle/mutually_recursive_struct.res.oracle
+++ b/tests/syntax/oracle/mutually_recursive_struct.res.oracle
@@ -7,6 +7,6 @@
   declaration of array of incomplete type 'struct S1`
 [kernel] mutually_recursive_struct.i:6: User Error: 
   field `s1' is declared with incomplete type struct S1 [2]
-[kernel] User Error: type struct S2 is circular
+[kernel] mutually_recursive_struct.i:6: User Error: type struct S2 is circular
 [kernel] User Error: stopping on file "mutually_recursive_struct.i" that has errors.
 [kernel] Frama-C aborted: invalid user input.
diff --git a/tests/syntax/oracle/sizeof_incomplete_type.res.oracle b/tests/syntax/oracle/sizeof_incomplete_type.res.oracle
index 68649a2728af5ed25edfd4884647a9c34ce1ff36..b7cbcd04a37e4d66726f45966538a2b3fd87b71a 100644
--- a/tests/syntax/oracle/sizeof_incomplete_type.res.oracle
+++ b/tests/syntax/oracle/sizeof_incomplete_type.res.oracle
@@ -1,5 +1,6 @@
 [kernel] Parsing sizeof_incomplete_type.c (with preprocessing)
-[kernel] sizeof_incomplete_type.c:21: User Error: sizeof on incomplete type
+[kernel] sizeof_incomplete_type.c:21: User Error: 
+  sizeof on incomplete type 'struct inexistent'
 [kernel] User Error: stopping on file "sizeof_incomplete_type.c" that has errors. Add
   '-kernel-msg-key pp' for preprocessing command.
 [kernel] Frama-C aborted: invalid user input.
diff --git a/tests/syntax/oracle/static_formals_1.res.oracle b/tests/syntax/oracle/static_formals_1.res.oracle
index bcf018e8e29877b135285b3a37a6e90beb506882..d9f24a3232aabfb7c3b56053ece7903f07f23ac8 100644
--- a/tests/syntax/oracle/static_formals_1.res.oracle
+++ b/tests/syntax/oracle/static_formals_1.res.oracle
@@ -1,24 +1,24 @@
 [kernel] Parsing static_formals_1.c (with preprocessing)
 [kernel] Parsing static_formals_2.c (with preprocessing)
 /* Generated by Frama-C */
-/*@ requires /* vid:23, lvid:23 */x < 10; */
-static int /* vid:56 */f(int /* vid:23, lvid:23 */x);
+/*@ requires /* vid:25, lvid:25 */x < 10; */
+static int /* vid:58 */f(int /* vid:25, lvid:25 */x);
 
-int /* vid:28 */g(void)
+int /* vid:30 */g(void)
 {
-  int /* vid:29 */tmp;
-  /* vid:29 */tmp = /* vid:56 */f(4);
-  return /* vid:29 */tmp;
+  int /* vid:31 */tmp;
+  /* vid:31 */tmp = /* vid:58 */f(4);
+  return /* vid:31 */tmp;
 }
 
-/*@ requires /* vid:51, lvid:51 */x < 10; */
-static int /* vid:57 */f_0(int /* vid:51, lvid:51 */x);
+/*@ requires /* vid:53, lvid:53 */x < 10; */
+static int /* vid:59 */f_0(int /* vid:53, lvid:53 */x);
 
-int /* vid:54 */h(void)
+int /* vid:56 */h(void)
 {
-  int /* vid:55 */tmp;
-  /* vid:55 */tmp = /* vid:57 */f_0(6);
-  return /* vid:55 */tmp;
+  int /* vid:57 */tmp;
+  /* vid:57 */tmp = /* vid:59 */f_0(6);
+  return /* vid:57 */tmp;
 }
 
 
diff --git a/tests/syntax/syntactic_hook.ml b/tests/syntax/syntactic_hook.ml
index c6a5d1f3517e261599913c4c0f8f577ece146a2c..5a479278793dbeb6d7f90325d44d63a624fc95d7 100644
--- a/tests/syntax/syntactic_hook.ml
+++ b/tests/syntax/syntactic_hook.ml
@@ -13,10 +13,15 @@ class visit = object
       [{ stmt_ghost = false;
          stmt_node =
            CODE_ANNOT(
-             AAssert([], Assert,
-                     { lexpr_node =
-                         PLat ({ lexpr_node = PLtrue; lexpr_loc = loc},"Pre");
-                       lexpr_loc = loc}), loc)};
+             AAssert(
+               [],
+               { tp_only_check = false;
+                 tp_statement =
+                   { lexpr_node =
+                       PLat ({ lexpr_node = PLtrue; lexpr_loc = loc},"Pre");
+                     lexpr_loc = loc}
+               }),
+             loc)};
        s]
 end
 
diff --git a/tests/syntax/unroll_labels.i b/tests/syntax/unroll_labels.i
index 4ccad645f15c61425fcf07b5c25f80d4d7bc3108..66da8b7cf4882b0214a9cc46294e20ff7f81668b 100644
--- a/tests/syntax/unroll_labels.i
+++ b/tests/syntax/unroll_labels.i
@@ -1,6 +1,6 @@
 /* run.config
   STDOPT: +"-eva @EVA_CONFIG@"
-  STDOPT: +"-eva @EVA_CONFIG@ -main main2 -slevel 3"
+  STDOPT: +"-eva @EVA_CONFIG@ -main main2 -eva-slevel 3"
 */
 enum { SIX = 6 } ;
 volatile foo;
diff --git a/tests/value/CruiseControl.c b/tests/value/CruiseControl.c
index 367268ecdfbe678eb86733ab318a984a841ff4b5..de3ffba2c19281bf65b77818e0cea48c02665b65 100644
--- a/tests/value/CruiseControl.c
+++ b/tests/value/CruiseControl.c
@@ -1,7 +1,7 @@
 /* run.config*
    DEPS: CruiseControl.h CruiseControl_extern.h scade_types.h config_types.h definitions.h
    GCC:
-   STDOPT: #"-float-normal %{dep:CruiseControl_const.c} -lib-entry -main CruiseControl -context-depth 10 -context-valid-pointers"
+   STDOPT: #"-float-normal %{dep:CruiseControl_const.c} -lib-entry -main CruiseControl -eva-context-depth 10 -eva-context-valid-pointers"
 
 */
 /*$************* SCADE_KCG KCG Version 5.1.1 (build i10) **************
diff --git a/tests/value/ai_annot.i b/tests/value/ai_annot.i
index 9a531689e600c192c4a5ac0c314b0cd7c1f58d93..16034a0e0f48ea1185d1aca2066ddbc5c08bdcde 100644
--- a/tests/value/ai_annot.i
+++ b/tests/value/ai_annot.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: #"-load-module scope -scope-verbose 2 -remove-redundant-alarms -context-width 3"
+   STDOPT: #"-load-module scope -scope-verbose 2 -eva-remove-redundant-alarms -eva-context-width 3"
    */
 
 
diff --git a/tests/value/alias.i b/tests/value/alias.i
index 048db0914217733f9dd52f7839b5144870d7f2b9..4b91cf96a5b9397faf75c5a65279b01cff0312ba 100644
--- a/tests/value/alias.i
+++ b/tests/value/alias.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: #"-no-results-function f"
+   STDOPT: #"-eva-no-results-function f"
    STDOPT: #"-main main3"
    STDOPT: #"-main main4 -absolute-valid-range 0-0xFF"
    STDOPT: #"-main main5"
diff --git a/tests/value/base_addr_offset_block_length.i b/tests/value/base_addr_offset_block_length.i
index 4a20889d500dc60519782ff4c15c287bfb360174..b3aad4d14b7a622e69f1e547cd8f84ef8434dfbd 100644
--- a/tests/value/base_addr_offset_block_length.i
+++ b/tests/value/base_addr_offset_block_length.i
@@ -1,5 +1,5 @@
 /* run.config*
-   OPT: -no-autoload-plugins -load-module inout,eva -eva @EVA_CONFIG@ -context-width 3 -then -slevel 3
+   OPT: -no-autoload-plugins -load-module inout,eva -eva @EVA_CONFIG@ -eva-context-width 3 -then -eva-slevel 3
 */
 
 
diff --git a/tests/value/big_lib_entry.i b/tests/value/big_lib_entry.i
index 88a7fbc821ae225258a104cb7fd8e57aa28b6445..0c2770eab0fefe3254629223350644dbbf8493e2 100644
--- a/tests/value/big_lib_entry.i
+++ b/tests/value/big_lib_entry.i
@@ -1,5 +1,5 @@
 /* run.config*
-   OPT: -no-autoload-plugins -load-module inout,eva -eva @EVA_CONFIG@ -lib-entry -context-width 4 -eva-initialization-padding-globals no
+   OPT: -no-autoload-plugins -load-module inout,eva -eva @EVA_CONFIG@ -lib-entry -eva-context-width 4 -eva-initialization-padding-globals no
 */
 
 typedef struct {
diff --git a/tests/value/bitwise.i b/tests/value/bitwise.i
index 10db311b22c2b3ce8099b118afa2d099e5afbc11..92a3bc59753007005c262734211c8a2d0d8f4aa6 100644
--- a/tests/value/bitwise.i
+++ b/tests/value/bitwise.i
@@ -2,11 +2,16 @@
    STDOPT: +"-big-ints-hex 256"
 */
 
-/*@ assigns \result \from min, max;
-    ensures min <= \result <= max ;
+/*@ assigns \result \from a, b;
+    ensures result_a_or_b: \result == a || \result == b ;
  */
-int Frama_C_interval(int min, int max);
+extern int Frama_C_nondet(int a, int b);
 
+/*@ requires order: min <= max;
+    assigns \result \from min, max;
+    ensures result_bounded: min <= \result <= max ;
+ */
+extern int Frama_C_interval(int min, int max);
 
 volatile long v;
 volatile unsigned char input[3];
@@ -67,13 +72,22 @@ int test4(void)
   if (something & 0x80000000) {
     Frama_C_show_each_true(something);
     return 0;
-  } 
+  }
   else {
     Frama_C_show_each_false(something);
     return 1;
   }
 }
 
+void test5(void)
+{
+  int x = Frama_C_nondet(-1, 0);
+  int y = Frama_C_nondet(-1, 0);
+  int a = x & y;
+  int b = x | y;
+  int c = x ^ y;
+}
+
 void and_or_rel(void)
 {
   long x, r1, r2, r3;
@@ -150,6 +164,7 @@ void main(void) {
   test2();
   test3();
   test4();
+  test5();
   and_or_rel();
   double_neg();
   bug1();
diff --git a/tests/value/bts1306.i b/tests/value/bts1306.i
index f6b51b857843812b7e4d12234621aee910cce851..81f9cc8f329ead372748ebd5eea97821b99bc0bd 100644
--- a/tests/value/bts1306.i
+++ b/tests/value/bts1306.i
@@ -1,5 +1,5 @@
 /* run.config*
-   OPT: -no-autoload-plugins -load-module from,inout,eva -constfold -slevel 0 -eva @EVA_CONFIG@ -print -then -slevel 10 -eva -print
+   OPT: -no-autoload-plugins -load-module from,inout,eva -constfold -eva-slevel 0 -eva @EVA_CONFIG@ -print -then -eva-slevel 10 -eva -print
    */
 
 void g(double x) { double y= x*x; }
diff --git a/tests/value/bug0245.i b/tests/value/bug0245.i
index 584d53f784613d1e5fdaf284e2aab0cdaf4d85c2..1408f3e7deeb0460eecff7c912685185868d8438 100644
--- a/tests/value/bug0245.i
+++ b/tests/value/bug0245.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: #"-slevel 4"
+   STDOPT: #"-eva-slevel 4"
 */
 int R,*p,S,*q;
 
diff --git a/tests/value/builtins_split.c b/tests/value/builtins_split.c
index a04c5fcd46b8fc0e048b6a8e50fc2fce6d7b9639..cc38f28c313dbd9e2c022b8eabe768de8f2a38c8 100644
--- a/tests/value/builtins_split.c
+++ b/tests/value/builtins_split.c
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: +"-eva-show-progress -slevel 100"
+   STDOPT: +"-eva-show-progress -eva-slevel 100"
 */
 
 int *p;
diff --git a/tests/value/case_analysis.i b/tests/value/case_analysis.i
index 7d9214dd079a84c2c58e219dd718d5a27b99bb24..40be501257b9f1b5edca5e3a305db685148deb04 100644
--- a/tests/value/case_analysis.i
+++ b/tests/value/case_analysis.i
@@ -1,5 +1,5 @@
 /* run.config*
-   OPT: -no-autoload-plugins -load-module inout,eva -eva @EVA_CONFIG@ -slevel 30 -journal-disable -float-normal
+   OPT: -no-autoload-plugins -load-module inout,eva -eva @EVA_CONFIG@ -eva-slevel 30 -journal-disable -float-normal
 
 */
 
diff --git a/tests/value/cmp_ptr.i b/tests/value/cmp_ptr.i
index 198a11aacafb3b00f5ac7bc29616a246c9dfba81..da2355d605ce612d4dc434c9509789e2602949a7 100644
--- a/tests/value/cmp_ptr.i
+++ b/tests/value/cmp_ptr.i
@@ -1,6 +1,6 @@
 /* run.config*
    STDOPT: #"-main main -eva-msg-key pointer-comparison"
-   STDOPT: #"-undefined-pointer-comparison-propagate-all -eva-msg-key pointer-comparison"
+   STDOPT: #"-eva-undefined-pointer-comparison-propagate-all -eva-msg-key pointer-comparison"
 */
 
 int *p,T[10]={0,1,2,3,4,5,6,7,8,9};
diff --git a/tests/value/cmp_ptr_follow_all_branches.i b/tests/value/cmp_ptr_follow_all_branches.i
index 2e5292ae2db3c924c1586872f139a8dfd3a55378..71e72fec503aa835b228de03a8e238e7ac627b69 100644
--- a/tests/value/cmp_ptr_follow_all_branches.i
+++ b/tests/value/cmp_ptr_follow_all_branches.i
@@ -1,6 +1,6 @@
 /* run.config*
    STDOPT: #"-eva-msg-key pointer-comparison"
-   STDOPT: #"-undefined-pointer-comparison-propagate-all -eva-msg-key pointer-comparison"
+   STDOPT: #"-eva-undefined-pointer-comparison-propagate-all -eva-msg-key pointer-comparison"
 */
 
 int a;
diff --git a/tests/value/cond_integer_cast_of_float.i b/tests/value/cond_integer_cast_of_float.i
index 3a6d8768ec945afce02f2c361459b3d97e9903f7..9d1350ea671348d2759998a9ec5b3f9a2473455b 100644
--- a/tests/value/cond_integer_cast_of_float.i
+++ b/tests/value/cond_integer_cast_of_float.i
@@ -1,5 +1,5 @@
 /* run.config*
-   OPT: -no-autoload-plugins -load-module eva -eva @EVA_CONFIG@ -no-results -then -float-hex -main mainbis
+   OPT: -no-autoload-plugins -load-module eva -eva @EVA_CONFIG@ -eva-no-results -then -float-hex -main mainbis
 */
 typedef double D;
 typedef float F;
diff --git a/tests/value/context_width.i b/tests/value/context_width.i
index b9209213bc3f93315d7fdb4fbd476f53caee2776..e2f3d39895a2dbbebc76cb98c263efac2e5aa080 100644
--- a/tests/value/context_width.i
+++ b/tests/value/context_width.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: +"-context-width 3 -then -print -then -context-width 1"
+   STDOPT: +"-eva-context-width 3 -then -print -then -eva-context-width 1"
 */
 
 int a;
diff --git a/tests/value/div.i b/tests/value/div.i
index dcea8cf46d46eb257041662c2645467b92d170aa..3ac38b6068dae4271ea190752b7b1efcac5fe878 100644
--- a/tests/value/div.i
+++ b/tests/value/div.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: #"-load-module scope -remove-redundant-alarms"
+   STDOPT: #"-load-module scope -eva-remove-redundant-alarms"
    OPT: -no-autoload-plugins -load-module eva,inout -rte -then -eva @EVA_CONFIG@
 */
 int X,Y,Z1,Z2,T,U1,U2,V,W1,W2;
diff --git a/tests/value/domains.i b/tests/value/domains.i
index 434324fc2f5dd1047505aed2df088c06631bdccb..22b198ea39fc8bd5e37848ce41c3dbf82294acd3 100644
--- a/tests/value/domains.i
+++ b/tests/value/domains.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: #"-eva-domains sign,equality,bitwise,symbolic-locations,gauges -slevel 2"
+   STDOPT: #"-eva-domains sign,equality,bitwise,symbolic-locations,gauges -eva-slevel 2"
 */
 
 /*  Tests five domains together. */
diff --git a/tests/value/exit_paths.i b/tests/value/exit_paths.i
index 9182998fe6295a704b306442e1a23c2847412ba3..3d0ac19e03486b4f1ec0f3113323621116a48f5c 100644
--- a/tests/value/exit_paths.i
+++ b/tests/value/exit_paths.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: +"-wlevel 1"
+   STDOPT: +"-eva-widening-delay 1"
 */
 
 #include "__fc_builtin.h"
diff --git a/tests/value/gauges.c b/tests/value/gauges.c
index ab2963f70b41dbb3f18e2a7915fc2d81a7c0d5d4..8acfac2c4118ae76f68f363d01f00159e02e04f9 100644
--- a/tests/value/gauges.c
+++ b/tests/value/gauges.c
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: +" -slevel-function main8_aux:2,main5_bis:4 -eva-msg-key d-gauges"
+   STDOPT: +" -eva-slevel-function main8_aux:2,main5_bis:4 -eva-msg-key d-gauges"
 */
 
 #include <stdlib.h>
diff --git a/tests/value/invalid_loc_return.i b/tests/value/invalid_loc_return.i
index 729b0a9038c108492f02071ee645ab7160d7b6ba..7cdc2deecad080c2053ea4fc300c48efb525a793 100644
--- a/tests/value/invalid_loc_return.i
+++ b/tests/value/invalid_loc_return.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: +"-main main1 -then -slevel 3 -main main2"
+   STDOPT: +"-main main1 -then -eva-slevel 3 -main main2"
 */
 
 int foo() {
diff --git a/tests/value/lazy.i b/tests/value/lazy.i
index 11f7d183bfbe11ea5176b9d9d758e079701fafbc..5b4b95d35dcbe6e6dade2a74277075ba902d34b7 100644
--- a/tests/value/lazy.i
+++ b/tests/value/lazy.i
@@ -1,6 +1,6 @@
 /* run.config*
    STDOPT: #"-eva-msg-key pointer-comparison"
-   STDOPT: #"-undefined-pointer-comparison-propagate-all -eva-msg-key pointer-comparison"
+   STDOPT: #"-eva-undefined-pointer-comparison-propagate-all -eva-msg-key pointer-comparison"
 */
 int a=-1;
 int b, d;
diff --git a/tests/value/library.i b/tests/value/library.i
index bbb69d46eb94dd04abf1dc6f3a0f186c14c315f0..6f7615e06383c9692c4e0050d7f06e36194411b3 100644
--- a/tests/value/library.i
+++ b/tests/value/library.i
@@ -1,6 +1,6 @@
 /* run.config*
    GCC:
-   STDOPT: +"-eva-msg-key initial-state -eva-initialization-padding-globals no -lib-entry -main main -context-depth 3 -then -main main2 -then -context-width 4"
+   STDOPT: +"-eva-msg-key initial-state -eva-initialization-padding-globals no -lib-entry -main main -eva-context-depth 3 -then -main main2 -then -eva-context-width 4"
 */
 int f_int(int x);
 
diff --git a/tests/value/local_slevel.i b/tests/value/local_slevel.i
index 985751249a226ba99972a87bab0d0d6f723ede39..f8a28e1829933eca449024a9d5c635fb03a98f24 100644
--- a/tests/value/local_slevel.i
+++ b/tests/value/local_slevel.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: +" -load-module frama-c-constant_propagation -slevel-function main2:100000 -print -then -scf -then-on propagated -eva -eva-show-progress -no-scf"
+   STDOPT: +" -load-module frama-c-constant_propagation -eva-slevel-function main2:100000 -print -then -scf -then-on propagated -eva -eva-show-progress -no-scf"
 */
 
 int *p;
diff --git a/tests/value/logic_ptr_cast.i b/tests/value/logic_ptr_cast.i
index 6f4c7af2f12976ac4cab2c017bad0db2d826d135..64eb43489d69f0c135df3a29dda3d8eee22bb6c2 100644
--- a/tests/value/logic_ptr_cast.i
+++ b/tests/value/logic_ptr_cast.i
@@ -1,5 +1,5 @@
 /* run.config*
-   OPT: -no-autoload-plugins -load-module eva -eva @EVA_CONFIG@ -print -journal-disable -no-results
+   OPT: -no-autoload-plugins -load-module eva -eva @EVA_CONFIG@ -print -journal-disable -eva-no-results
 */
 int *p;
 int t[90];
diff --git a/tests/value/loopfun.i b/tests/value/loopfun.i
index 030e2654b43ef017571f659a983d660c59ed3315..2db5a9837a566a70e3ab9b52f690bedb21f26e14 100644
--- a/tests/value/loopfun.i
+++ b/tests/value/loopfun.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: +"-slevel 50 -no-results"
+   STDOPT: +"-eva-slevel 50 -eva-no-results"
    STDOPT: +"-eva-warn-key=missing-loop-unroll=feedback -eva-warn-key=missing-loop-unroll:for=active -main main2"
 */
 static int a = 7;
diff --git a/tests/value/loopinv.c b/tests/value/loopinv.c
index fbb89b089a48133c41a3cfa20648cb9a5b2c633d..26f3a1e37b27e5b099b572084544f16092a6d911 100644
--- a/tests/value/loopinv.c
+++ b/tests/value/loopinv.c
@@ -1,5 +1,5 @@
 /* run.config* 
-OPT: @EVA_CONFIG@ -no-autoload-plugins -load-module from,inout,eva,report -slevel-function main2:20 -pp-annot -eva -then -report
+OPT: @EVA_CONFIG@ -no-autoload-plugins -load-module from,inout,eva,report -eva-slevel-function main2:20 -pp-annot -eva -then -report
 */
 
 /*@ requires valid: \valid(&t[0..s-1]);
diff --git a/tests/value/modulo.i b/tests/value/modulo.i
index 81d342ce9470528e1e0573acd12de263133c6269..70e4fe6ceec0abdb7f206548ce5e2a3274d0dc25 100644
--- a/tests/value/modulo.i
+++ b/tests/value/modulo.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: #"-slevel-function pgcd1:100,pgcd2:100,pgcd3:100"
+   STDOPT: #"-eva-slevel-function pgcd1:100,pgcd2:100,pgcd3:100"
 */
 int A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R;
 volatile v;
diff --git a/tests/value/narrow_behaviors.i b/tests/value/narrow_behaviors.i
index 64d98062b974c7c2c08a6c2cd4fecf86ea31f830..ba639b21956aaca1ad7e86a4a7f6159bafa98f78 100644
--- a/tests/value/narrow_behaviors.i
+++ b/tests/value/narrow_behaviors.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: +"-slevel 10 -eva-verbose 2"
+   STDOPT: +"-eva-slevel 10 -eva-verbose 2"
 */
 
 extern int nondet;
diff --git a/tests/value/no_results.c b/tests/value/no_results.c
index 1f2355186c9fb157e5d69aa965e1476a3dee0c14..39549decf2a333dd2d54028da0eba8b96aa41c0a 100644
--- a/tests/value/no_results.c
+++ b/tests/value/no_results.c
@@ -1,5 +1,5 @@
 /* run.config*
-  STDOPT: #"-no-results-function init -calldeps -slevel 10000" +"-inout"
+  STDOPT: #"-eva-no-results-function init -calldeps -eva-slevel 10000" +"-inout"
 */
 
 #define N 3000
diff --git a/tests/value/oracle/bitwise.res.oracle b/tests/value/oracle/bitwise.res.oracle
index 6bc3b9a6069a417bc90554dcd130c7804dbbd722..3269def78ebc040a2fb979380eab678cf8290891 100644
--- a/tests/value/oracle/bitwise.res.oracle
+++ b/tests/value/oracle/bitwise.res.oracle
@@ -7,74 +7,93 @@
   input[0..2] ∈ [--..--]
   s ∈ [--..--]
 [eva] computing for function test1 <- main.
-  Called from bitwise.i:149.
+  Called from bitwise.i:163.
 [eva] computing for function Frama_C_interval <- test1 <- main.
-  Called from bitwise.i:23.
+  Called from bitwise.i:28.
 [eva] using specification for function Frama_C_interval
+[eva] bitwise.i:28: 
+  function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
 [eva] computing for function Frama_C_interval <- test1 <- main.
-  Called from bitwise.i:24.
+  Called from bitwise.i:29.
+[eva] bitwise.i:29: 
+  function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
 [eva] computing for function Frama_C_interval <- test1 <- main.
-  Called from bitwise.i:25.
+  Called from bitwise.i:30.
+[eva] bitwise.i:30: 
+  function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
 [eva] Recording results for test1
 [eva] Done for function test1
 [eva] computing for function test2 <- main.
-  Called from bitwise.i:150.
+  Called from bitwise.i:164.
 [eva] computing for function Frama_C_interval <- test2 <- main.
-  Called from bitwise.i:50.
+  Called from bitwise.i:55.
+[eva] bitwise.i:55: 
+  function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
 [eva] Recording results for test2
 [eva] Done for function test2
 [eva] computing for function test3 <- main.
-  Called from bitwise.i:151.
+  Called from bitwise.i:165.
 [eva] Recording results for test3
 [eva] Done for function test3
 [eva] computing for function test4 <- main.
-  Called from bitwise.i:152.
-[eva] bitwise.i:62: assertion got status valid.
-[eva] bitwise.i:64: Frama_C_show_each_1: [0x80000000..0xFFFFFFFF], {0x80000000}
-[eva] bitwise.i:64: Frama_C_show_each_1: [0..0x7FFFFFFF], {0}
-[eva] bitwise.i:66: Frama_C_show_each_2: [0..0x7FFFFFFF], {0}, {0x80000000}
-[eva] bitwise.i:66: Frama_C_show_each_2: [0..0x7FFFFFFF], {0}, {0}
-[eva] bitwise.i:72: Frama_C_show_each_false: [0..0x7FFFFFFF]
-[eva] bitwise.i:72: Frama_C_show_each_false: [0..0x7FFFFFFF]
+  Called from bitwise.i:166.
+[eva] bitwise.i:67: assertion got status valid.
+[eva] bitwise.i:69: Frama_C_show_each_1: [0x80000000..0xFFFFFFFF], {0x80000000}
+[eva] bitwise.i:69: Frama_C_show_each_1: [0..0x7FFFFFFF], {0}
+[eva] bitwise.i:71: Frama_C_show_each_2: [0..0x7FFFFFFF], {0}, {0x80000000}
+[eva] bitwise.i:71: Frama_C_show_each_2: [0..0x7FFFFFFF], {0}, {0}
+[eva] bitwise.i:77: Frama_C_show_each_false: [0..0x7FFFFFFF]
+[eva] bitwise.i:77: Frama_C_show_each_false: [0..0x7FFFFFFF]
 [eva] Recording results for test4
 [eva] Done for function test4
+[eva] computing for function test5 <- main.
+  Called from bitwise.i:167.
+[eva] computing for function Frama_C_nondet <- test5 <- main.
+  Called from bitwise.i:84.
+[eva] using specification for function Frama_C_nondet
+[eva] Done for function Frama_C_nondet
+[eva] computing for function Frama_C_nondet <- test5 <- main.
+  Called from bitwise.i:85.
+[eva] Done for function Frama_C_nondet
+[eva] Recording results for test5
+[eva] Done for function test5
 [eva] computing for function and_or_rel <- main.
-  Called from bitwise.i:153.
-[eva:alarm] bitwise.i:87: Warning: assertion got status unknown.
+  Called from bitwise.i:168.
+[eva:alarm] bitwise.i:101: Warning: assertion got status unknown.
 [eva] Recording results for and_or_rel
 [eva] Done for function and_or_rel
 [eva] computing for function double_neg <- main.
-  Called from bitwise.i:154.
+  Called from bitwise.i:169.
 [eva] Recording results for double_neg
 [eva] Done for function double_neg
 [eva] computing for function bug1 <- main.
-  Called from bitwise.i:155.
+  Called from bitwise.i:170.
 [eva] Recording results for bug1
 [eva] Done for function bug1
 [eva] computing for function bug2 <- main.
-  Called from bitwise.i:156.
-[eva] bitwise.i:114: Frama_C_show_each_then:
-[eva] bitwise.i:114: Frama_C_show_each_else:
+  Called from bitwise.i:171.
+[eva] bitwise.i:128: Frama_C_show_each_then:
+[eva] bitwise.i:128: Frama_C_show_each_else:
 [eva] Recording results for bug2
 [eva] Done for function bug2
 [eva] computing for function bug3 <- main.
-  Called from bitwise.i:157.
-[eva] bitwise.i:121: Frama_C_show_each: {0x41F656F}, {0xFBE09A91}
+  Called from bitwise.i:172.
+[eva] bitwise.i:135: Frama_C_show_each: {0x41F656F}, {0xFBE09A91}
 [eva] Recording results for bug3
 [eva] Done for function bug3
 [eva] computing for function bug4 <- main.
-  Called from bitwise.i:158.
-[eva] bitwise.i:131: Frama_C_show_each_then:
-[eva] bitwise.i:133: Frama_C_show_each_else:
+  Called from bitwise.i:173.
+[eva] bitwise.i:145: Frama_C_show_each_then:
+[eva] bitwise.i:147: Frama_C_show_each_else:
 [eva] Recording results for bug4
 [eva] Done for function bug4
 [eva] computing for function bug5 <- main.
-  Called from bitwise.i:159.
-[eva] bitwise.i:144: Frama_C_show_each_dead: {0}
+  Called from bitwise.i:174.
+[eva] bitwise.i:158: Frama_C_show_each_dead: {0}
 [eva] Recording results for bug5
 [eva] Done for function bug5
 [eva] Recording results for main
@@ -134,6 +153,12 @@
   something ∈ [0..0x7FFFFFFF]
   topBitOnly ∈ {0; 0x80000000}
   __retres ∈ {1}
+[eva:final-states] Values at end of function test5:
+  x ∈ {-1; 0}
+  y ∈ {-1; 0}
+  a ∈ {-1; 0}
+  b ∈ {-1; 0}
+  c ∈ {-1; 0}
 [eva:final-states] Values at end of function main:
   
 [from] Computing for function and_or_rel
@@ -160,12 +185,18 @@
 [from] Done for function test3
 [from] Computing for function test4
 [from] Done for function test4
+[from] Computing for function test5
+[from] Computing for function Frama_C_nondet <-test5
+[from] Done for function Frama_C_nondet
+[from] Done for function test5
 [from] Computing for function main
 [from] Done for function main
 [from] ====== DEPENDENCIES COMPUTED ======
   These dependencies hold at termination for the executions that terminate:
 [from] Function Frama_C_interval:
   \result FROM min; max
+[from] Function Frama_C_nondet:
+  \result FROM a; b
 [from] Function and_or_rel:
   NO EFFECTS
 [from] Function bug1:
@@ -188,6 +219,8 @@
   NO EFFECTS
 [from] Function test4:
   \result FROM v
+[from] Function test5:
+  NO EFFECTS
 [from] Function main:
   NO EFFECTS
 [from] ====== END OF DEPENDENCIES ======
@@ -236,6 +269,10 @@
     something; topBitOnly; __retres
 [inout] Inputs for function test4:
     v
+[inout] Out (internal) for function test5:
+    x; y; a; b; c
+[inout] Inputs for function test5:
+    \nothing
 [inout] Out (internal) for function main:
     \nothing
 [inout] Inputs for function main:
diff --git a/tests/value/oracle/partitioning-annots.0.res.oracle b/tests/value/oracle/partitioning-annots.0.res.oracle
index 49ca4cf2ae505b52b971a109b69d73876fc082fd..69b4d1c2277179f67e4ad698ec300ccc1dd089f8 100644
--- a/tests/value/oracle/partitioning-annots.0.res.oracle
+++ b/tests/value/oracle/partitioning-annots.0.res.oracle
@@ -4,20 +4,33 @@
 [eva] Initial state computed
 [eva:initial-state] Values of globals at initialization
   k ∈ {0}
+  nondet ∈ [--..--]
 [eva:loop-unroll] partitioning-annots.c:26: loop not completely unrolled
 [eva] partitioning-annots.c:26: starting to merge loop iterations
 [eva:loop-unroll] partitioning-annots.c:34: loop not completely unrolled
 [eva] partitioning-annots.c:34: starting to merge loop iterations
 [eva] partitioning-annots.c:36: starting to merge loop iterations
-[eva:loop-unroll] partitioning-annots.c:50: loop not completely unrolled
-[eva] partitioning-annots.c:50: starting to merge loop iterations
+[eva:loop-unroll] partitioning-annots.c:49: loop not completely unrolled
+[eva] partitioning-annots.c:49: starting to merge loop iterations
+[eva:loop-unroll] partitioning-annots.c:54: loop not completely unrolled
+[eva] partitioning-annots.c:54: starting to merge loop iterations
 [eva] Recording results for test_unroll
 [eva] done for function test_unroll
 [eva] ====== VALUES COMPUTED ======
 [eva:final-states] Values at end of function test_unroll:
   a[0..9] ∈ {42}
   b[0..9] ∈ {42}
-  c[0..9] ∈ {0}
+  c[0] ∈ {0}
+   [1] ∈ {1}
+   [2] ∈ {0}
+   [3] ∈ {1}
+   [4] ∈ {0}
+   [5] ∈ {1}
+   [6] ∈ {0}
+   [7] ∈ {1}
+   [8] ∈ {0}
+   [9] ∈ {1}
+   [10..19] ∈ {0; 1} or UNINITIALIZED
   d[0..9] ∈ {0}
    [10..19] ∈ {0} or UNINITIALIZED
   e[0] ∈ {1}
@@ -37,7 +50,7 @@
   NO EFFECTS
 [from] ====== END OF DEPENDENCIES ======
 [inout] Out (internal) for function test_unroll:
-    a[0..9]; b[0..9]; c[0..9]; d[0..19]; e[0..9]; i; j; i_0; j_0; i_1; 
+    a[0..9]; b[0..9]; c[0..19]; d[0..19]; e[0..9]; i; j; i_0; j_0; i_1; 
     i_2; i_3; j_1
 [inout] Inputs for function test_unroll:
     \nothing
diff --git a/tests/value/oracle/partitioning-annots.1.res.oracle b/tests/value/oracle/partitioning-annots.1.res.oracle
index c2c1fd50310f5397fe676724d47b502af162816d..0ba3a253513a9c919d0b98c55c98bee70dc0161e 100644
--- a/tests/value/oracle/partitioning-annots.1.res.oracle
+++ b/tests/value/oracle/partitioning-annots.1.res.oracle
@@ -4,42 +4,43 @@
 [eva] Initial state computed
 [eva:initial-state] Values of globals at initialization
   k ∈ {0}
+  nondet ∈ [--..--]
 [eva] computing for function Frama_C_interval <- test_split.
-  Called from partitioning-annots.c:69.
+  Called from partitioning-annots.c:73.
 [eva] using specification for function Frama_C_interval
-[eva] partitioning-annots.c:69: 
+[eva] partitioning-annots.c:73: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
 [eva] computing for function Frama_C_interval <- test_split.
-  Called from partitioning-annots.c:70.
-[eva] partitioning-annots.c:70: 
+  Called from partitioning-annots.c:74.
+[eva] partitioning-annots.c:74: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] partitioning-annots.c:76: 
+[eva] partitioning-annots.c:80: 
   Frama_C_show_each_before_first_split: {0; 1}, {0; 1; 2}, {0}
-[eva] partitioning-annots.c:79: 
+[eva] partitioning-annots.c:83: 
   Frama_C_show_each_before_second_split: {1}, {0; 1; 2}, {1}
-[eva] partitioning-annots.c:79: 
+[eva] partitioning-annots.c:83: 
   Frama_C_show_each_before_second_split: {0}, {0; 1; 2}, {0}
-[eva] partitioning-annots.c:81: 
+[eva] partitioning-annots.c:85: 
   Frama_C_show_each_before_first_merge: {1}, {2}, {1}
-[eva] partitioning-annots.c:81: 
+[eva] partitioning-annots.c:85: 
   Frama_C_show_each_before_first_merge: {1}, {1}, {1}
-[eva] partitioning-annots.c:81: 
+[eva] partitioning-annots.c:85: 
   Frama_C_show_each_before_first_merge: {1}, {0}, {1}
-[eva] partitioning-annots.c:81: 
+[eva] partitioning-annots.c:85: 
   Frama_C_show_each_before_first_merge: {0}, {2}, {0}
-[eva] partitioning-annots.c:81: 
+[eva] partitioning-annots.c:85: 
   Frama_C_show_each_before_first_merge: {0}, {1}, {0}
-[eva] partitioning-annots.c:81: 
+[eva] partitioning-annots.c:85: 
   Frama_C_show_each_before_first_merge: {0}, {0}, {0}
-[eva] partitioning-annots.c:83: 
+[eva] partitioning-annots.c:87: 
   Frama_C_show_each_before_second_merge: {0; 1}, {2}, {0; 1}
-[eva] partitioning-annots.c:83: 
+[eva] partitioning-annots.c:87: 
   Frama_C_show_each_before_second_merge: {0; 1}, {1}, {0; 1}
-[eva] partitioning-annots.c:83: 
+[eva] partitioning-annots.c:87: 
   Frama_C_show_each_before_second_merge: {0; 1}, {0}, {0; 1}
-[eva] partitioning-annots.c:85: Frama_C_show_each_end: {0; 1}, {0; 1; 2}, {0; 1}
+[eva] partitioning-annots.c:89: Frama_C_show_each_end: {0; 1}, {0; 1; 2}, {0; 1}
 [eva] Recording results for test_split
 [eva] done for function test_split
 [eva] ====== VALUES COMPUTED ======
diff --git a/tests/value/oracle/partitioning-annots.2.res.oracle b/tests/value/oracle/partitioning-annots.2.res.oracle
index 763e813a17338e110202288bfed6575340530ed5..9ab5a37a1dcbea7fb776f74b4d0aa4398495e487 100644
--- a/tests/value/oracle/partitioning-annots.2.res.oracle
+++ b/tests/value/oracle/partitioning-annots.2.res.oracle
@@ -4,49 +4,50 @@
 [eva] Initial state computed
 [eva:initial-state] Values of globals at initialization
   k ∈ {0}
+  nondet ∈ [--..--]
 [eva] computing for function Frama_C_interval <- test_split.
-  Called from partitioning-annots.c:69.
+  Called from partitioning-annots.c:73.
 [eva] using specification for function Frama_C_interval
-[eva] partitioning-annots.c:69: 
+[eva] partitioning-annots.c:73: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
 [eva] computing for function Frama_C_interval <- test_split.
-  Called from partitioning-annots.c:70.
-[eva] partitioning-annots.c:70: 
+  Called from partitioning-annots.c:74.
+[eva] partitioning-annots.c:74: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] partitioning-annots.c:76: 
+[eva] partitioning-annots.c:80: 
   Frama_C_show_each_before_first_split: {0; 1}, {0; 1; 2}, {0}
-[eva] partitioning-annots.c:79: 
+[eva] partitioning-annots.c:83: 
   Frama_C_show_each_before_second_split: {1}, {0; 1; 2}, {1}
-[eva] partitioning-annots.c:79: 
+[eva] partitioning-annots.c:83: 
   Frama_C_show_each_before_second_split: {0}, {0; 1; 2}, {0}
-[eva] partitioning-annots.c:81: 
+[eva] partitioning-annots.c:85: 
   Frama_C_show_each_before_first_merge: {1}, {2}, {1}
-[eva] partitioning-annots.c:81: 
+[eva] partitioning-annots.c:85: 
   Frama_C_show_each_before_first_merge: {1}, {1}, {1}
-[eva] partitioning-annots.c:81: 
+[eva] partitioning-annots.c:85: 
   Frama_C_show_each_before_first_merge: {1}, {0}, {1}
-[eva] partitioning-annots.c:81: 
+[eva] partitioning-annots.c:85: 
   Frama_C_show_each_before_first_merge: {0}, {2}, {0}
-[eva] partitioning-annots.c:81: 
+[eva] partitioning-annots.c:85: 
   Frama_C_show_each_before_first_merge: {0}, {1}, {0}
-[eva] partitioning-annots.c:81: 
+[eva] partitioning-annots.c:85: 
   Frama_C_show_each_before_first_merge: {0}, {0}, {0}
-[eva] partitioning-annots.c:83: 
+[eva] partitioning-annots.c:87: 
   Frama_C_show_each_before_second_merge: {1}, {2}, {1}
-[eva] partitioning-annots.c:83: 
+[eva] partitioning-annots.c:87: 
   Frama_C_show_each_before_second_merge: {0}, {2}, {0}
-[eva] partitioning-annots.c:83: 
+[eva] partitioning-annots.c:87: 
   Frama_C_show_each_before_second_merge: {1}, {1}, {1}
-[eva] partitioning-annots.c:83: 
+[eva] partitioning-annots.c:87: 
   Frama_C_show_each_before_second_merge: {0}, {1}, {0}
-[eva] partitioning-annots.c:83: 
+[eva] partitioning-annots.c:87: 
   Frama_C_show_each_before_second_merge: {1}, {0}, {1}
-[eva] partitioning-annots.c:83: 
+[eva] partitioning-annots.c:87: 
   Frama_C_show_each_before_second_merge: {0}, {0}, {0}
-[eva] partitioning-annots.c:85: Frama_C_show_each_end: {1}, {0; 1; 2}, {1}
-[eva] partitioning-annots.c:85: Frama_C_show_each_end: {0}, {0; 1; 2}, {0}
+[eva] partitioning-annots.c:89: Frama_C_show_each_end: {1}, {0; 1; 2}, {1}
+[eva] partitioning-annots.c:89: Frama_C_show_each_end: {0}, {0; 1; 2}, {0}
 [eva] Recording results for test_split
 [eva] done for function test_split
 [eva] ====== VALUES COMPUTED ======
diff --git a/tests/value/oracle/partitioning-annots.3.res.oracle b/tests/value/oracle/partitioning-annots.3.res.oracle
index ba21b5deb7aee89d1b0c62bd8dc8554619cbce50..a3a7eee5677ba1762978609cb8a1d44fe3c9e6a6 100644
--- a/tests/value/oracle/partitioning-annots.3.res.oracle
+++ b/tests/value/oracle/partitioning-annots.3.res.oracle
@@ -4,42 +4,43 @@
 [eva] Initial state computed
 [eva:initial-state] Values of globals at initialization
   k ∈ {0}
+  nondet ∈ [--..--]
 [eva] computing for function Frama_C_interval <- test_loop_split.
-  Called from partitioning-annots.c:103.
+  Called from partitioning-annots.c:107.
 [eva] using specification for function Frama_C_interval
-[eva] partitioning-annots.c:103: 
+[eva] partitioning-annots.c:107: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
 [eva] computing for function Frama_C_interval <- test_loop_split.
-  Called from partitioning-annots.c:103.
+  Called from partitioning-annots.c:107.
 [eva] Done for function Frama_C_interval
-[eva] partitioning-annots.c:101: starting to merge loop iterations
+[eva] partitioning-annots.c:105: starting to merge loop iterations
 [eva] computing for function Frama_C_interval <- test_loop_split.
-  Called from partitioning-annots.c:103.
+  Called from partitioning-annots.c:107.
 [eva] Done for function Frama_C_interval
 [eva] computing for function Frama_C_interval <- test_loop_split.
-  Called from partitioning-annots.c:103.
+  Called from partitioning-annots.c:107.
 [eva] Done for function Frama_C_interval
 [eva] computing for function Frama_C_interval <- test_loop_split.
-  Called from partitioning-annots.c:103.
+  Called from partitioning-annots.c:107.
 [eva] Done for function Frama_C_interval
 [eva] computing for function Frama_C_interval <- test_loop_split.
-  Called from partitioning-annots.c:103.
+  Called from partitioning-annots.c:107.
 [eva] Done for function Frama_C_interval
-[eva:alarm] partitioning-annots.c:110: Warning: 
+[eva:alarm] partitioning-annots.c:114: Warning: 
   accessing uninitialized left-value. assert \initialized(&A[i]);
-[eva] partitioning-annots.c:115: Frama_C_show_each: {9}, {42}
-[eva] partitioning-annots.c:115: Frama_C_show_each: {8}, {42}
-[eva] partitioning-annots.c:115: Frama_C_show_each: {7}, {42}
-[eva] partitioning-annots.c:115: Frama_C_show_each: {6}, {42}
-[eva] partitioning-annots.c:115: Frama_C_show_each: {5}, {42}
-[eva] partitioning-annots.c:115: Frama_C_show_each: {4}, {42}
-[eva] partitioning-annots.c:115: Frama_C_show_each: {3}, {42}
-[eva] partitioning-annots.c:115: Frama_C_show_each: {2}, {42}
-[eva] partitioning-annots.c:115: Frama_C_show_each: {1}, {42}
-[eva] partitioning-annots.c:115: Frama_C_show_each: {0}, {42}
-[eva] partitioning-annots.c:116: assertion got status valid.
-[eva] partitioning-annots.c:119: Frama_C_show_each: {{ "Value 42 not found" }}
+[eva] partitioning-annots.c:119: Frama_C_show_each: {9}, {42}
+[eva] partitioning-annots.c:119: Frama_C_show_each: {8}, {42}
+[eva] partitioning-annots.c:119: Frama_C_show_each: {7}, {42}
+[eva] partitioning-annots.c:119: Frama_C_show_each: {6}, {42}
+[eva] partitioning-annots.c:119: Frama_C_show_each: {5}, {42}
+[eva] partitioning-annots.c:119: Frama_C_show_each: {4}, {42}
+[eva] partitioning-annots.c:119: Frama_C_show_each: {3}, {42}
+[eva] partitioning-annots.c:119: Frama_C_show_each: {2}, {42}
+[eva] partitioning-annots.c:119: Frama_C_show_each: {1}, {42}
+[eva] partitioning-annots.c:119: Frama_C_show_each: {0}, {42}
+[eva] partitioning-annots.c:120: assertion got status valid.
+[eva] partitioning-annots.c:123: Frama_C_show_each: {{ "Value 42 not found" }}
 [eva] Recording results for test_loop_split
 [eva] done for function test_loop_split
 [eva] ====== VALUES COMPUTED ======
diff --git a/tests/value/oracle/partitioning-annots.4.res.oracle b/tests/value/oracle/partitioning-annots.4.res.oracle
index e464f3c67881f2a5e888f9a87032d3f831893297..a86c5b92997165cb0a9b9427ba6f0678e532284f 100644
--- a/tests/value/oracle/partitioning-annots.4.res.oracle
+++ b/tests/value/oracle/partitioning-annots.4.res.oracle
@@ -4,14 +4,15 @@
 [eva] Initial state computed
 [eva:initial-state] Values of globals at initialization
   k ∈ {0}
+  nondet ∈ [--..--]
 [eva] computing for function Frama_C_interval <- test_history.
-  Called from partitioning-annots.c:125.
+  Called from partitioning-annots.c:129.
 [eva] using specification for function Frama_C_interval
-[eva] partitioning-annots.c:125: 
+[eva] partitioning-annots.c:129: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] partitioning-annots.c:131: Frama_C_show_each: {0; 1}, {0; 1}
-[eva:alarm] partitioning-annots.c:134: Warning: 
+[eva] partitioning-annots.c:135: Frama_C_show_each: {0; 1}, {0; 1}
+[eva:alarm] partitioning-annots.c:138: Warning: 
   division by zero. assert j ≢ 0;
 [eva] Recording results for test_history
 [eva] done for function test_history
diff --git a/tests/value/oracle/partitioning-annots.5.res.oracle b/tests/value/oracle/partitioning-annots.5.res.oracle
index 273cca2d4fc67ab59d5870b79aff78ce294a4994..86b522118c4bbd3faa95abf843a0603c2aa186b7 100644
--- a/tests/value/oracle/partitioning-annots.5.res.oracle
+++ b/tests/value/oracle/partitioning-annots.5.res.oracle
@@ -4,14 +4,15 @@
 [eva] Initial state computed
 [eva:initial-state] Values of globals at initialization
   k ∈ {0}
+  nondet ∈ [--..--]
 [eva] computing for function Frama_C_interval <- test_history.
-  Called from partitioning-annots.c:125.
+  Called from partitioning-annots.c:129.
 [eva] using specification for function Frama_C_interval
-[eva] partitioning-annots.c:125: 
+[eva] partitioning-annots.c:129: 
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
-[eva] partitioning-annots.c:131: Frama_C_show_each: {0}, {0}
-[eva] partitioning-annots.c:131: Frama_C_show_each: {1}, {1}
+[eva] partitioning-annots.c:135: Frama_C_show_each: {0}, {0}
+[eva] partitioning-annots.c:135: Frama_C_show_each: {1}, {1}
 [eva] Recording results for test_history
 [eva] done for function test_history
 [eva] ====== VALUES COMPUTED ======
diff --git a/tests/value/oracle/partitioning-annots.6.res.oracle b/tests/value/oracle/partitioning-annots.6.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..fb8cb1079e8bc637416fe8153a62692f78f29e99
--- /dev/null
+++ b/tests/value/oracle/partitioning-annots.6.res.oracle
@@ -0,0 +1,30 @@
+[kernel] Parsing partitioning-annots.c (with preprocessing)
+[eva] Analyzing a complete application starting at test_slevel
+[eva] Computing initial state
+[eva] Initial state computed
+[eva:initial-state] Values of globals at initialization
+  k ∈ {0}
+  nondet ∈ [--..--]
+[eva] partitioning-annots.c:152: starting to merge loop iterations
+[eva] partitioning-annots.c:157: starting to merge loop iterations
+[eva] Recording results for test_slevel
+[eva] done for function test_slevel
+[eva] ====== VALUES COMPUTED ======
+[eva:final-states] Values at end of function test_slevel:
+  a[0..9] ∈ {42}
+  b[0..9] ∈ {42} or UNINITIALIZED
+  c[0..3] ∈ {33; 42}
+   [4..9] ∈ {33; 42} or UNINITIALIZED
+  d[0..9] ∈ {33; 42}
+  e[0..3] ∈ {33; 42}
+[from] Computing for function test_slevel
+[from] Done for function test_slevel
+[from] ====== DEPENDENCIES COMPUTED ======
+  These dependencies hold at termination for the executions that terminate:
+[from] Function test_slevel:
+  NO EFFECTS
+[from] ====== END OF DEPENDENCIES ======
+[inout] Out (internal) for function test_slevel:
+    a[0..9]; b[0..9]; c[0..9]; d[0..9]; e[0..3]; i; i_0; i_1; i_2; i_3
+[inout] Inputs for function test_slevel:
+    nondet
diff --git a/tests/value/oracle/summary.4.res.oracle b/tests/value/oracle/summary.4.res.oracle
index 9fdb33b066340582d5bf45ccab838f51c6215350..2c114d3bd1ddc7c6b54dffd515a2104174725446 100644
--- a/tests/value/oracle/summary.4.res.oracle
+++ b/tests/value/oracle/summary.4.res.oracle
@@ -1,3 +1,5 @@
+[kernel] Warning: -slevel is a deprecated alias for option -eva-slevel.
+  Please use -eva-slevel instead.
 [kernel] Parsing summary.i (no preprocessing)
 [rte] annotating function alarms
 [rte] annotating function bottom
diff --git a/tests/value/oracle/unit_tests.res.oracle b/tests/value/oracle/unit_tests.res.oracle
index 642c36452b36ab98528e6798758fa281b4927ba1..ed760860497292498da505c8df397d69ce04fe97 100644
--- a/tests/value/oracle/unit_tests.res.oracle
+++ b/tests/value/oracle/unit_tests.res.oracle
@@ -1,2 +1 @@
 [kernel] Parsing unit_tests.i (no preprocessing)
-[eva] Runs unit tests: only faulty operations will be printed.
diff --git a/tests/value/partitioning-annots.c b/tests/value/partitioning-annots.c
index 10dd8680c3840d6e85e34a656f72f7e04e090a36..8137bbab1c2ebe6ca36d520993eb22721297491c 100644
--- a/tests/value/partitioning-annots.c
+++ b/tests/value/partitioning-annots.c
@@ -6,16 +6,16 @@
    STDOPT: #"-main test_loop_split -eva-partition-history 1"
    STDOPT: #"-main test_history -eva-partition-history 0"
    STDOPT: #"-main test_history -eva-partition-history 1"
+   STDOPT: #"-main test_slevel"
    */
 
 #include "__fc_builtin.h"
 
 #define N 10
 
-
 void test_unroll()
 {
-  int a[N], b[N], c[N], d[2*N], e[N];
+  int a[N], b[N], c[2*N], d[2*N], e[N];
 
   // The inner loop needs to be unrolled to allow strong updates
   // The outer loops doesn't need to be unrolled
@@ -40,10 +40,14 @@ void test_unroll()
 
   // At the end, we must have both arrays a and b to be fully initialized at 42
 
-  // Small loops can be unrolled without giving an unroll parameter
-  //@ loop unroll N;
-  for (int i = 0 ; i < N ; i++)
-    c[i] = 0;
+  // Small loops can be unrolled without giving an unroll amount.
+  // The actual limit of the number of iterations can be overriden with
+  // the option -eva-default-loop-unroll
+  // Here -eva-default-loop-unroll is set to a value not high enough to
+  // completely unroll the loop thus a warning should be emitted.
+  //@ loop unroll;
+  for (int i = 0 ; i < 2*N ; i++)
+    c[i] = i % 2;
 
   // Longer loops won't be completely unrolled when not giving a parameter
   //@ loop unroll N;
@@ -134,8 +138,53 @@ void test_history()
     k = k / j;
 }
 
+volatile nondet;
+
+void test_slevel()
+{
+  int a[N], b[N], c[N], d[N], e[4];
+  //@slevel 10;
+  for (int i = 0; i < N; i++) {
+    a[i] = 42;
+  }
+  
+  //@slevel default;
+  for (int i = 0; i < N; i++) {
+    b[i] = 42;
+  }
+
+  //@slevel 20;
+  for (int i = 0; i < N; i++) {
+    if (nondet)
+      c[i] = 42;
+    else
+      c[i] = 33;
+  }
+
+  //@slevel 20;
+  for (int i = 0; i < N; i++) {
+    if (nondet)
+      d[i] = 42;
+    else
+      d[i] = 33;
+    //@slevel merge;
+    ; // Otherwise previous annotation is ignored
+  }
+  
+  //@slevel 0;
+  ;
+  //@slevel full;
+  for (int i = 0; i < 4; i++) {
+    if (nondet)
+      e[i] = 42;
+    else
+      e[i] = 33;
+  }
+}
+
 void main(void)
 {
+  test_slevel();
   test_unroll();
   test_split();
   test_loop_split();
diff --git a/tests/value/plevel.i b/tests/value/plevel.i
index 01f7e73dd47f3ea92749bdb166413b7fdaca4c8a..202526dc0dec493b2a96fdf8f34786145210a30e 100644
--- a/tests/value/plevel.i
+++ b/tests/value/plevel.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: #"-plevel 40 -big-ints-hex 0x55"
+   STDOPT: #"-eva-plevel 40 -big-ints-hex 0x55"
 */
 
 int t[0xFFFF];
diff --git a/tests/value/pointer_comparison.c b/tests/value/pointer_comparison.c
index 2dcf42073538d749686ebbd0fe38cc7fc6cb9e30..40717af44c5547544a81941d440e3e5673642187 100644
--- a/tests/value/pointer_comparison.c
+++ b/tests/value/pointer_comparison.c
@@ -1,6 +1,6 @@
 /* run.config*
    STDOPT: +" -load-module report -report-print-properties -eva-warn-undefined-pointer-comparison none -eva-msg-key pointer-comparison -then -report -then -eva-warn-undefined-pointer-comparison pointer -then -report -then -eva-warn-undefined-pointer-comparison all -then -report"
-   STDOPT: +" -load-module report -report-print-properties -undefined-pointer-comparison-propagate-all -eva-warn-undefined-pointer-comparison none -eva-msg-key pointer-comparison -then -report -then -eva-warn-undefined-pointer-comparison pointer -then -report -then -eva-warn-undefined-pointer-comparison all -then -report"
+   STDOPT: +" -load-module report -report-print-properties -eva-undefined-pointer-comparison-propagate-all -eva-warn-undefined-pointer-comparison none -eva-msg-key pointer-comparison -then -report -then -eva-warn-undefined-pointer-comparison pointer -then -report -then -eva-warn-undefined-pointer-comparison all -then -report"
 */
 int x,y,*p;
 int main(){
diff --git a/tests/value/precise_locations.i b/tests/value/precise_locations.i
index 06340dba48ae65c8c9ed814351463b7a34cc27ab..942739895819533255887b5f61ec8f7e124fd806 100644
--- a/tests/value/precise_locations.i
+++ b/tests/value/precise_locations.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: +"-eva-widening-period 3 -then -inout -load-module report -report -then -plevel 250"
+   STDOPT: +"-eva-widening-period 3 -then -inout -load-module report -report -then -eva-plevel 250"
 */
 
 struct s {
diff --git a/tests/value/ptr_call_object.c b/tests/value/ptr_call_object.c
index f8872244f28601965d84fa91fbc764ea07d893ea..b02914deb9630d848e1bcbfaa8c4f4b0d00af6ae 100644
--- a/tests/value/ptr_call_object.c
+++ b/tests/value/ptr_call_object.c
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: +"-slevel 2"
+   STDOPT: +"-eva-slevel 2"
 */
 
 struct obj {
diff --git a/tests/value/recol.c b/tests/value/recol.c
index 5d0d3e258cafc1c7999e035c68337ba922a2b1db..46f6de92f5ab375b405205aee08f18c3c344ddcf 100644
--- a/tests/value/recol.c
+++ b/tests/value/recol.c
@@ -1,6 +1,6 @@
 /* run.config*
-   OPT: -no-autoload-plugins -load-module eva,inout -eva @EVA_CONFIG@ -slevel 100 -cpp-extra-args="-DPTEST " -journal-disable -no-warn-signed-overflow
-   OPT: -no-autoload-plugins -load-module eva,inout -eva @EVA_CONFIG@ -slevel 100 -cpp-extra-args="-DPTEST " -journal-disable -machdep ppc_32 -no-warn-signed-overflow
+   OPT: -no-autoload-plugins -load-module eva,inout -eva @EVA_CONFIG@ -eva-slevel 100 -cpp-extra-args="-DPTEST " -journal-disable -no-warn-signed-overflow
+   OPT: -no-autoload-plugins -load-module eva,inout -eva @EVA_CONFIG@ -eva-slevel 100 -cpp-extra-args="-DPTEST " -journal-disable -machdep ppc_32 -no-warn-signed-overflow
 */
 
 #ifndef PTEST
diff --git a/tests/value/redundant_alarms.c b/tests/value/redundant_alarms.c
index cd26fec1a2c7ab4b10c2b944536d16f4ceff23ee..a6b1785cd3d19a218c1a13b55ca62b8bda5344d0 100644
--- a/tests/value/redundant_alarms.c
+++ b/tests/value/redundant_alarms.c
@@ -1,5 +1,5 @@
 /* run.config*
-   OPT: -no-autoload-plugins -load-module inout,scope,slicing,sparecode @EVA_CONFIG@ -eva-warn-copy-indeterminate=-@all,main3 -scope-msg-key rm_asserts -scope-verbose 2 -remove-redundant-alarms -print -slice-threat main1 -then-on 'Slicing export' -print
+   OPT: -no-autoload-plugins -load-module inout,scope,slicing,sparecode @EVA_CONFIG@ -eva-warn-copy-indeterminate=-@all,main3 -scope-msg-key rm_asserts -scope-verbose 2 -eva-remove-redundant-alarms -print -slice-threat main1 -then-on 'Slicing export' -print
  **/
 
 volatile int v;
diff --git a/tests/value/reevaluate_alarms.i b/tests/value/reevaluate_alarms.i
index c0fc49d5b7698af6fe344bb15d79cd2b2d8686c3..9085a0a7185533f1b36bbf543d4b94b45f86db36 100644
--- a/tests/value/reevaluate_alarms.i
+++ b/tests/value/reevaluate_alarms.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: +"-load-module report -report -then -slevel 10"
+   STDOPT: +"-load-module report -report -then -eva-slevel 10"
 */
 
 
diff --git a/tests/value/slevelex.i b/tests/value/slevelex.i
index ed8cb52583d2b6106297347ee22912b246e0d648..2c2546796fb9969c93cfc2ca1e32577ee02f9b91 100644
--- a/tests/value/slevelex.i
+++ b/tests/value/slevelex.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: #"-slevel 5 -slevel-function main:0 -slevel-function gu:21 -slevel-function ginc:21"
+   STDOPT: #"-eva-slevel 5 -eva-slevel-function main:0 -eva-slevel-function gu:21 -eva-slevel-function ginc:21"
 */
 
 volatile int c;
diff --git a/tests/value/split_return.i b/tests/value/split_return.i
index 3873c1b9d225aa0b381b5f54405ac272f630d88f..8cfc8a21a7528455accae9f91f3678fc12e51767 100644
--- a/tests/value/split_return.i
+++ b/tests/value/split_return.i
@@ -1,10 +1,10 @@
 /* run.config*
-   STDOPT: +"-deterministic -eva-no-memexec -slevel-function init:3,main1:3,f2:4,main2:4,f4:3,main5:3,uninit:2,main9:2 -eva-split-return-function f2:0,f3:-2:-4,f4:4,f5:-2,NON_EXISTING:4,uninit:0,escaping:0 -eva-warn-copy-indeterminate=-uninit,-escaping,-main9 -permissive -then -load-module report -report"
-   STDOPT: +"-deterministic -eva-no-memexec -eva -journal-disable -out -input -deps -slevel 6 -eva-split-return auto -eva-split-return-function f7:0:3 -eva-warn-copy-indeterminate=-uninit,-escaping,-main9 -then -load-module report -report"
+   STDOPT: +"-deterministic -eva-no-memexec -eva-slevel-function init:3,main1:3,f2:4,main2:4,f4:3,main5:3,uninit:2,main9:2 -eva-split-return-function f2:0,f3:-2:-4,f4:4,f5:-2,NON_EXISTING:4,uninit:0,escaping:0 -eva-warn-copy-indeterminate=-uninit,-escaping,-main9 -permissive -then -load-module report -report"
+   STDOPT: +"-deterministic -eva-no-memexec -eva -journal-disable -out -input -deps -eva-slevel 6 -eva-split-return auto -eva-split-return-function f7:0:3 -eva-warn-copy-indeterminate=-uninit,-escaping,-main9 -then -load-module report -report"
    COMMENT: below command must fail, as -permissive is not set
-   STDOPT: +"-deterministic -eva-no-memexec -eva -slevel-function NON_EXISTING:4 -eva-warn-copy-indeterminate=-uninit,-escaping,-main9"
-   STDOPT: +"-deterministic -eva-no-memexec -eva -journal-disable -out -input -deps -slevel 6 -eva-split-return full -eva-warn-copy-indeterminate=-uninit,-escaping,-main9"
-   STDOPT: +"-deterministic -eva-no-memexec -eva -journal-disable -out -input -deps -slevel 6 -eva-split-return full -eva-split-return-function f7:0:3 -eva-split-return-function f2:full -eva-warn-copy-indeterminate=-uninit,-escaping,-main9 -then -eva-split-return-function f2:auto"
+   STDOPT: +"-deterministic -eva-no-memexec -eva -eva-slevel-function NON_EXISTING:4 -eva-warn-copy-indeterminate=-uninit,-escaping,-main9"
+   STDOPT: +"-deterministic -eva-no-memexec -eva -journal-disable -out -input -deps -eva-slevel 6 -eva-split-return full -eva-warn-copy-indeterminate=-uninit,-escaping,-main9"
+   STDOPT: +"-deterministic -eva-no-memexec -eva -journal-disable -out -input -deps -eva-slevel 6 -eva-split-return full -eva-split-return-function f7:0:3 -eva-split-return-function f2:full -eva-warn-copy-indeterminate=-uninit,-escaping,-main9 -then -eva-split-return-function f2:auto"
  */
 
 /*@ assigns \result \from \nothing;
diff --git a/tests/value/summary.i b/tests/value/summary.i
index d73b4b42d73532f315dedb80d1c927415566d9eb..8d5d6efd3f583a37f9ef638481739269650a8d07 100644
--- a/tests/value/summary.i
+++ b/tests/value/summary.i
@@ -3,7 +3,7 @@
   STDOPT: +"-eva-msg-key=summary -main minimal"
   STDOPT: +"-eva-msg-key=summary -main bottom"
   STDOPT: +"-eva-msg-key=summary -main main"
-  STDOPT: +"-rte -eva-msg-key=summary -main main"
+  STDOPT: +"-rte -eva-msg-key=summary -main main -slevel 0"
 */
 
 /* Tests the summary on the smallest possible program. */
diff --git a/tests/value/traces/test1.c b/tests/value/traces/test1.c
index b6097db5d277c05f882ffbd7b5794ca3be9eaf55..2eda2c29eb845ca3b7a6c489f0be9bbd3a1b7c14 100644
--- a/tests/value/traces/test1.c
+++ b/tests/value/traces/test1.c
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: #"-eva-domains traces -value-msg-key d-traces -slevel 10 -eva-traces-project" +"-then-last -val -print -value-msg-key=-d-traces"
+   STDOPT: #"-eva-domains traces -eva-msg-key d-traces -eva-slevel 10 -eva-traces-project" +"-then-last -eva -print -eva-msg-key=-d-traces"
 */
 
 extern volatile int entropy_source;
diff --git a/tests/value/traces/test2.i b/tests/value/traces/test2.i
index 506b765112f7299a247614388e37f77a0529ca2e..11d8611c60a21d9fa6a6fa1869ebc776758e2f7b 100644
--- a/tests/value/traces/test2.i
+++ b/tests/value/traces/test2.i
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: #"-eva-domains traces -value-msg-key d-traces -slevel 10 -eva-traces-project" +"-then-last -val -print -value-msg-key=-d-traces"
+   STDOPT: #"-eva-domains traces -eva-msg-key d-traces -eva-slevel 10 -eva-traces-project" +"-then-last -eva -print -eva-msg-key=-d-traces"
 */
 
 
diff --git a/tests/value/traces/test3.i b/tests/value/traces/test3.i
index 80f30b09d39867dbe21a746c0ab0eb775ec9cc98..1878979fbfec0ed04f1df12c27e4377881fa2b30 100644
--- a/tests/value/traces/test3.i
+++ b/tests/value/traces/test3.i
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: #"-eva-domains traces -value-msg-key d-traces -slevel 10 -eva-traces-project" +"-then-last -val -print -value-msg-key=-d-traces"
+   STDOPT: #"-eva-domains traces -eva-msg-key d-traces -eva-slevel 10 -eva-traces-project" +"-then-last -eva -print -eva-msg-key=-d-traces"
 */
 
 int g;
diff --git a/tests/value/traces/test4.i b/tests/value/traces/test4.i
index 5cb5ad20e108eb43f8bd401375b2f9eaa8b35790..ef512f629ee089ba990926f3d9abde6584129e19 100644
--- a/tests/value/traces/test4.i
+++ b/tests/value/traces/test4.i
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: #"-eva-domains traces -value-msg-key d-traces -slevel 10"
+   STDOPT: #"-eva-domains traces -eva-msg-key d-traces -eva-slevel 10"
 */
 
 /* Test of join inside a loop */
diff --git a/tests/value/traces/test5.i b/tests/value/traces/test5.i
index 60775951cadfd3c59496c198156438b766b3451e..d3f122845da8990429ab62d1f98d30ebd81bfb4b 100644
--- a/tests/value/traces/test5.i
+++ b/tests/value/traces/test5.i
@@ -1,5 +1,5 @@
 /* run.config
-   STDOPT: #"-eva-domains traces -value-msg-key d-traces -slevel 10" +"-then-last -val -slevel 10 -print -no-eva-traces-domain"
+   STDOPT: #"-eva-domains traces -eva-msg-key d-traces -eva-slevel 10" +"-then-last -eva -eva-slevel 10 -print -no-eva-traces-domain"
 */
 
 
diff --git a/tests/value/uninit_callstack.i b/tests/value/uninit_callstack.i
index 3c1d29d57655fbf18f9134cfc186dd1b45ace78a..6adb7e5120047524db8d21d776a7d7f5d76c9abc 100644
--- a/tests/value/uninit_callstack.i
+++ b/tests/value/uninit_callstack.i
@@ -1,5 +1,5 @@
 /* run.config*
-   OPT: -no-autoload-plugins -load-module eva -eva @EVA_CONFIG@ -eva-no-show-progress -eva-print-callstacks -journal-disable -no-results
+   OPT: -no-autoload-plugins -load-module eva -eva @EVA_CONFIG@ -eva-no-show-progress -eva-print-callstacks -journal-disable -eva-no-results
 */
 int *p, x;
 
diff --git a/tests/value/widen_on_non_monotonic.i b/tests/value/widen_on_non_monotonic.i
index c20b8bc79102a5e523696f80da4ed5c5508ef0b0..1242896475e2675dda3c994f558ac1da7d0e512c 100644
--- a/tests/value/widen_on_non_monotonic.i
+++ b/tests/value/widen_on_non_monotonic.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: #"-slevel 20"
+   STDOPT: #"-eva-slevel 20"
 */
 
 /* Problem with Value's memory model, that does not guarantee that we call